头文件:
typedef int Elemtype;//链表的头节点的pre指向尾节点,尾节点的next指向头节点
//如果只有一个头节点,则让头节点的next和pre都指向本身
typedef struct DuLinkNode
{
struct DuLinkNode* prev;
struct DuLinkNode* next;
Elemtype data;
}DuLinkNode,*PDuLinkNode;
typedef struct DuLinkList
{
PDuLinkNode head;
Elemtype cursize;
}DuLinkList;
void INIT_Du(DuLinkList* plist);//初始化链表
PDuLinkNode BuyNode();//购买节点
void PrintDuList(const DuLinkList* plist);//打印链表
DuLinkNode* FindValue(const DuLinkList* plist, Elemtype val);//在链表中寻找值为val的节点并返回其地址
bool Insert_Prev(DuLinkList* plist, DuLinkNode* ptr, int val);//在ptr之前插入节点
void Push_Front(DuLinkList* plist, Elemtype val);//头插
void Push_back(DuLinkList* plist, Elemtype val);//尾插
bool Erase(DuLinkList* plist, DuLinkNode* ptr);//删除ptr前一个结点
主函数:
#include<assert.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"DuLinkList.h"
void INIT_Du(DuLinkList*plist)//初始化链表
{
assert(plist != NULL);
plist->cursize = 0;
plist->head = BuyNode();
plist->head->next = plist->head;
plist->head->prev = plist->head;
}
PDuLinkNode BuyNode()//购买节点
{
PDuLinkNode s = (PDuLinkNode)malloc(sizeof(DuLinkNode));
assert(s != NULL);
memset(s, 0, sizeof(DuLinkNode));
return s;
}
void PrintDuList(const DuLinkList* plist)//打印链表
{
assert(plist != nullptr);
DuLinkNode* p = plist->head->next;
while (p->next != plist->head)//当到达最后一个节点时,节点的next指向头节点
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
DuLinkNode* FindValue(const DuLinkList* plist, Elemtype val)//在链表中寻找值为val的节点并返回其地址
{
assert(plist != nullptr);
DuLinkNode* p = plist->head->next;
while (p!= plist->head&&p->data!=val)
{
p = p->next;
}
if (p == plist->head)
{
p = NULL;
}
return p;
}
bool Insert_Prev(DuLinkList* plist, DuLinkNode* ptr, int val)//在ptr之前插入节点
{
assert(plist != NULL);
if (ptr != NULL)
{
DuLinkNode* s = BuyNode();
s->next = ptr;//将新节点的next赋值为ptr的地址
s->prev = ptr->prev;//将新节点的prev赋值为ptr的前一个结点的地址
ptr->prev->next = s;//将ptr前一个结点的next赋值为s
ptr->prev = s;//将ptr前一个节点的地址赋值为s
s->data = val;
plist->cursize++;
return true;
}
else
{
return false;
}
}
void Push_Front(DuLinkList* plist, Elemtype val)//头插
{
assert(plist != NULL);
Insert_Prev(plist, plist->head->next, val);
}
void Push_back(DuLinkList* plist, Elemtype val)//尾插
{
assert(plist != NULL);
Insert_Prev(plist, plist->head, val);
}
bool Erase(DuLinkList*plist, DuLinkNode* ptr)//删除ptr前一个结点
{
assert(plist != NULL);
if (ptr == NULL)return false;
ptr->next->prev = ptr->prev;
ptr->prev->next = ptr->next;
free(ptr);
ptr = NULL;
plist->cursize--;
return true;
}
bool Clear(DuLinkList* plist)
{
assert(plist != NULL);
plist->cursize = 0;
plist->head->next = plist->head;
plist->head->prev = plist->head;
}
bool Destroy(DuLinkList* plist)
{
Clear(plist);
free(plist->head);
plist->head = NULL;
free(plist);
plist = NULL;
}
int main()
{
DuLinkList x = {};
DuLinkList* p = &x;
INIT_Du(p);
for (int i = 0; i < 10; i++)
{
Insert_Prev(p, p->head,i+1);
PrintDuList(p);
}
}