0
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

4 回答 4

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.

然后 Free A(由 表示X),并返回 new Head

于 2013-11-11T10:08:55.510 回答
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);
  ...
}
于 2013-11-11T10:09:41.403 回答
0

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

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

于 2013-11-11T10:09:19.297 回答
0

void del (node* list);

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

void del (node** list);

或者,返回新的列表开始:

node *del (node* list);

于 2013-11-11T10:11:05.923 回答