我对数据结构太新了,实际上我昨天开始了。这是代码:
#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个元素然后打印它们。但该计划的结束没有任何事情发生。我的错是什么?
答案 0 :(得分:2)
问题出在addToList()
函数中。如果要更新列表的根节点,则必须按以下方式定义函数:
void addToList(node **r, int a)
否则,您将指针发送到root
并在函数内执行任何操作。但它不会影响root
上main()
的价值,而且仍为NULL
。
如果要更改指针的值,则必须从main()
将指针的地址发送到函数==&gt; addToList(&root, a);
。
现在我们可以更新root
指向的位置。但这还不够,因为您希望root
始终指向列表的开头==&gt;您只想在第一次调用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;
}
}
答案 1 :(得分:1)
您有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;
}
}
答案 2 :(得分:1)
这里,第一个错误是您没有将*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");
}