[英]pointers N linked list in C
我写了下面的代码不起作用。 应用程序在打印方法上崩溃。 知道哪里出错了吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int item;
struct LinkedList *Next;
} LinkedList;
int main()
{
LinkedList vaz;
vaz.item = 14123;
vaz.Next = 0;
add(&vaz,123);
add(&vaz,9223);
Print(&vaz);
return 0;
}
void Print(LinkedList* Val)
{
if(Val != 0){
printf("%i\n",(*Val).item);
Print((*Val).Next);
}
}
void add(LinkedList *Head, int value)
{
if((*Head).Next == 0 )
{
LinkedList sab;
sab.item = value;
sab.Next = 0;
(*Head).Next = &sab;
}
else{
add((*Head).Next,value);
}
}
您的add方法应该动态分配内存,您正在使用自动分配( 局部变量 ),当您“离开”该函数时会释放该内存。 当您稍后尝试访问此内存时,这将导致未定义的行为。
void add(LinkedList *Head, int value)
{
if((*Head).Next == 0 )
{
LinkedList sab; <-- need to be allocated dynamically
sab.item = value;
sab.Next = 0;
(*Head).Next = &sab;
}
else{
add((*Head).Next,value);
}
}
您没有将堆内存分配给您创建的“链接”列表。 我认为将元素添加到链表时应该在堆上分配内存。 链表变量'sab'是方法的局部变量,因此,一旦函数超出范围,内存将被释放。
要添加元素,您需要执行以下操作:
LinkedList *sab = (struct LinkedList*) malloc (sizeof(struct LinkedList));
if( sab != NULL )
{
sab->item = value;
sab->next = NULL;
}
有关更多详细信息,请参见: http : //www.cprogramming.com/snippets/source-code/singly-linked-list-insert-remove-add-count
add
应该动态分配内存,如下所示:
void add(LinkedList *Head, int value)
{
if (Head == NULL)
return;
if((*Head).Next == NULL )
{
LinkedList *sab = malloc(sizeof(LinkedList));
if ( sab == NULL ) {
// Error: ran out of memory (really shouldn't happen, but could)
return;
}
(*sab).item = value;
(*sab).Next = NULL;
(*Head).Next = sab;
}
else{
add((*Head).Next,value);
}
}
同样,在这种情况下,递归调用是“过度杀伤”。 一个简单的循环就足够了:
void add(LinkedList *Head, int value)
{
if (Head == NULL)
return;
while ((*Head).Next != NULL)
Head = (*Head).Next;
LinkedList *sab = malloc(sizeof(LinkedList));
if ( sab == NULL ) {
// Error: ran out of memory (really shouldn't happen, but could)
return;
}
(*sab).item = value;
(*sab).Next = NULL;
(*Head).Next = sab;
}
我同样希望避免递归打印:
void Print(LinkedList* Val)
{
while (Val != NULL) {
printf("%i\n", (*Val).item);
Val = (*Val).Next;
}
}
如果你有一个函数,从列表中删除的项目,你需要确保你做一个free
的指针指向已移除该项目。
您的LinkedList *Head
没有任何内存,如下所示,首先为其分配内存-
LinkedList *Head = (struct LinkedList*)malloc(sizeof(struct LinkedList));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.