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;
}
}
}
此代码删除除第一个节点之外的每个节点。当我尝试删除第一个节点时,它会将随机数作为输出。可能是什么原因?
答案 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);