从C中的链表中删除第一个节点

时间:2013-11-11 10:03:14

标签: c linked-list

void del (node* list) {
    int a;

    printf("Enter no. to be deleted");
    scanf("%d", &a);

    node* p;
    node* prev;

    p = list;

    while (p != NULL) {
        if (p -> n == a) {
            if (p == list) {
                list = p -> next;
                free (p);
                return;
            }
            else {
                prev -> next = p -> next;
                free (p);
                return;
            }
        }
        else {
            prev = p;
            p = p -> next;
        }
    }
}

此代码删除除第一个节点之外的每个节点。当我尝试删除第一个节点时,它会将随机数作为输出。可能是什么原因?

4 个答案:

答案 0 :(得分:1)

原因是你的起始节点迷路了,你忘记了你的链表。您需要返回新的起始节点。 void del (node* list)应为node* del (node* list)

如果要删除的节点是第一个节点,则返回第二个节点地址,否则返回第一个节点地址。

这就是你的名单(假设)

 +----+-----+   +-----+-----+   +-----+------+
 |  A |     +-->|     |     +-->|     |      |
 +----+-----+   +-----+-----+   +-----+------+
 /
Head is pointing to location A.

Head指向第二位。

 +----+-----+    +-----+-----+   +-----+------+
 |  A |     +-X->|   B |     +-->|     |      |
 +----+-----+    +-----+-----+   +-----+------+
                 /
               Head is now pointing to location B.

然后免费A(由X表示),并返回新的Head

答案 1 :(得分:1)

删除list指向的第一个节点时,不会将其更改为新节点。因此,列表中的第一个节点仍然指向旧内存。

您需要传递第一个节点的地址并进行更改,例如:

void del (node** head) {
    int a;
    node* list = *head;

    printf("Enter no. to be deleted");
    scanf("%d", &a);

    node* p;
    node* prev;

    p = list;

    while (p != NULL) {
        if (p -> n == a) {
            if (p == list) {
                //list = p -> next;
                //changes where head points to
                *head = p->next
                free (p);
                return;
            }
     ....
}

你应该把它称为

int main() {
  ...
  node* head;

  del(&head);
  ...
}

答案 2 :(得分:0)

您必须更改void del (node* list)的签名,因为您必须在删除头部时返回列表的开头。

我建议node * del (node* list)在代码末尾添加return list

答案 3 :(得分:0)

void del (node* list);

list是一个局部变量。您对其所做的任何更改都不会在函数外部填充。您需要将指针传递给指向node

的指针

void del (node** list);

或者,返回新列表开始:

node *del (node* list);