我刚开始学习C并且相当初学者。 今天在学校我们学习了链表,我能够提出一个代码......幸运的是,它运行没有错误。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
}*head;//*temp;
void create(struct node **h,int num)
{
int i;
struct node *temp=*h;
for(i=0;;i++)
{
if(i>=num)
break;
temp->data=i;
temp->next=malloc(sizeof(struct node));
temp=temp->next;
}
temp->next=NULL;
}
void display(struct node **h)
{
struct node *temp=*h;
while(temp->next!=NULL)
{
printf("%d->",temp->data);
temp=temp->next;
}
printf("\b\b \b\b");
}
void append_end(struct node **h,int val)
{
struct node *temp=*h,*temp1;
//printf("'%d'",val);
while(temp->next!=NULL)
temp=temp->next;
temp1=malloc(sizeof(struct node));
temp1->data=val;
temp1->next=NULL;
temp->next=temp1;
}
void free_list(struct node **h)
{
struct node *temp=*h,*tail;
while(temp->next!=NULL)
{
tail=temp;
temp=temp->next;
free(tail);
}
h=NULL;
}
int main()
{
head=malloc(sizeof(struct node));
int i,num;
scanf("%d",&num);
create(&head,num);
//display(&head);
append_end(&head,5);
append_end(&head,6);
display(&head);
/*temp=head;
while(temp->next!=NULL)
temp=temp->next;
printf("%d",temp->data);*/
free_list(&head);
return 0;
}
预期的输出应该是 0→1→2→3→5→6 输入4
但相反,我得到了 0-> 1-> 2-> 3->(一些垃圾值) - > 5
如果有人可以指出我的错误,并且/或链接到任何可能有助于我清楚理解该主题的文章,我会很高兴。
提前致谢。
答案 0 :(得分:2)
我重构了你的代码。你可以在这里看到它:http://ideone.com/nZ55i
node derp;
create
函数使用带有空条件和中断的for循环,重构为使用正确的for循环而没有中断data
字段但是如果它在最后则不分配新节点如果这是一个家庭作业问题并且你交了我的代码,我会找到你,开车到你的房子,然后用你的大炮在卧室的窗户上拍一个腐烂的土豆。
答案 1 :(得分:1)
好的,我开始把它放在评论中,但是将代码放在评论中会得到砖块:)。这是未经过测试,并且有很多方法可以接近它(鉴于我已经正确地诊断出问题:)),但是可以通过以下方式提供修复创建方法的一种方法:请注意,我已经简化了你的循环,只是使用'for'循环结构的正常终止条件,并消除了循环中的'if..break',因为它不再需要。“ - &gt; next”成员将如果还有一个要创建,则始终初始化为新成员,否则为NULL,因此我们不需要结束赋值:
void create(struct node **h,int num)
{
int i;
struct node *temp=*h;
for(i=0;i<num;i++)
{
temp->data=i;
if (i==(num-1))
temp->next=NULL;
else
temp->next=malloc(sizeof(struct node));
temp=temp->next;
}
}