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


学习内容:

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;

}



相关推荐
h_a_o777oah3 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO93 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician3 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.3 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
程序员清风5 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
Logic1018 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
殷色玫瑰9 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
写后端的胖头鱼10 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘10 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包11 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表