我是学习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("%dn",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
节点时中断循环,而不是在NULL
其next
节点时中断循环(因为while
测试发生在循环体之前)。
下面是一个缩短和更正的版本,它还更新了 while 条件内的List
指针,而不是在循环之前和循环主体中。
void printList(Node * List)
{
while ((List = List->next) != NULL)
{
printf("%dn",List->value);
}
}
这是打印列表函数的问题,您应该需要打印直到当前节点不等于 null。 即在 Java 中我使用 while 循环..
而 (curnode!=null)*请记住.next不在这里使用,因为当您使用它时,您的One元素将被跳过