#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct DLnode
{
int data; //值域
struct DLnode *pre; //前驱指针
struct DLnode *next; //后继指针
}Dnode, * DLinklist;
DLinklist Init_DLinkList(void); //初始化双链表
DLinklist Creat_newNode(int DATA); //创建一个新节点
void Insert_head_DLinkList(DLinklist DL, int DATA); //头插
void Delete_head_DLinkList(DLinklist DL); //头删
void Insert_tail_DLinkList(DLinklist DL, int DATA); //尾插
void Delete_tail_DLinkList(DLinklist DL); //尾删
void Print_DLinkList(DLinklist DL); //打印链表
bool Empty_DList(DLinklist DL); //判空
int Length_DList(DLinklist DL); //链表长度
void Destory_DList(DLinklist DL); //销毁链表
DLinklist Init_DLinkList(void) //初始化双链表
{
DLinklist head = malloc(sizeof(Dnode));
if(head != NULL)
{
head -> pre = NULL;
head -> next = NULL;
head -> data = -1;
return head;
}
else
{
printf("初始化双链表失败!\n");
}
}
DLinklist Creat_newNode(int DATA) //创建一个新节点
{
DLinklist newNode = malloc(sizeof(Dnode));
if(newNode != NULL)
{
newNode -> data = DATA;
newNode -> pre = NULL;
newNode -> next = NULL;
return newNode;
}
else
{
printf("创建新新节点失败!\n");
return 0;
}
}
void Insert_head_DLinkList(DLinklist DL, int DATA) //头插
{
DLinklist newnode = Creat_newNode(DATA);
newnode -> pre = DL;
newnode -> next = DL -> next;
DL -> next = newnode;
if(newnode -> next != NULL) //如果仅有头节点,则头节点的next指向空,不存在pre
{
newnode -> next -> pre = newnode;
}
}
void Delete_head_DLinkList(DLinklist DL) //头删
{
if(DL -> next == NULL)
{
printf("链表为空!\n");
}
else
{
DLinklist p;
p = DL -> next; //p指向首结点
DL -> next = p -> next;
p -> next -> pre = DL;
printf("要删除的数据为:%d\n", p -> data);
free(p);
}
}
void Insert_tail_DLinkList(DLinklist DL, int DATA) //尾插
{
DLinklist newnode, tail; //创建一个新节点
tail = DL; //tail先指向头节点
newnode = Creat_newNode(DATA);
while( tail -> next != NULL) //让tail指向最后一个节点
{
tail = tail -> next;
}
newnode -> pre = tail;
tail -> next = newnode;
newnode -> next = NULL;
}
void Delete_tail_DLinkList(DLinklist DL) //尾删
{
DLinklist tail = DL; //tail先指向头节点
while(tail -> next != NULL)//让tail指向最后一个节点
{
tail = tail -> next;
}
tail -> pre -> next = NULL;
tail -> pre = NULL;
printf("要删除的数据为:%d\n", tail -> data);
free(tail);
}
void Print_DLinkList(DLinklist DL) //打印链表
{
if(Empty_DList(DL) == 1)
{
printf("链表为空!\n");
}
else
{
DLinklist p = DL -> next;
while(p != NULL)
{
if(p -> next != NULL)
{
printf("%d ---> ", p -> data);
}
else
{
printf("%d\n", p -> data);
}
p = p -> next;
}
}
}
bool Empty_DList(DLinklist DL) //判空
{
if(DL -> next == NULL)
{
return true;
}
else
{
return false;
}
}
int Length_DList(DLinklist DL) //链表长度
{
if(Empty_DList(DL) != 1)
{
int length = 0;
DLinklist p = DL;
while(p -> next != NULL)
{
length++;
p = p -> next;
}
return length;
}
else
{
return 0;
}
}
void Destory_DList(DLinklist DL) //销毁链表
{
if(Empty_DList(DL) != 1)
{
DLinklist p = DL;
while(p -> next != NULL) //循环头删
{
Delete_head_DLinkList(DL);
p = p -> next;
}
printf("free:%d\n", p -> data);
free(p);
free(DL);
}
else
{
free(DL);
}
}
int main()
{
DLinklist DL = Init_DLinkList();
Print_DLinkList(DL);
for(int i = 0; i < 5; i++)
{
Insert_head_DLinkList(DL, i);
}
Print_DLinkList(DL);
printf("length:%d\n", Length_DList(DL));
Insert_tail_DLinkList(DL, 79);
Insert_tail_DLinkList(DL, 69);
Insert_tail_DLinkList(DL, 59);
Print_DLinkList(DL);
printf("length:%d\n", Length_DList(DL));
Delete_head_DLinkList(DL);
Print_DLinkList(DL);
printf("length:%d\n", Length_DList(DL));
Delete_tail_DLinkList(DL);
Print_DLinkList(DL);
printf("length:%d\n", Length_DList(DL));
Destory_DList(DL);
Print_DLinkList(DL);
}
结果: