在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);
...
}