【问题标题】:Unable to create and display linked list in C无法在 C 中创建和显示链表
【发布时间】:2021-10-13 20:57:14
【问题描述】:

我想创建整数链表并显示。假设有 3 个节点,其值为 11,22,33 。但是当我显示它时,它只打印第一个值,即 11 。出了什么问题?

注意: 要创建和显示链表,head 和 p 节点变量是否足够或者必须取 3 个节点指针变量。即 head , p 和 q 也是?

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

typedef struct node
{

        int data;
        struct node *next;
}node;

int main()
{
        int i, j, num, value;
        node *p = NULL;
        node *head = NULL;

        printf("how many nodes\r\n");
        scanf("%d",&num);
        for(i = 0 ;i < num ; i++)
        {
                printf("enter node %d =  ",i+1);
                scanf("%d",&value);
                p = (node *)malloc(sizeof(node));
                p->data = value;
                p->next = NULL;
                if(head == NULL)
                {
                        head  = p;
                }
        }
  printf("linked list formed is \r\n");

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

        return 0;
}

【问题讨论】:

  • 在扫描后的第一个for循环中,您没有将节点与之前的节点连接
  • @susanth29 我不明白如何连接它们。要创建和显示链表,head 和 p 节点变量是否足够,或者必须取 3 个节点指针变量。即 head , p 和 q 也是?
  • 单独保存最后添加的元素,然后相应地添加新元素。
  • 为什么你认为它不应该只打印 11?

标签: c linked-list


【解决方案1】:

您通过不断更新挂起下一个节点的目标点,按输入顺序构建一个正向链表。

  • 最初该指针是head 指针。
  • 下一个节点将挂在前一个节点的next 指针上。
  • 完成后,最后一个 next 指针设置为 NULL,您就完成了。

这听起来可能很复杂,但使用指针对指针使算法出奇地简单、高效,并且不需要特殊乏味的情况来测试只会为真一次的空头指针。包括添加错误检查

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

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

int main()
{
    node *head = NULL;
    node **pp = &head;

    int num;
    printf("how many nodes\r\n");
    if (scanf("%d", &num) == 1 && num > 0)
    {
        for (int i=0; i<num;)
        {
            int value;
            printf("enter node %d =  ", i+1);
            if (scanf("%d", &value) == 1)
            {
                *pp = malloc(sizeof **pp);
                if (*pp == NULL)
                {
                    perror("Failed to allocate new list node");
                    exit(EXIT_FAILURE);
                }

                // hang the new node
                (*pp)->data = value;

                // setup pp to hold address of next pointer
                //  to populate on the next iteration.
                pp = &(*pp)->next;

                // next node
                ++i;
            }
            else
            {
                int c;
                while ((c = fgetc(stdin)) != EOF && c != '\n');
            }
        }
        // terminate the list
        *pp = NULL;
    }
    printf("linked list formed is:\n");

    for (const node *p = head; p != NULL; p = p->next)
    {
        printf(" p->data = %d\n", p->data);
    }

    // free the list
    while (head)
    {
        node *p = head;
        head = head->next;
        free(p);
    }

    return 0;
}

样本运行

how many nodes
5
enter node 1 =  1
enter node 2 =  3
enter node 3 =  5
enter node 4 =  7
enter node 5 =  9
linked list formed is:
 p->data = 1
 p->data = 3
 p->data = 5
 p->data = 7
 p->data = 9

【讨论】:

    【解决方案2】:

    您只是第一次更新头部而不是创建任何链接 请在下面找到固定代码

    
    #include <stdio.h>
    #include<stdlib.h>
    
    typedef struct node
    {
              int data;
              struct node *next;
    }node;
    
    int main()
    {
      int i, j, num, value;
      node *p = NULL;
      node *head = NULL;
    
      printf("how many nodes\r\n");
      scanf("%d",&num);
      for(i = 0 ;i < num ; i++)
      {
        printf("enter node %d =  ",i+1);
        scanf("%d",&value);
        p = (node *)malloc(sizeof(node));
        p->data = value;
        p->next = NULL;
    
        // Form links
        p->next  = head;
        head = p;
    
      }
      printf("linked list formed is \n");
    
      for(p = head ; p != NULL ; p = p->next)
      {
        printf("%d ",p->data);
      }
      printf("\n");
    
    
      // Freeing memory to avoid mem leaks
      for(p = head ; head != NULL ; head = head->next)
      {
        p = head;
        free(p);
      }
      return 0;
    }
    
    

    您可以参考我的库以获取更通用的 link_list 实现

    【讨论】:

    • 那是因为我们正在向 Head /begining 添加元素
    • 那么我认为我们应该使用另一个指针 q 以正确的顺序创建列表。
    【解决方案3】:

    Mohammed Meraj 更改代码以按正确顺序创建列表。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node{
        int data;
        struct node *next;
    }node;
    
    int main()
    {
      int i, num, value;
      node *p = NULL;
      node *head = NULL;
      node *q = NULL;
    
      printf("how many nodes\r\n");
      scanf("%d",&num);
      for(i = 0 ;i < num ; i++)
      {
        printf("enter node %d =  ",i+1);
        scanf("%d",&value);
        p = (node *)malloc(sizeof(node));
        p->data = value;
        p->next = NULL;
    
        // Form links
        if(!q) head = q = p;
        else{ q->next = p; q = p; }
      }
      printf("linked list formed is \n");
    
      for(p = head ; p != NULL ; p = p->next)
      {
        printf("%d ",p->data);
      }
      printf("\n");
    
      // Freeing memory to avoid mem leaks
      while(head != NULL)
      {
        p = head;
        head = head->next;
        free(p);
      }
      return 0;
    }
    
    

    如果你想做只有head和p的代码,也可以这样做

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node{
        int data;
        struct node *next;
    }node;
    
    int main()
    {
      int i, num, value;
      node *p = NULL;
      node *head = NULL;
    
      printf("how many nodes\r\n");
      scanf("%d",&num);
      for(i = 0 ;i < num ; i++)
      {
        printf("enter node %d =  ",i+1);
        scanf("%d",&value);
        if(!head){
          head = (node *)malloc(sizeof(node));
          head->data = value;
          head->next = NULL;
          p = head;
        }else{
          p->next = (node *)malloc(sizeof(node));
          p->next->data = value;
          p->next->next = NULL;
          p = p->next;
        }
      }
    
      printf("linked list formed is \n");
    
      for(p = head ; p != NULL ; p = p->next)
      {
        printf("%d ",p->data);
      }
      printf("\n");
    
      // Freeing memory to avoid mem leaks
      while(head != NULL)
      {
        p = head;
        head = head->next;
        free(p);
      }
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2020-05-14
      • 2020-01-26
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多