以下程序在c。我想删除列表的最后一个元素。我无法理解它为什么不被删除。我在delete函数中将最后一个元素设置为null,稍后可以在del变量中看到它。但是具有最后一个元素的列表并没有将其设置为null。请任何人解释。
#include <stdio.h>
typedef struct node
{
int info;
struct node *next;
}mynode;
void add(int val,mynode **head,mynode **tail);
void print(mynode *head);
void delete(mynode **head);
//mynode *head,*tail,*temp;
mynode *del;
int main(void) {
// your code goes here
mynode *root,*head,*tail,*temp;
head=(mynode*)0;
add(2,&head,&tail);
add(3,&head,&tail);
add(4,&head,&tail);
add(5,&head,&tail);
add(6,&head,&tail);
print(head);
del=tail;
delete(&head);
print(head);
return 0;
}
void add(int val,mynode **head,mynode **tail)
{
mynode *temp;
temp=(mynode*)malloc(sizeof(struct node));
temp->next=(mynode*)0;
temp->info=val;
if(*head==(mynode*)0)
{
*head=temp;
*tail=temp;
}
else
{
(*tail)->next=temp;
*tail=temp;
}
}
void print(mynode *head)
{
mynode *temp;
if(head==(mynode*)0)
{
return;
}
printf("\n\n");
for(temp=head;temp!=(mynode*)0;temp=temp->next)
{
printf("[%d]->",temp->info);
}
printf("NULL\n\n");
}
//deletes elements from linked list
void delete(mynode **head)
{
if(del==head)
{
*head=del->next;
del=(mynode*)0;
}
else if(del->next==(mynode*)0)
{
del=(mynode*)0;
}
else
{
del->info=del->next->info;
del->next=del->next->next;
del=(mynode*)0;
}
}
输出:
[2] - &GT; [3] - &GT; [4] - &GT; [5] - &GT; [6] - &GT; NULL
[2] - &GT; [3] - &GT; [4] - &GT; [5] - &GT; [6] - &GT; NULL
答案 0 :(得分:0)
您似乎误解了删除链接列表中的元素所需的内容。这样做的:
del=(mynode*)0;
不从列表中删除任何内容。它只会更改del
要从链接列表中删除元素,您需要更改上一个元素的next
指针(即元素之前您想要的元素删除)。
删除B的示例:
List:
A --> B --> C --> NULL
// Do:
A->next = C
New list:
A --> C --> NULL
由于您使用的是动态内存,因此您还需要释放内存(也称为免费(B))。
顺便说一句:
1)将del
作为全局变量是不好的。将其作为参数传递。
2)此代码:if(del==head)
正在比较mynode*
和mynode**
这可能不是您想要的。而是使用if(del==*head)
所以你的删除功能更像是:
void delete(mynode **head, mynode *d)
{
if (*head == NULL) return;
if(d==*head)
{
*head=d->next;
free(d);
return;
}
mynode *p = *head;
mynode *t = p->next;
while(t)
{
if(t==d)
{
p->next=d->next;
free(d);
return;
}
p = p->next;
t = p->next;
}
}
答案 1 :(得分:0)
你需要遍历到del的前一个节点,我们称之为'prev'
prev->next = del->next // assuming del is not null
free(del);