我写了下面的代码,它不起作用。应用程序在打印方法上崩溃。 知道哪里出错了吗?
#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);
}
}
答案 0 :(得分:2)
你的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);
}
}
答案 1 :(得分:1)
您没有将堆内存分配给您创建的链接列表。我认为在向链表添加元素时应该在堆上分配内存。链表变量'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
答案 2 :(得分:1)
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
。
答案 3 :(得分:1)
您的LinkedList *Head
没有任何内存首先为其分配内存,如下所示 -
LinkedList *Head = (struct LinkedList*)malloc(sizeof(struct LinkedList));