1

我刚刚开始学习 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;
}

对于 4 的输入,预期的输出应该是 0->1->2->3->5->6

但相反,我得到 0->1->2->3->(一些垃圾值)->5

如果有人能指出我的错误和/或链接到任何可能有助于我清楚地理解该主题的文章,我会很高兴。

提前致谢。

4

2 回答 2

2

我已经重构了你的代码。你可以在这里看到它:http: //ideone.com/nZ55i

  1. 你的代码很丑,所以我把它调整成了我自己的风格。我建议你找一个你喜欢的风格,那是你容易阅读的。
  2. 将 head 的声明移到 main 方法中(以前是全局变量)
  3. 无缘无故采用指针对指针类型的函数已被修改为采用指针。
  4. 您至少在 3 个地方使用了 malloc(sizeof(struct node)),所以我刚刚创建了一个函数来为您完成它。
  5. 在节点结构的声明中添加了 typedef,您现在可以声明它的实例node derp;
  6. create函数使用带有空条件和中断的 for 循环,重构为使用没有中断的正确 for 循环
  7. 垃圾值是由 create 函数中的错误引起的,该错误阻止它将值写入它创建的最后一个节点。为了解决这个问题,我移动了一些东西,所以它总是分配data字段,但如果它在末尾则不分配新节点
  8. 未能写入列表中的最后一项是由于显示函数中的错误导致它在显示最后一个节点之前终止。

如果这是一个家庭作业问题并且你交出我的代码,我会找到你,开车到你家,用大炮从你卧室的窗户射出一个烂土豆。

于 2012-08-21T18:13:04.880 回答
1

好的,我开始将它放在评论中,但将代码放在评论中会得到砖块:)。这未经测试,并且有无数种方法可以解决它(假设我已经正确诊断出问题:)),但是提供了一种可能可以解决您的 create 方法的方法:(请注意,我已经简化了您的循环,仅使用“for”循环构造的正常终止条件,并消除循环中不再需要的“if..break”。“->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;
    }
}
于 2012-08-21T18:12:20.147 回答