单链表实施问题

时间:2013-12-18 22:21:05

标签: c data-structures linked-list

我正在尝试编写基于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.我犯了什么错误?

由于

2 个答案:

答案 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关于“头部迷路”的评论 - 当你将指针传递给一个函数时,你只传递一个数字的副本。修改函数内部的数字只会修改函数的本地副本。它对调用函数的指针没有影响。