在C语言中从链表中删除第一个节点

在C语言中从链表中删除第一个节点,c,linked-list,C,Linked List,此代码删除除第一个节点外的所有节点。当我尝试删除第一个节点时,它会给出随机数作为输出。原因可能是什么?原因是您的起始节点丢失,并且您无法跟踪链接列表。您需要返回新的起始节点无效删除(节点*列表)应为节点*删除(节点*列表) 若要删除的节点是第一个节点,则返回第二个节点地址,否则返回第一个节点地址 这就是你的清单(假设) 使头部指向秒 +----+-----+ +-----+-----+ +-----+------+ | A | +-->| | +--&

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

原因是您的起始节点丢失,并且您无法跟踪链接列表。您需要返回新的起始节点<代码>无效删除(节点*列表)应为
节点*删除(节点*列表)

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

这就是你的清单(假设)

使
头部
指向秒

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

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

您必须更改
void del(node*list)
的签名,因为删除Head时必须返回列表的新的开始部分


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

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

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

 +----+-----+    +-----+-----+   +-----+------+
 |  A |     +-X->|   B |     +-->|     |      |
 +----+-----+    +-----+-----+   +-----+------+
                 /
               Head is now pointing to location B.
你应该称之为

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;
            }
     ....
}
void del(节点*列表)

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

void del(节点**列表)

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

node*del(node*list)

您所说的“它将随机数作为输出”是什么意思?这个:
void del(node*list)
应该是:
void del(node**pplist)
或者这个:
node*del(node*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);
  ...
}