C - 链表程序无法正常运行



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

起初,我用 null 值初始化了 head,然后创建了一个临时变量,并为其分配了一个整数值和指向下一个节点的指针。 然后我制作了另一个名为 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;
}

检查以下更改的部分

{
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;
}

我在创建头部时temp1分配head,这只意味着第一次发生。

您的else部分也存在一些链接问题。

您将丢失前两个以外的节点,因为您永远不会将它们链接到列表。对变量使用有意义的名称:将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,区别只是一行,所以不要复制整个代码块来设置新节点。

对于初学者,您必须包含标题<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

相关内容

  • 没有找到相关文章

最新更新