1.ListNode.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* next;
struct ListNode* prev;
LTDataType data;
}LN;
//初始化
LN* ListInit();
//打印
void List_print(LN* plist);
//查找
LN* ListFind(LN* plist,LTDataType x);
//尾插
void ListPushBank(LN* plist, LTDataType x);
//头插
void ListPushFront(LN* plist, LTDataType x);
//尾删
void ListPopBank(LN* plist);
//头删
void ListPopFront(LN* plist);
//pos之前插入x
void ListInsert(LN* pos, LTDataType x);
//删除pos位置
void ListErase(LN* pos);
//销毁
void ListDestroyed(LN* plist);
2.ListNode.c源文件实现
#include"ListNode.h"
//创建节点
LN* BuyListNode(LTDataType x)
{
LN* newnode = (LN*)malloc(sizeof(LN));
newnode->data = x;
newnode->next = newnode->prev = newnode;
return newnode;
}
//初始化
LN* ListInit()
{
LN* newnode = BuyListNode(0);//哨兵位
}
//尾插
void ListPushBank(LN* plist,LTDataType x)
{
assert(plist);
//快捷
ListInsert(plist->prev->next, x);
}
//打印
void List_print(LN* plist)
{
LN* ret = plist->next;//哨兵不需要打印
while (ret != plist)
{
printf("%d->", ret->data);
ret = ret->next;
}
printf("NULL\n");
}
//头插
void ListPushFront(LN* plist, LTDataType x)
{
assert(plist);
ListInsert(plist->next, x);
}
//尾删
void ListPopBank(LN* plist)
{
assert(plist);
ListErase(plist->prev);
}
//头删
void ListPopFront(LN* plist)
{
assert(plist);
//快捷方式
ListErase(plist->next);
}
//查找
LN* ListFind(LN* plist, LTDataType x)
{
assert(plist);
LN* ret = plist->next;
while (ret != plist)
{
if (x == ret->data)
{
return ret;
}
ret = ret->next;
}
return NULL;
}
//pos之前插入内容
void ListInsert(LN* pos, LTDataType x)
{
assert(pos);
LN* newnode = BuyListNode(x);
LN* pcur = pos->prev;
pcur->next = newnode;
newnode->next = pos;
newnode->prev = pcur;
pos->prev = newnode;
}
//删除pos位置
void ListErase(LN* pos)
{
assert(pos);
LN* prev = pos->prev;
LN* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
}
//销毁
void ListDestroyed(LN* plist)
{
assert(plist);
LN* cur = plist->next;
while (cur != plist)
{
LN* ret = cur->next;
free(cur);
cur = ret;
}
free(plist);
plist = NULL;
printf("销毁成功\n");
}
只需调用ListInsert函数和 ListErase函数来实现简化的头插,尾插,头删,尾删步骤的代码