#include<stdio.h>
#include<stdlib.h>
typedef struct _listnode
{
int item;
struct _listnode* next;
}Listnode;
void printlist(Listnode *head);
void main(){
Listnode *head, *temp;
int i = 0;
head = malloc(sizeof(Listnode));
temp = head;
for(;i<3;i++){
temp->item = i;
if (i != 2){
temp->next = malloc(sizeof(Listnode));
temp = temp->next;
}
else
temp = NULL;
}
printlist(head);
}
void printlist(Listnode *head){
if (head == NULL)
printf("Your list is empty");
while(head != NULL){
printf(" %d ",head->item);
head = head->next;
}
printf(" \n ");
}
Output:
0 1 2
然后它显示以下消息
有人能告诉我到底发生了什么吗?任何帮助将不胜感激。谢谢
最好的问候
答案 0 :(得分:0)
创建列表时,永远不会将最终链接指针设置为NULL。你可以将temp设置为null,可能你想要设置temp-&gt;而不是null。
在每次交易后将列表保持在有效状态会更加“健壮”。现在,您依赖于循环内的if语句将最后一次迭代转换为“结束列表”操作而不是“添加到列表”。如果有人要更改for循环限制而不更改if语句以匹配,则会再次返回到损坏的列表。尝试这样的事情:
Listnode *head = NULL; /* start with an empty list */
Listnode *tail = NULL;
for (i=0; i<3; ++i)
{
ListNode *temp = malloc(sizeof(Listnode));
temp->item = i;
temp->next = NULL;
if (head == NULL)
head = tail = temp;
else
{
tail->next = temp;
tail = temp;
}
}
循环中仍然有一个if语句,但它很有启发性。循环体是你如何编写一个函数来将一个新的列表条目推送到单链表的末尾。同时保持头部和尾部指针可以提高效率,避免循环找到列表的末尾。
关键在于无论循环如何被修改,循环每次迭代都会添加一个条目,并且列表在每次迭代结束时都有效。