给定程序未显示链接列表的所有元素。 我在识别错误时遇到问题。
首先,我使用空值初始化头,然后创建一个临时变量,并为其分配一个整数值和指向下一个节点的指针。 然后,我创建了另一个名为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;
}
答案 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
,而不是像检查节点数之类的复杂逻辑。唯一的特殊情况是空列表,也就是说,head
和tail
都是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