双向带头循环链表的接口函数实现


学习内容:

1.双向链表的节点形式以及函数声明

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

typedef int DataType;

typedef struct ListNode

{

int val;

struct ListNode* next;

struct ListNode* prev;

}LTNode;

void LTNInit(LTNode** phead);//初始化

void LNTDestroy(LTNode* phead);//销毁链表

void LTNPrint(LTNode* phead);//打印链表

void LTNPushBack(LTNode* phead, DataType x);//尾插

void LTNPushFront(LTNode* phead, DataType x);//头插

void LTNPopBack(LTNode* phead);//尾删

void LTNPopFront(LTNode* phead);//头删

LTNode* LTNFInd(LTNode* phead, DataType x);//查找

void LTNInsert(LTNode* pos, DataType x);//指定位置之前插入

void LTNInsertAfter(LTNode* pos, DataType x);//指定位置之后插入

void LTNERase(LTNode* pos);//指定位置删除

2.创建节点

代码如下:

LTNode* LTNBuyNode(DataType x)

{

LTNode* node = (LTNode*)malloc(sizeof(LTNode));

assert(node);

node->val = x;

node->next = node->prev = node;

return node;

}

3.初始化链表

void LTNInit(LTNode** phead)//初始化,创建头结点

{

*phead = LTNBuyNode(0);

}

4.打印链表

代码如下:

void LTNPrint(LTNode* phead)//打印链表

{

assert(phead);

LTNode* pcur = phead->next;

while (pcur != phead)

{

printf("%d->", pcur->val);

pcur = pcur->next;

}

printf("NULL");

putchar('\n');

}

5.尾插

void LTNPushBack(LTNode* phead, DataType x)//尾插

{

LTNode* newnode = LTNBuyNode(x);

LTNode* tail = phead->prev;

newnode->prev = tail;

newnode->next = phead;

phead->prev = newnode;

tail->next = newnode;

}

6.头插

void LTNPushFront(LTNode* phead, DataType x)//头插

{

assert(phead);

LTNode* newnode = LTNBuyNode(x);

newnode->next = phead->next;

newnode->prev = phead;

phead->next->prev = newnode;

phead->next = newnode;

}

7.尾删

void LTNPopBack(LTNode* phead)//尾删

{

assert(phead && phead->next != phead);

LTNode* del = phead->prev;

del->prev->next = phead;

phead->prev = del->prev;

free(del);

del = NULL;

}

8.头删

void LTNPopFront(LTNode* phead)//头删

{

assert(phead && phead->next != phead);

LTNode* del = phead->next;

del->next->prev = phead;

phead->next = del->next;

free(del);

del = NULL;

}

9.查找

LTNode* LTNFInd(LTNode* phead, DataType x)//查找

{

assert(phead);

LTNode* cur = phead->next;

while (cur != phead)

{

if (cur->val == x)

{

return cur;

}

cur = cur->next;

}

return NULL;

}

10.指定位置之后插入

void LTNInsertAfter(LTNode* pos, DataType x)//指定位置之后插入
{
assert(pos);
LTNode* newnode = LTNBuyNode(x);
newnode->prev = pos;
newnode->next = pos->next;
pos->next->prev = newnode;
pos->next = newnode;
}

11.指定位置之前插入

void LTNInsert(LTNode* pos, DataType x)//指定位置之前插入
{
assert(pos);
LTNode* newnode = LTNBuyNode(x);
newnode->prev = pos->prev;
newnode->next = pos;
pos->prev->next = newnode;
pos->prev = newnode;
}

12.指定位置的删除

void LTNERase(LTNode* pos)//指定位置删除

{

assert(pos);

pos->prev->next = pos->next;

pos->next->prev = pos->prev;

free(pos);

pos = NULL;

}

13.销毁

void LNTDestroy(LTNode* phead)//销毁链表

{

LTNode* cur = phead->next;

while (cur != phead)

{

LTNode* next = cur->next;

free(cur);

cur = next;

}

free(phead);

phead = NULL;

}



相关推荐
涅槃寂雨15 分钟前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;22 分钟前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统
就爱学编程24 分钟前
从C语言看数据结构和算法:复杂度决定性能
c语言·数据结构·算法
半桔28 分钟前
栈和队列(C语言)
c语言·开发语言·数据结构·c++·git
墨楠。2 小时前
数据结构学习记录-树和二叉树
数据结构·学习·算法
Aqua Cheng.2 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法
qy发大财3 小时前
平衡二叉树(力扣110)
数据结构·算法·leetcode·职场和发展
佳心饼干-3 小时前
数据结构-栈
开发语言·数据结构
自由自在的小Bird5 小时前
简单排序算法
数据结构·算法·排序算法
萧萧玉树7 小时前
B树系列详解
数据结构·b树