实现链表的增删查,清空,销毁
#pragma once
typedef int DataType;
//链表的节点结构
typedef struct DLinkList {
struct DLinkList* next;
struct DLinkList* prior;
DataType data;
}DLinkList,*DLNode;
// 链表的初始化
void DLLinkListInit(DLNode* L);
//创建一个新的节点
DLNode CreateNewNode(DataType data);
// 在链表的尾部插入值为data的元素
void DLLinkListPushBack(DLNode L, DataType data);
// 删除链表最后一个元素
void DLLinkListPopBack(DLNode L);
// 在链表的头部插入值为data的元素
void DLLinkListPushFront(DLNode L, DataType data);
// 删除链表头部的元素
void SLLinkListPopFront(DLNode L);
// 在链表pos位置插入值为data的元素
void DLLinkListInsert(DLNode pos, DataType data);
// 删除链表中pos位置上的元素
void DLLinkListErase(DLNode pos);
// 在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL
DLNode DLLinkListFind(DLNode L, DataType data);
// 检测链表是否为空,如果为空返回非0值,非空返回0
int DLLinkListEmpty(DLNode L);
// 返回链表中节点的的个数
int DLLinkListSize(DLNode L);
//清空链表
void DLLinkListClear(DLNode L);
// 销毁链表
void DLLinkListDestroy(DLNode* L);
//打印
void DLLinkListPrint(DLNode L);
//以下 L 代表头节点
// 链表的初始化
void DLLinkListInit(DLNode* L) {
assert(L);
(*L)= (DLNode)malloc(sizeof(DLinkList));
if (*L == NULL) {
return;
}
(*L)->next = *L;
(*L)->prior = *L;
}
//创建一个新的节点
DLNode CreateNewNode(DataType data) {
DLNode NewNode = (DLNode)malloc(sizeof(DLinkList));
if (NewNode == NULL) {
return;
}
NewNode->data = data;
NewNode->next = NULL;
NewNode->prior = NULL;
}
// 在链表的尾部插入值为data的元素
void DLLinkListPushBack(DLNode L, DataType data) {
DLNode NewNode = CreateNewNode(data);
NewNode->next = L;
NewNode->prior = L->prior;
L->prior->next = NewNode;
L->prior = NewNode;
}
// 删除链表最后一个元素
void DLLinkListPopBack(DLNode L) {
assert(L);
if (L == L->next) {
return;
}
DLNode LastNode = L->prior;
LastNode->prior->next = L;
L->prior = LastNode->prior;
free(LastNode);
}
// 在链表的头部插入值为data的元素
void DLLinkListPushFront(DLNode L, DataType data) {
DLNode NewNode = CreateNewNode(data);
NewNode->next = L->next;
NewNode->prior = L;
L->next = NewNode;
NewNode->next->prior = NewNode;
}
// 删除链表头部的元素
void SLLinkListPopFront(DLNode L) {
assert(L);
if (L->next == L) {
return;
}
DLNode FirstNode = L->next;
L->next = FirstNode->next;
FirstNode->next->prior = L;
free(FirstNode);
}
// 在链表pos位置插入值为data的元素 ,插在data的前面
void DLLinkListInsert(DLNode pos, DataType data) {
if (pos == NULL) {
return;
}
DLNode NewNode = CreateNewNode(data);
NewNode->next = pos;
NewNode->prior = pos->prior;
pos->prior = NewNode;
NewNode->prior->next = NewNode;
}
// 删除链表中pos位置上的元素
void DLLinkListErase(DLNode pos) {
if (pos == NULL) {
return;
}
pos->next->prior = pos->prior;
pos->prior->next = pos->next;
free(pos);
}
// 在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL
DLNode DLLinkListFind(DLNode L, DataType data) {
assert(L);
DLNode TmpNode = L->next;
while (TmpNode != L) {
if (TmpNode->data == data) {
return TmpNode;
}
TmpNode = TmpNode->next;
}
return NULL;
}
// 检测链表是否为空,如果为空返回非0值,非空返回0
int DLLinkListEmpty(DLNode L) {
assert(L);
if (L->next == L)
return 1;
return 0;
}
// 返回链表中节点的的个数
int DLLinkListSize(DLNode L) {
assert(L);
int count = 0;
DLNode TmpNode = L->next;
while (TmpNode != L) {
count++;
TmpNode = TmpNode->next;
}
return count;
}
//清空链表
void DLLinkListClear(DLNode L) {
DLNode TmpNode = L->next;
while (TmpNode != L) {
L->next = TmpNode->next;
free(TmpNode);
TmpNode = L->next;
}
L->next = L;
L->prior = L;
}
// 销毁链表
void DLLinkListDestroy(DLNode* L) {
DLLinkListClear(*L);
free(*L);
*L = NULL;
}
//打印
void DLLinkListPrint(DLNode L) {
assert(L);
DLNode TmpNode = L->next;
while(TmpNode != L) {
printf("%d<--->", TmpNode->data);
TmpNode = TmpNode->next;
}
printf("\n");
}
void main() {
DLinkList *L;
// 链表的初始化
DLLinkListInit(&L);
// 在链表的尾部插入值为data的元素
DLLinkListPushBack(L, 1);
DLLinkListPushBack(L, 2);
DLLinkListPushBack(L, 3);
DLLinkListPushBack(L, 4);
DLLinkListPushBack(L, 5);
DLLinkListPrint(L);
// 删除链表最后一个元素
DLLinkListPopBack(L);
DLLinkListPrint(L);
// 在链表的头部插入值为data的元素
DLLinkListPushFront(L,0);
DLLinkListPrint(L);
// 删除链表头部的元素
SLLinkListPopFront(L);
DLLinkListPrint(L);
//在链表pos位置插入值为data的元素,插在data的前面
DLLinkListInsert(DLLinkListFind(L, 1), 6);
DLLinkListPrint(L);
//删除链表中pos位置上的元素
DLLinkListErase(DLLinkListFind(L, 6));
DLLinkListPrint(L);
//在链表中查找值为data的元素,找到返回该元素在链表中的地址,否则返回NULL
DLNode Node= DLLinkListFind(L,1);
printf("%p\n", Node);
//检测链表是否为空,如果为空返回0值,非空返回0
int ret = DLLinkListEmpty(L);
printf("%d\n", ret);
// 返回链表中节点的的个数
int rett=DLLinkListSize(L);
printf("%d\n", rett);
//清空链表
DLLinkListClear(L);
// 销毁链表
DLLinkListDestroy(L);
system("pause");
}