【问题标题】:linked list create and display链表创建和显示
【发布时间】:2021-01-15 08:53:31
【问题描述】:

我的链表代码没有打印最后一个节点,你能帮我解决我的错误吗 我试过做而它不起作用 我不想让头节点分开因此请不要告诉我更改整个代码 我如何释放整个代码的分配内存 最后我如何使用递归进行显示

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

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

 int create(int n);

 void display(node* head);

int main()
{
int n;
node* HEAD = NULL;
scanf("%d",&n);
HEAD=create(n);
display(HEAD);
return 0;
}

int create(int n)
{
int i;

node * head=NULL;
node * temp=NULL;
node * p = NULL;

for(i=0;i<n;i++)
{
    temp =(node*)malloc(sizeof(node));
    scanf("%d",&(temp->data));
    temp->next= NULL;

    if(head==NULL)
    {
        head=temp;
    }
    else
    {
        p=head;
        while(p->next != NULL)
        {
            p=p->next;
        }
          p->next=temp;
      }
  }
  return head;
}

void display(node* head)
{
    node* p= head;

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

}

【问题讨论】:

  • 我不确定打印最后一个节点是否会出现问题,但请考虑在 display() 中为只有一个元素的列表打印什么(即当 head->next == NULL 时)。
  • 您应该真正注意编译器发出的消息。如果它说“警告”,则表示您做错了,下次您的计算机可能会爆炸。

标签: c function linked-list


【解决方案1】:

在 while 循环中的条件失败时,您还没有检查您所在的最后一个节点。您在最后一次迭代结束时取消了对它的引用,但您从未打印过里面的数据。一个快速的解决方法是在循环退出后打印当前节点的数据:

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

这也将解决您的问题评论中提出的问题。当然,在执行此操作之前,您仍要确保列表不为空。

【讨论】:

    【解决方案2】:

    考虑单节点链表的情况。 Head->next 将评估为 NULL。并且不会显示 Head 的值。要解决此问题,请向上移动 printf 语句。

    编辑:您还必须确保 HEAD 不为空,否则如果您进行更改,您的代码仍然会失败

    void display(node* head)
    {
        node* p= head;
    
        while(p->next != NULL)
        {
        printf("\n data: %d",p->data);
        p=p->next;
        }
    
    }
    

    【讨论】:

    • 见上面的答案,它考虑了空列表边缘情况
    【解决方案3】:

    问题是你的情况,你需要将while(p-&gt;next != NULL)更改为while(p != NULL)。 这样做的原因是因为您的指针位于最后一个元素上,但您正在检查他的下一个元素。 另一件事,将int create(int n) 更改为node * create(int n)。您正在返回指针,而不是 int 参数。

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 2011-03-06
      • 1970-01-01
      • 2014-08-18
      • 2018-10-02
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多