链表程序无法正常运行

时间:2019-09-06 16:08:45

标签: c struct linked-list append singly-linked-list

给定程序未显示链接列表的所有元素。 我在识别错误​​时遇到问题。

首先,我使用空值初始化头,然后创建一个临时变量,并为其分配一个整数值和指向下一个节点的指针。 然后,我创建了另一个名为temp1的节点并将其与头部链接。 仅当“ i”等于1时才会链接。

然后将temp1等同于下一个节点,并执行相同的操作。

//链接列表 //插入节点。

#include <stdio.h>

struct node
{
    int n;
    struct node *next;
};

struct node *head;

int main ()
{
    int i, s, x, y;
    i = 0;
    struct node *temp;
    struct node *temp1;
    struct node *cur;
    head = NULL;
    scanf ("%d", &s);     //No. of nodes.
    while (i < s)
    {
        scanf ("%d", &x);
        if (head == NULL)
        {
            temp = (struct node *) malloc (sizeof (struct node));
            temp->n = x;
            temp->next = NULL;
            head = temp;
        }
        else
        {
            temp = (struct node *) malloc (sizeof (struct node));
            temp->n = x;
            temp->next = NULL;
            temp1 = temp;
            if (i == 1)
            {
                head->next = temp1;
            }
            temp1 = temp1->next;  //Assigning the next node.i.e. NULL value
        }
        i = i + 1;
    }
    cur = head;
    while (cur != NULL)
    {
        printf ("%d", cur->n);
        cur = cur->next;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

检查以下更改的部分

    {
      temp = (struct node *) malloc (sizeof (struct node));
      temp->n = x;
      temp->next = NULL;
      head = temp;
      temp1 = head;
    }
      else
    {
      temp = (struct node *) malloc (sizeof (struct node));
      temp->n = x;
      temp->next = NULL;
      temp1->next = temp;
      temp1 = temp1->next;  //Assigning the next node.i.e. NULL value
    }

而不是依靠

   if (i == 1) {
      head->next = temp1;
   }

我在创建头像时在head上分配了temp1,这是第一次发生。

您的else部分还存在一些关联问题。

答案 1 :(得分:1)

您将丢失前两个节点之外的节点,因为您从未将它们链接到列表。为变量使用有意义的名称:将temp1重命名为tail,并在开始时将其初始化为NULL。然后循环体变为:

if (scanf(" %d", &x) != 1) {
    // FIXME: handle error
}
temp = malloc(sizeof(*temp));
temp->n = x;
temp->next = NULL;
if (tail == NULL) {
    head = temp;
} else {
    tail->next = temp;
}
tail = temp;
++i;

(未经测试。)

合理的价格:您想将新节点添加到列表的末尾(尾部)。最简单的方法是在一个适当命名的变量中跟踪尾部,并简单地将每个节点链接到tail->next,而不是像检查节点数之类的复杂逻辑。唯一的特殊情况是空列表,也就是说,headtail都是NULL,而且区别只是一行,所以不要复制整个代码块来设置新节点。

答案 2 :(得分:0)

对于初学者,您必须包含标题<stdlib.h>

问题出在这句话

temp1 = temp;

如果i不等于1,则在此语句之后

temp1 = temp1->next;

temp1等于NULL

因此所有其他节点都没有添加到列表中,因为存在循环

temp1 = temp;
//...
temp1 = temp1->next;

按以下方式更改循环

  while (i < s)
    {
      scanf ("%d", &x);
      if (head == NULL)
    {
      temp = (struct node *) malloc (sizeof (struct node));
      temp->n = x;
      temp->next = NULL;
      head = temp;
      temp1 = head;
    }
      else
    {
      temp = (struct node *) malloc (sizeof (struct node));
      temp->n = x;
      temp->next = NULL;
      temp1->next = temp;
      temp1 = temp;
    }
    i++;
    }

请注意,应在使用变量的块范围内声明变量。否则程序将无法读取。

您使用的方法可以称为Java方法。

在C语言中,程序看起来更简单。例如

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

struct node
{
  int n;
  struct node *next;
};

struct node *head;

int main( void )
{
    struct node **temp = &head;

    size_t n = 0;

    scanf( "%zu", &n );

    for ( size_t i = 0; i < n; i++ )
    {
        *temp = (struct node *) malloc ( sizeof ( struct node ) );

        int value = 0;

        scanf ( "%d", &value);

        ( *temp )->n = value;
        ( *temp )->next = NULL;

        temp = &( *temp )->next;
    }

    for ( struct node *cur = head; cur != NULL; cur = cur->next )
    {
        printf ("%d -> ", cur->n );
    }
    puts( "NULL" );

    return 0;
}

其输出可能看起来像

1 -> 2 -> 3 -> NULL