第一个元素在 C 中使用链表消失
First element disappearing using Linked Lists in C
我是学习 C 语言数据结构和抽象数据类型的初学者。我正在创建一个简单的链表实现,但是当我尝试打印该列表时,我似乎丢失了第一个元素。 Node 类型只包含一个整数和一个指向自身的指针。
我的主文件
int main()
{
Node * List=createList();
int testData[] = {1,2,3,4,5,6};
for (int i = 0 ; i < 6 ; i++)
{
addFront(List,testData[i]);
printList(List);
printf("\n");
}
}
addToFront 及其支持的 initNode 定义如下:
void addFront(Node * List, int value)
{
Node * toAdd = initNode(value);
toAdd-> next = List->next;
List->next = toAdd;
}
Node * initNode(int val)
{
Node * newNode = malloc(sizeof(Node));
newNode -> value = val;
newNode-> next = NULL;
return newNode;
}
编辑:根据要求,printList() 是:
void printList(Node * List)
{
Node * original = List->next;
while (List->next != NULL)
{
printf("%d\n",List->value);
List = List ->next;
}
List = original;
}
有什么地方不对吗?
您正在添加到前面,但您正在将 toAdd
中的下一个元素设置为 List->next
。您正在跳过第一个元素。
此外,您之后将 List->next
设置为 toAdd
。
你要做的是:
void addFront(Node** List, int value)
{
Node * toAdd = initNode(value);
toAdd->next = *List;
*List = toAdd;
}
传入一个指向 Node 指针的指针,这样您就可以在函数内部修改头部。
根据 alk 的评论,现在这样称呼它:addFront(&List,testData[i]);
假设第一个节点不用于数据而仅指向列表的其余部分,那么您的大部分代码看起来都不错。问题是您没有打印列表中的所有节点。
在 printList()
内部,您不需要 original
,因为函数参数中的 List
无论如何都是本地的...并且您需要在节点出现时中断循环重新查看是 NULL
而不是当它的 next
节点是 NULL
时(因为 while
测试发生在循环体之前)。
这是一个缩短和更正的版本,它还更新了 while 条件内的 List
指针,而不是循环之前和循环体中的指针。
void printList(Node * List)
{
while ((List = List->next) != NULL)
{
printf("%d\n",List->value);
}
}
我是学习 C 语言数据结构和抽象数据类型的初学者。我正在创建一个简单的链表实现,但是当我尝试打印该列表时,我似乎丢失了第一个元素。 Node 类型只包含一个整数和一个指向自身的指针。
我的主文件
int main()
{
Node * List=createList();
int testData[] = {1,2,3,4,5,6};
for (int i = 0 ; i < 6 ; i++)
{
addFront(List,testData[i]);
printList(List);
printf("\n");
}
}
addToFront 及其支持的 initNode 定义如下:
void addFront(Node * List, int value)
{
Node * toAdd = initNode(value);
toAdd-> next = List->next;
List->next = toAdd;
}
Node * initNode(int val)
{
Node * newNode = malloc(sizeof(Node));
newNode -> value = val;
newNode-> next = NULL;
return newNode;
}
编辑:根据要求,printList() 是:
void printList(Node * List)
{
Node * original = List->next;
while (List->next != NULL)
{
printf("%d\n",List->value);
List = List ->next;
}
List = original;
}
有什么地方不对吗?
您正在添加到前面,但您正在将 toAdd
中的下一个元素设置为 List->next
。您正在跳过第一个元素。
此外,您之后将 List->next
设置为 toAdd
。
你要做的是:
void addFront(Node** List, int value)
{
Node * toAdd = initNode(value);
toAdd->next = *List;
*List = toAdd;
}
传入一个指向 Node 指针的指针,这样您就可以在函数内部修改头部。
根据 alk 的评论,现在这样称呼它:addFront(&List,testData[i]);
假设第一个节点不用于数据而仅指向列表的其余部分,那么您的大部分代码看起来都不错。问题是您没有打印列表中的所有节点。
在 printList()
内部,您不需要 original
,因为函数参数中的 List
无论如何都是本地的...并且您需要在节点出现时中断循环重新查看是 NULL
而不是当它的 next
节点是 NULL
时(因为 while
测试发生在循环体之前)。
这是一个缩短和更正的版本,它还更新了 while 条件内的 List
指针,而不是循环之前和循环体中的指针。
void printList(Node * List)
{
while ((List = List->next) != NULL)
{
printf("%d\n",List->value);
}
}