【问题标题】:Why can't I display the correct list values?为什么我不能显示正确的列表值?
【发布时间】:2012-10-17 18:38:47
【问题描述】:

为了检查示例列表实施,我尝试了以下代码。但是每当我试图显示结果时,它就会进入一个循环。我找不到哪里出错了。

#include<stdio.h>
#include<stdlib.h>

typedef struct linkedlist
{
    int data;
    struct linkedlist *next;
}node;

int main()
{
    int ch,num;

    node *head=NULL;
    head=(node *)malloc(sizeof(node));
    node *new=NULL;
    new=(node *)malloc(sizeof(node));
    node *temp=NULL;
    temp=(node *)malloc(sizeof(node));
    printf("\n1.Insert to list");
    printf("\n3.Display the list");
    printf("\n Enter Choice->");
    scanf("%d",&ch);
    switch(ch)
    {
     case 1:printf("\n Enter data->");
            scanf("%d",&num);
            new->data=num;
            new->next=NULL;
            head->next=new;
            break;

     case 3: temp=head;
            while(temp!=NULL)
            {
                printf("\n %d",temp->data);
                temp=temp->next;
            }


                break;
     default:printf("Wrong Choice");
              break;

    }
    return 0;
 }

【问题讨论】:

    标签: c list linked-list


    【解决方案1】:

    这里有两个错误。

    1. 您只分配“新”一次。这意味着每次用户输入“1”并实际将其链接到自身时,您都在重用同一个节点。
    2. 您根本不应该为“temp”分配节点,因为您没有使用它。您实际上正在使用以下行丢失指向该分配节点的指针:case 3: temp=head; 这称为“内存泄漏”。

    我建议你多研究指针;他们似乎让你感到困惑。

    【讨论】:

    • 但是每次用户按 1 时,我猜都会创建并链接新的“新”节点。如果它没有像我想的那样发生,那么每次用户按 1 时如何创建新节点?
    • 实际创建新节点的代码是malloc(sizeof(node))调用。
    【解决方案2】:

    为什么我觉得这是一道作业题?

    这里有一些提示:

    1. head 已分配,但从未初始化,这是您开始打印的地方。坦率地说,我很惊讶它没有崩溃。

    2. 您的菜单允许您打印列表或输入一个数字,然后程序结束。我怀疑您正在输入一个数字,然后再次运行该程序以打印出该列表。运行之间不会保留程序状态。

    【讨论】:

      【解决方案3】:

      我可以看到以下问题:

      1) 您没有循环使用选项,因此用户在每次运行程序时只能做一件事(插入或显示)。如果他选择插入,他将无法显示,如果他选择显示,则没有任何列表可显示。

      2) 每次要在列表中插入新节点时,都需要创建一个新节点。目前您只是在更改同一节点的数据(由 new 指向)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 2012-08-31
        • 2022-07-16
        相关资源
        最近更新 更多