双向单链表结构体
typedef struct dunode
{
int data;
struct dunode* prior;
struct dunode* next;
} DuLinkList;
双向单链表数据删除
(DuLinkList* L)
{
int data;
DuLinkList* s,*p;
p = L;
printf("请输入插入的元素:");
scanf_s("%d", &data);
s = (DuLinkList*)malloc(sizeof(DuLinkList));
s->data = data;
s->prior = p->prior;
p->prior->next = s;
p->prior = s;
s->next = NULL;
}
void DeleteLink(DuLinkList* L)
{
int data;
DuLinkList* s, * p;
p = L->next;
printf("请输入删除的数据:");
scanf_s("%d", &data);
while (p != NULL && p->data != data)
p = p->next;
if (p != NULL)
{
if (p->next != NULL)
{
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
printf("%d已删除!\n", data);
}
else {
p->prior->next = NULL;
free(p);
printf("%d已删除!\n", data);
}
}
else printf("%d不存在!\n",data);
}
因为双向链表的最后一个结点的next指针域为空,而不是最后一个结点的指针域不为空,所以要分两种情况。
当删除的结点不是最后一个,删除的结点的前一个结点的next指针要指向下一个结点,即执行p->prior->next = p->next;
当删除的结点为最后一个,直接把删除的前一个结点的next指针置空,即执行p->prior->next = NULL;