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


学习内容:

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;

}



相关推荐
与己斗其乐无穷1 小时前
数据结构(2)线性表-顺序表
数据结构
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
小青龙emmm2 小时前
数据结构(一) 绪论
数据结构
矿渣渣2 小时前
AFFS2 的 `yaffs_ext_tags` 数据结构详解
数据结构·算法·文件系统·yaffs2
真的想上岸啊2 小时前
c语言第一个小游戏:贪吃蛇小游戏06
c语言·算法·链表
chenyuhao20243 小时前
链表的面试题4之合并有序链表
数据结构·链表·面试·c#
水水沝淼㵘4 小时前
嵌入式开发学习日志(数据结构--顺序结构单链表)Day19
linux·服务器·c语言·数据结构·学习·算法·排序算法
莹莹学编程—成长记5 小时前
list基础用法
数据结构·list
清幽竹客5 小时前
redis数据结构-09 (ZADD、ZRANGE、ZRANK)
数据结构·数据库·redis
葵花日记5 小时前
数据结构——二叉树
c语言·数据结构