C语言 链表(添加和打印)出现问题



我对数据结构太新了,实际上我昨天就开始了。这是代码:

#include <stdio.h>
#include <stdlib.h>
struct node
{
int x;
node *next;
};
void addToList(node *r, int a);
void printList(node *r);
int main()
{
node *root;
root = NULL;
for (int i = 0; i < 5; i++)
{
int a;
scanf("%d", &a);
addToList(root, a);
}
printList(root);
return 0;
}
void addToList(node *r, int a)
{
while (r != NULL)
r = r -> next;
r = (node *)malloc(sizeof(node));
r -> x = a;
r -> next = NULL;
}
void printList(node *r)
{
while (r != NULL)
{
printf("%d ", r -> x);
r = r -> next;
}
printf("n");
}

我希望程序将新的 5 个元素放入列表中,然后打印它们。但是程序结束时什么也没发生。我的错是什么?

问题出在addToList()函数上。如果要更新列表的根节点,则必须像这样定义函数:

void addToList(node **r, int a)

否则,您将指针发送到root并在函数内执行任何操作。但这并不影响rootmain()的价值,它仍然是NULL

如果要更改指针的值,则必须从main()发送指向函数 ==>addToList(&root, a);的指针地址。

所以现在我们可以更新root指向的位置。但这还不够,因为您希望root始终指向列表的开头==>您只想在第一次调用addToList()时更新它。

最后一个问题是将新创建的节点添加为列表中的最后一个节点。您可以通过保存指向最后一个节点的临时指针来执行此操作。在代码中查看我的注释(用<<<标记我的更改(:

void addToList(node **root, int a)                   <<<
{
node *r = *root;                                 <<<
node *last = NULL;                               <<<
while (r != NULL) {
last = r;                                    <<<
r = r -> next;
}
r = (node *)malloc(sizeof(node));
r -> x = a;
r -> next = NULL;
if (last == NULL) {                              <<<
// this is true only on the first call to
// addToList, so we update root only once
*root = r;
} else {
// all other times we add the new node to be the last one
last->next = r;
}
}

您有root = NULL但您的addtoList函数检查是否root !=NULL。因此,测试在那里失败,并且没有添加任何内容。 你应该有这样的东西:

void addToList(node *r, int a) {
struct node *temp;
temp=(struct node *)malloc(sizeof(struct node));
temp->data = a;
if (r== NULL) {
r = temp;
r->next = NULL;
}
else {
temp->next = r;
r = temp;
}
}

在这里,第一个错误是你没有将*root指针变量作为全局变量,所以每当插入新节点时,它都不会更新*root的值。它将保持*root的值为NULL

下面的代码中有注释,它将非常轻松地解释您犯的各种错误。

#include <stdio.h>
#include <stdlib.h>
struct node
{
int x;
node *next;
};
node *root;     //Declaring the *root as global
void addToList(int a);
void printList();
//removing the *root as parameter from both the functions
int main()
{
root = NULL;
for (int i = 0; i < 5; i++)
{
int a;
scanf("%d", &a);
addToList(a);
}
printList();
return 0;
}
void addToList(int a)
{
//Declaring a temporary pointer(*temp) to avoid the value loss of the *root pointer
node *temp=root;
//Declaring a new node to save the data taken from the user
node *nn = (node *)malloc(sizeof(node));
//Assigning the values to the new node(*nn)
nn->x=a;
nn->next=NULL;
//Checking that the root node is NULL or not
//If root is empty, then new node is assigned to *root
if(root == NULL)
{
root=nn;
}
//Else, we will first find the last node of the linklist using the *temp pointer
else
{
while (temp->next != NULL)
temp = temp -> next;
//Assigning the new node after the last node of the linklist
temp->next=nn;
}
}
void printList()
{
node *r=root;
while (r != NULL)
{
printf("%d ", r -> x);
r = r -> next;
}
printf("n");
}

相关内容

  • 没有找到相关文章

最新更新