#include#include #include 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("要删除的数据为:%dn", 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("要删除的数据为:%dn", 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("%dn", 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:%dn", 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:%dn", Length_DList(DL)); Insert_tail_DlinkList(DL, 79); Insert_tail_DlinkList(DL, 69); Insert_tail_DlinkList(DL, 59); Print_DlinkList(DL); printf("length:%dn", Length_DList(DL)); Delete_head_DlinkList(DL); Print_DlinkList(DL); printf("length:%dn", Length_DList(DL)); Delete_tail_DlinkList(DL); Print_DlinkList(DL); printf("length:%dn", Length_DList(DL)); Destory_DList(DL); Print_DlinkList(DL); }
结果:



