指针C中的N链表

我写了下面的代码不起作用。 应用程序在打印方法上崩溃。 知道哪里出错了吗?

#include  #include  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));