目录
-
结构体类型中要有三个元素:1、指向前一个节点的指针prev。2、存储的数据val。3、指向后一个节点的指针next。还有要注意的点就是:头节点head和尾结点tail的关系,head->prev=tail,tail->next=head.
若一个双向链表只有头节点head那么他的head->next=head;head->prev=head;
1.两个typedef,做好基础工作
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* next;
struct ListNode* prev;
LTDataType data;
}LTNode;
方便以后修改数据类型和简化写代码。
2.需要定义的各个函数
LTNode* LTDinit();//初始化双向链表
LTNode* BuyListNode(LTDataType x);//申请新的节点
void ListPrint(LTNode* phead);//打印双向链表
void ListInsert(LTNode* pos, LTDataType x);//在任意位置插入
void ListPushBack(LTNode* phead, LTDataType x);//尾部插入
void ListPushFront(LTNode* phead, LTDataType x);//头部插入
void ListErase(LTNode* pos);//删除数据
void ListPopBack(LTNode* phead);//尾部删除
void ListPopFront(LTNode* phead);//头部删除
LTNode* ListFind(LTNode* phead, LTDataType x);//查找
void ListDestory(LTNode* phead);//销毁双向链表
3.LTDinit初始化函数的细节
LTNode* LTDinit()
{
LTNode* guard = NULL;//创建哨兵位节点,方便尾插
guard = (LTNode*)malloc(sizeof(LTNode));
if (guard == NULL)
{
perror("malloc fail\n");
exit;//开辟成功则继续,失败则退出程序
}
else
{
guard->next = guard;
guard->prev = guard;
}
return guard;
}
有一个哨兵位节点就方便后续的插入,当然在销毁双向链表的时候也需要在哨兵位上注意一点
4.BuyListNode申请空间函数
参数是数据x,返回值是新开辟空间的地址,找到