目录
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
List.h
typedef int LTDataType;//如果需要别的类型也可以将int换掉
typedef struct ListNode
{
struct List* prev;
struct List* next;
LTDataType data;
}LTNode;
//初始化
LTNode* ListInit();
//释放
void ListDestory(LTNode* phead);
//打印
void ListPrint(LTNode* phead);
//插入数据
void ListPushBack(LTNode* phead, LTDataType x);
void ListPushFront(LTNode* phead, LTDataType x);
//删除数据
void ListPopBack(LTNode* phead);
void ListPopFront(LTNode* phead);
//判空
bool ListEmpty(LTNode* phead);
//计算大小
size_t ListSize(LTNode* phead);
//查找
LTNode* ListFind(LTNode* phead, LTDataType x);
//插入
void ListInsert(LTNode* pos, LTDataType x);
//删除
void ListErase(LTNode* pos);
List.c
#include"List.h"
1.初始化
//初始化
LTNode* ListInit()
{
//先创建一个哨兵头节点
LTNode* guard = (LTNode*)malloc(sizeof(LTNode));
//检查是否创建成功
if (guard == NULL)
{
perror("malloc fail");
exit(-1);
}
guard->next = guard;
guard->prev = guard;
return guard;
}
2.释放
//释放
void ListDestory(LTNode* phead)
{
assert(phead);
LTNode* cur = phead->next;
while (cur != phead)
{
LTNode* next = cur->next;//再建立一个next指针,省的找不到下一个
free(cur);
cur = next;//把cur赋值给next,从而走下去
}
free(phead);
}
/
3.打印
//打印
void ListPrint(LTNode* phead)
{
assert(phead);
printf("phead<=>");
LTNode* cur = phead->next;
while (cur != phead)
{
printf("%d<=>", cur->data);
cur = cur->next;
}
printf("\n");
}
4.插入数据
由于头插和尾插都要创建新节点,所以写一个创建新节点的代码,等会在下面直接使用
LTNode* BuyListNode(LTDataType x)
{
LTNode*