我对数据结构太新了,实际上我昨天就开始了。这是代码:
#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
并在函数内执行任何操作。但这并不影响root
对main()
的价值,它仍然是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");
}