我正在尝试编写基于C的单链表实现。
#include<stdio.h>
struct sllist {
int data;
struct sllist *next;
};
void InsertInLinkedList(struct sllist *head, int data, int position);
int main()
{
int x;
struct sllist *s=NULL;
InsertInLinkedList(s,5,1);
x=ListLength(s);
printf("%d\n",x);
return 0;
}
int ListLength(struct sllist *head)
{
struct sllist *current = head;
int count = 0;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
void InsertInLinkedList(struct sllist *head, int data, int position)
{
int k = 1;
struct sllist *p, *q, *newNode;
newNode = (struct sllist *)malloc(sizeof(struct sllist));
if (!newNode) {
printf("Memory Error\n");
return;
}
newNode->data = data;
p = head;
if (position == 1) {
newNode->next = NULL;
head = newNode;
} else {
while ((p != NULL) && (k < position - 1)) {
k++;
q = p;
p = p->next;
}
if (p == NULL) {
q->next = newNode;
newNode->next = NULL;
} else {
q->next = newNode;
newNode->next = p;
}
}
}
我尝试将一个节点添加到列表中,然后验证长度。但是,我得到的输出为0而不是1.我犯了什么错误?
由于
答案 0 :(得分:2)
此代码:
if (position == 1) {
newNode->next = NULL;
head = newNode;
}
没有效果......因为newNode仍然分离,并且头部迷路。
在链表中插入节点的功能应返回修改后的列表,或接受指向指针的指针。如下所示:
void InsertHead(struct sllist **list, struct sllist *new_node) {
new_node->next = *list;
*list = new_node;
}
答案 1 :(得分:1)
进一步解释manu-fatto关于“头部迷路”的评论 - 当你将指针传递给一个函数时,你只传递一个数字的副本。修改函数内部的数字只会修改函数的本地副本。它对调用函数的指针没有影响。