什么叫双向循环链表,双向循环链表和双向链表
私藏项目实操分享
一~我爱你~链表的种类单向
双向
单向带头循环链表
双向带头循环链表
单向带头不循环链表
双向带头不循环链表
单向不带头循环链表
双向不带头循环链表
单向不带头不循环链表
双向不带头不循环链表
二~我爱你~双向带头循环链表其中单向不带头不循环链表和双向循环链表最为常见,而双向循环链表看起来好像很复杂,但是由于它是带头的又是双向循环的,反而给操作上带来了很多方便。下面主要主要实现双向带头循环链表。
双向循环链表和单链表都是由结点组成的,单链表包含一个数据域和一个指针域构成,而双向循环链表不同,它是由一个数据域和两个指针域组成,其中指针包含前驱指针(预测)和后继指针(下一步)。
三~我爱你~代码实现(1)附表h文件#包括标准视频
#include assert.h包含断言
#包括标准库
typedef int ltdatatype
typedef结构列表节点类型定义结构清单节点
{
ltdatatype数据
结构列表节点*下一个
结构列表节点*预测:
} ltnode
lt node * listinit();
//双向带头循环链表的初始化
见list print(lt node * phead);
//打印
lt node * buylistnode(lt datatype x);
//增容函数
见ListPushBack(LTNode* phead,lt datatype x);
//尾插
见listpopback(lt node * phead);
//尾删
见listpushfran(ltnode * phead,lt datatype x);
//头插
见listpopfront(lt node * phead);
//头删
LTNode* ListFind(LTNode* phead,lt datatype x);
//查找
请参阅list list(ltnode * pos、lt datatype x);
//在位置(p)之前插入
见list rase(lt node * pos);
//在位置(p)位置删除
见list destroy(lt node * phead);
//销毁(2)附表c文件#包括List.h
ltnode * listinit()
{
lt node * phead=(lt node *)malloc(sizeof(lt node));
//创建头节点
ph head-next=ph head;//后继指针指向头
phead-prev=phead;//前驱指针指向头
返回phead
}
请参阅ListPrint(LTNode* phead)
{
断言(phead);
lt node * cur=phead-next;
而(当前值!=phead)
{
printf("% d-",当前日期):
cur=cur-next;
}
printf(" \ n ");
}
LTNode* BuyListNode(LTDataType x)
{
lt node * new node=(lt node *)malloc(sizeof(lt node));
if(newnode==NULL)
{
printf(malloc故障\ n’);
退出(-1);
}
节点数据=x:
newnode- next=NULL:
newnode- prev=NULL:
返回新节点;
}
请参阅ListPushBack(LTNode* phead,LTDataType x)
{
断言(phead);
ltnode * tail=phead-prev(ltnode *尾部=phead-预测):
lt node * new node=buylistnode(x);
尾部-下一个=新节点:
newnode- prev=tail(新节点-预测=尾部):
new node-next=phead;
phead-prev=新节点;
}
请参阅ListPopBack(LTNode* phead)
{
断言(phead);
断言(phead-下一个!=phead
ltnode * tail=phead-prev(ltnode *尾部=phead-预测):
lt node * tai prev=tail-prev(lt node *详细信息-预测):
自由(尾部);
tai prev-next=ph EAD;
phead-prev=tai prev;
}
请参见listpushfran(ltnode * phead,LTDataType x)
{
断言(phead);
lt node * new node=buylistnode(x);
lt node * next=phead-next;
phead-next=新节点;
new node-prev=phead;
新节点-下一个=下一个:
下一步-prev=新节点;
}
参见ListPopFront(LTNode* phead)
{
断言(phead);
断言(phead-下一个!=ph EAD
lt node * next=phead-next;
ltnode * nextnext=下一个
phead-next=下一个;
next-prev=phead;
}
LTNode* ListFind(LTNode* phead,LTDataType x)
{
断言(phead);
lt node * cur=phead-next;
而(当前值!=phead)
{
if(cur- Data==x)
{
返回当前值;
}
cur=cur-next;
}
返回空:
}
请参阅list list(ltnode * pos、LTDataType x)
{
断言(pos);
LTNode* posPrev=pos- prev:
lt node * new node=buylistnode(x);
posprev-next=新节点;
new node-prev=pos prev;
newnode- next=pos:
pos- prev=newnode:
}
参见列表(LTNode*位置)
{
断言(pos);
LTNode* posPrev=pos- prev:
lt node * pos next=pos-next;
pos prev-next=pos next;
posnext=posprev:
自由(pos);
pos=NULL:
}
请参见ListDestroy(LTNode* phead)
{
断言(phead);
lt node * cur=phead-next;
而(当前值!=phead)
{
lt node * next=cur-next;
自由(cur);
当前-下一个;
}
自由(phead);
phead=NULL:
}(3)测试。c文件#包括List.h
请参见菜单()
{
打印文本(* * * * * * * * * * * * * * * * * * * * *带头双循环链表**本报告迟交是因为需要更多的资料。
页:1。尾插* * * * * * * * * * * \ n];
Printf (* * * * * * * * * * * * 2。头插入* * * * * * * * * * * * \ n’);
printf( * * * * * * * * * * 3。删除末尾的* * * * * * * * * * * * * * \ n’);
printf( * * * * * * * * * * 4。删除开头的* * * * * * * * * * * * * * \ n’);
printf( * * * * * * * * * * 5。查询N位置* * * * * * * * * * * * \ N’);
printf( * * * * * * * * * * 6。在N位置之前插入元素X * * * * * * * * * * \ N’);
Printf (* * * * * * * * * * * * 7。删除N位置的元素* * * * * * * * * * * * \ N’);
printf( * * * * * * * * * * 8。打印链表* * * * * * * * * * * * * * \ n’);
printf( * * * * * * * * * * * * *-1。退出链表* * * * * * * * * * * * \ n’);
printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );
}
int main()
{
lt node * pList=ListInit();
menu();
int选项=-1;
做
{
Printf(请输入选项:);
scanf(%d ,选项);
if(选项==1)
{
int x=0;
Printf(请输入要结尾的元素:);
scanf(%d ,x);
ListPushBack(pList,x);
}
else if(选项==2)
{
int x=0;
Printf(请输入要作为前缀的数字:);
scanf(%d ,x);
ListPushFront(pList,x);
}
else if(选项==3)
{
//结尾删除
ListPopBack(pList);
}
else if(选项==4)
{
//标头删除
ListPopFront(pList);
}
else if(选项==5)
{
int x=0;
Printf(请输入要查找的值x:);
scanf(%d ,x);
LTNode* pos=ListFind(pList,x);
如果(pos!=空)
{
Printf (number %d\n ,x);
}
其他
{
Printf(找不到编号% d \ n ,x);
}
}
else if(选项==6)
{
int x=0;
int y=0;
Printf(请分别输入N位的值X和N位前插入的值Y:);
scanf(%d %d ,x,y);
LTNode* n=ListFind(pList,x);
如果(n!=空)
{
ListInsert(n,y);
}
其他
{
Printf(链表不存在%d\n ,x);
}
}
else if(选项==7)
{
int x=0;
Printf(请输入要删除的第n个位置的值:);
scanf(%d ,x);
LTNode* n=ListFind(pList,x);
李斯特酶;
}
else if(选项==8)
{
list print(pList);
}
} while(选项!=-1);
list destroy(pList);
返回0;
}(4)makefile src=$(通配符*。c)
obj=$(patsubst %。c,%。o,$(src))
全部:测试
测试:$(obj)
gcc $^ -pthread -o $@
清洁:
-rm -rf $(obj)测试
%.o:%。c
gcc -c $ -o $@。假的:清洗所有的静脉注射。结果表明
,转载请联系作者获得转载授权,否则将追究法律责任。评论0发表评论。
mb6268f6803d12d
2022-05-21 11:32
写得很详细。感谢分享。我在使用的过程中发现这个链表的数据字段是一个整数。不知道怎么改进成通用链表。
wx620e51599794e
博主回复mb6268f6803d12d
2022-05-21 19:04
写得很详细。感谢分享。我在使用的过程中发现这个链表的数据字段是一个整数。不知道怎么改进成通用链表。
更改为无效*
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。