我是初学者,在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;
}
任何可能出错的想法?
答案 0 :(得分:3)
您正在添加到前面,但是您要将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]);
答案 1 :(得分:2)
假设第一个节点不是用于数据而只是指向列表的其余部分,那么大多数代码看起来都不错。问题是您没有打印列表中的所有节点。
在printList()
内,您不需要original
,因为函数参数中的List
无论如何都是本地的...并且您需要在节点时打破循环&# 39;重新查看是NULL
而不是next
节点是NULL
(因为while
测试发生在循环体之前)。
这是一个缩短和更正的版本,它还会更新while条件内的List
指针,而不是循环之前和循环体中。
void printList(Node * List)
{
while ((List = List->next) != NULL)
{
printf("%d\n",List->value);
}
}