当我打印链表时,我得到运行时错误
#include stdio.h
#include stddef.h
typedef struct
{
int info;
struct DEMO1 *next;
} DEMO1;
void insertatlast(DEMO1 * p, int o);
void printl(DEMO1 * p);
int main()
{
int temp;
DEMO1 *head = NULL;
if (head == NULL)
while (1)
{
printf("ENTER 0 to exit");
scanf("%d", &temp);
if (temp == 0)
break;
insertatlast(head, temp);
}
printl(head);
return 0;
}
void insertatlast(DEMO1 * head, int data)
{
if (head == NULL)
{
DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));
node->info = data;
node->next = 0;
head = node;
}
else
{
DEMO1 *temp;
temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));
node->info = data;
node->next = 0;
temp->next = node;
}
}
void printl(DEMO1 * head)
{
DEMO1 *temp;
temp = head;
printf("%d", temp->info);
while (temp != NULL)
{
printf(":) %d\n", temp->info);
temp = temp->next;
}
}
答案 0 :(得分:0)
当head
为NULL时,head
仅在insertatlast()
函数中更改,而不在main()
中更改。 return head
也head
更新了main()
。
DEMO1* insertatlast(DEMO1 * head, int data)
{
if (head == NULL)
{
DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));
node->info = data;
node->next = 0;
head = node;
}
else
{
DEMO1 *temp;
temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));
node->info = data;
node->next = 0;
temp->next = node;
}
return head;
}
int main()
{
int temp;
DEMO1 *head = NULL;
if (head == NULL)
while (1)
{
printf("ENTER 0 to exit");
scanf("%d", &temp);
if (temp == 0)
break;
head=insertatlast(head, temp);
}
printl(head);
return 0;
}
答案 1 :(得分:0)
编译时(在<>
中修复丢失的#include
之后,您可以从编译器中读取一些警告 - 希望您已启用警告。即使它们无法解决您的问题,看看它们是个好习惯。
像
这样的行 DEMO1 *head = NULL;
if (head == NULL)
应该建议你做错了什么。 if-body执行的事实,当你调用insertatlast
时,单独告诉你头是NULL。没关系,你期待它。您可能不期望的是,head
调用未对insertatlast
进行修改:因此当您调用printl
时,head仍为NULL,并且打电话
`printl(NULL);`
是有问题的,因为
temp = head;
... temp->info ...
我想有人告诉你,如果你想在调用者中修改变量的值,你必须传递一个指向该变量的指针,而且由于你已经有了指针,你会感到困惑。
事实是,指针也是一个变量,如果你需要修改它,你必须获取指针指针。
DEMO1* head = NULL;
//...
insertatlast(&head, temp);
并且插入的原型将是
void insertatlast(DEMO1 **head, int data);
然后,您使用DEMO1*
修改调用者变量(*head
),访问它等等(不要忘记在insertatlast
头部有类型{{1} }},所以DEMO1**
的类型为*head
}。
不要施放DEMO1*
返回值;在C
malloc
就足够了。