c-如何通过在末尾添加节点来创建链表



我编写了一个程序,询问用户是否要在链表中插入一个新节点(插入末尾(,然后打印整个链表。每当用户输入值0时,程序就会停止并打印链接列表。

这是代码:

#include <stdlib.h>
#include <stdio.h>
struct ListNode
{
   int  data;
   struct   ListNode    *next;
};
int main()
{
    int     val,
            flag = 1;
struct  ListNode    *p,
                    *head,
                    *temp;
                    
printf("press 0 to exitn");
do
{
    printf("enter the data : ");
    scanf("%d", &val);
    
    p = (struct ListNode *)malloc(sizeof(struct ListNode));
    
    if(head == NULL)
    {
        p -> data = val;
        p -> next = NULL;
        head = p;
        temp = p;
    }
    else
    {
        p -> data = val;
        p -> next = NULL;
        temp -> next = p;
    }
    
    printf("continue?");
    scanf("%d", &flag);
 }while(flag != 0);
 temp = head;
 while(temp != NULL)
 {
    printf("%d -> ", temp -> data);
    temp = temp -> next;
 }
 printf("n");
 return 0;
 }

现在,我在输出中遇到的问题是,它只打印第一个和最后一个节点。中间的其他节点不会打印。

以下是输出示例:

编号:12 13 14 15

输出:12 15

有人能向我解释一下我哪里错了吗?我总是可以把整件事放在一个函数中并执行,但现在我想在不使用函数调用的情况下尝试同样的方法。

在下面的if-else块中,

 if(head == NULL)
    {
        p -> data = val;
        p -> next = NULL;
        head = p;
        temp = p;
    }
    else
    {
        p -> data = val;
        p -> next = NULL;
        temp -> next = p;
    }

最初,当head为NULL时,将headtemp都分配给p。所以,temp指向第一个元素。之后,每次获得新元素时,都会将temp->next重新分配给该新元素,而不更新temp。实际上,您每次都在分配head->next。要更正此问题,您需要每次更新temp

if(head == NULL)
    {
        p -> data = val;
        p -> next = NULL;
        head = p;
        temp = p;
    }
    else
    {
        p -> data = val;
        p -> next = NULL;
        temp -> next = p;
        temp = p;
    }

在声明head时,您还需要将其初始化为NULL,因为默认情况下C中的局部变量不会进行初始化。

只有在创建第一个节点时,才将当前节点(即p(存储在temp中。

你需要修改的这个代码片段

if(head == NULL)
    {
        p -> data = val;
        p -> next = NULL;
        head = p;
        temp = p;
    }
    else
    {
        p -> data = val;
        p -> next = NULL;
        temp -> next = p;
    }

if(head == NULL)
    {
        p -> data = val;
        p -> next = NULL;
        head = p;
        temp = p;
    }
    else
    {
        p -> data = val;
        p -> next = NULL;
        temp -> next = p;
       temp=p;
    }

现在它会很好用的。在while循环的每次迭代之后,您需要将指向当前节点p的指针存储在temp中。

存在以下问题:

  1. 如BLUEPIXY在评论中所述,head未初始化。

    struct  ListNode    *p,
                        /* *head, */ // ISSUE: head not initialized
                        head = NULL,  
                        *temp;
    
  2. 添加额外节点时,您没有更新temp

     else
    {
        p->data = val;
        p->next = NULL;
        temp->next = p;
        temp = p;       // NEED to update temp
    }
    

此外,不需要对malloc的结果进行强制转换。

此外,建议通过检查其返回值来检查malloc是否成功。比如,在这种情况下:

p = malloc(sizeof(struct ListNode));
if (p == NULL) {
    /* malloc failed. Code to handle the error */
}

相关内容

  • 没有找到相关文章

最新更新