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


学习内容:

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;

}



相关推荐
淡海水17 分钟前
03-03-线性-LinkedList-T-源码不变式与选择边界
windows·链表·c#·编译·linkedlist·clr·机器码
小七在进步32 分钟前
数据结构:选择排序
数据结构·算法·排序算法
不会就选b1 小时前
Linux之线程进阶---封装信号量
数据结构·算法
旖旎夜光1 小时前
LeetCode 69:x 的平方根(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】项目的数据结构设计
数据结构·人工智能·大模型·sdk·文件系统·岗位
学习星球1 小时前
【LeetCode算法题精讲】图算法精讲——从图遍历到拓扑排序
数据结构·算法·leetcode·图搜索
余额瞒着我当琳1 小时前
C++ list第二讲数据结构修炼:迭代器源码 + 栈队列适配器 + LeetCode 三道高频题
数据结构·c++·list
_Narcissus_1 小时前
常见数论算法笔记
数据结构·c++·算法·高精度·数论·快速幂·质数筛
吴声子夜歌2 小时前
Java面试——数据结构(二)
java·数据结构·面试
octopus_c5 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法