#include<stdio.h>
#include<stdlib.h>
//数据结点
typedef struct binode
{
int data;
struct binode* next;//指向下一个
struct binode* prev;//指向前一个
}BiNode;
//头结点
typedef struct bilist
{
BiNode* first;
BiNode* last;
}BiList;
void Insert_List(BiList* L,BiNode* q);
//基本操作:增、删、改、查
//创建一个带头结点的双向链表
/*
一、创建一个双向链表的头结点
空链表,没有数据结点
返回值:
返回双向链表头结点的指针
*/
BiList* create_bilist(void)
{
BiList* L=(BiList*)malloc(sizeof(BiList));
L->first=NULL;
L->last=NULL;
return L;
}
/*
Create_List:创建一个单链表
@L:双向链表的头结点
返回值:
无
*/
void Create_List(BiList* L)
{
int data;
while (1)
{
scanf("%d",&data);
if(data == 999)
{
break;
}
BiNode* s=(BiNode*)malloc(sizeof(BiNode));
s->data=data;
s->next=NULL;
s->prev=NULL;
if(L->first == NULL)
{
L->first=s;
L->last=s;
}
else
{
s->prev = L->last;
L->last->next = s;
L->last = s;
//Insert_List(L,s);
}
}
}
/*
Insert_List:在升序双向链表中插入一个数,仍然是升序。
@L:双向链表的头结点
@q:想要插入的结点
返回值:
无
*/
void Insert_List(BiList* L,BiNode* q)
{
if(L->first == NULL)
{
return;
}
BiNode* p = L->first;
while (p)
{
if(p->data>q->data)
{
break;
}
p=p->next;
}
if(p == NULL)
{
L->last->next = q;
q->prev = L->last;
L->last = q;
}
else
{
if(L->first==p)//第一个就是要插入的位置
{
p->prev = q;
q->next = p;
L->first =q;
}
else
{
q->next = p;
p->prev->next = q;
q->prev =p->prev;
p->prev = q;
}
}
}
/*
输出双向链表每个结点的值
*/
void Printf_BiList(BiList* L)
{
BiNode* p=L->first;
while (p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*
Delete_List_data:删除一个双向链表的结点
@L:要操作的双链表
@data:要删除结点的值
返回值:
无
*/
void Delete_List_data(BiList* L,int data)
{
if(L->first == NULL)
{
return;
}
BiNode* pk = L->first;
while (pk)
{
if(pk->data == data)
{
break;
}
pk = pk->next;
}
if(pk == NULL)//要删除的结点在尾结点
{
printf("No\n");
return;
}
else
{
if(pk == L->first)
{
L->first = pk->next;//要删除的结点在最前面
pk->next = NULL;
}
else if(pk==L->last)
{
pk->prev->next =pk->next;
L->last = pk->prev;
}
else
{
pk->prev->next =pk->next;
pk->next->prev =pk->prev;
pk->next = NULL;
}
free(pk);
}
}
/*
Delete_List:删除整个双向链表的结点(销毁链表)
@L:要销毁的链表的头结点
返回值:
无
*/
void Delete_List(BiList* L)
{
BiNode* pk = L->first;
if(pk == NULL)
{
return;
}
while (pk)
{
L->first =L->first->next;
pk->next = NULL;
pk->prev = NULL;
free(pk);
pk=L->first;
}
printf("Delete success\n");
}
/*
elete_All_data:删除整个链表中的data
@L:双向链表的头结点
@data:要删除的数据
返回值:
无
*/
void Delete_All_data(BiList* L,int data)
{
BiNode* pk = L->first;
while (L->first && pk->data == data)
{
L->first = L->first->next;
pk->next = NULL;
free(pk);
pk = L->first;
}
while (pk)
{
if(pk->data == data)
{
if(pk->next == NULL)
{
pk->prev->next = pk->next;
break;
}
BiNode* p;
pk->prev->next = pk->next;
pk->next->prev = pk->prev;
p = pk->next;
pk->next = NULL;
free(pk);
pk = p;
continue;
}
pk = pk->next;
}
}
int main()
{
// int data;
// printf("Input:\n");
// scanf("%d",&data);
BiList* L=create_bilist();
Create_List(L);
//Delete_All_data(L,data);
Delete_List(L);
Printf_BiList(L);
return 0;
}