(数据结构)带头结点的双向循环链表操作——C实现
带头结点的双向链表声明单链表结点类型//定义结点结构typedef struct DCNode{int data;struct DCNode *prior, *next;}DCNode, *DCLinkList;操作链表初始化//链表初始化voidInitDCLinkList(DCLinkList plist){assert(plist != NULL);if(plist == NULL){ret
·
带头结点的双向链表
声明单链表结点类型
//定义结点结构
typedef struct DCNode
{
int data;
struct DCNode *prior, *next;
}DCNode, *DCLinkList;
操作
链表初始化
//链表初始化
void InitDCLinkList(DCLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
plist->prior = plist ->next = plist;
}
为了实现以下插入,删除等一系列操作,先封装以下功能:
获取节点个数
int GetLength(DCLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return -1;
}
int length = 0;
DCLinkList p = plist->next;
while(p != plist)
{
length++;
p=p->next;
}
return length;
}
根据位置找结点
DCLinkList FindNode(DCLinkList plist,int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return NULL;
}
if(pos < 0)
{
return NULL;
}
DCLinkList p =plist;
while(pos && p ->next != plist)
{
pos--;
p = p->next;
}
if(pos == 0)
{
return p;
}
return NULL;
}
申请节点
static DCLinkList _ApplyNode(int val,DCLinkList prior,DCLinkList next)
{
DCLinkList s = (DCLinkList)malloc(sizeof(DCNode));
assert(s != NULL);
if (s == NULL)
{
return NULL;
}
s->data = val;
s->prior = prior;
s->next = next;
return s;
}
插入
void Insert(DCLinkList plist,int val,int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DCLinkList p = FindNode(plist,pos);
if(p == NULL)
{
return;
}
//完成插入结点的衔接
DCLinkList t = _ApplyNode(val ,p, p->next);
if(t == NULL)
{
return;
}
//pos位置下一个节点的prior和pos位置的next
p->next->prior = t;
p->next = t;
}
头插
void Insert_Head(DCLinkList plist,int val)
{
Insert(plist,val,0);
}
尾插
void Insert_Tail(DCLinkList plist,int val)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DCLinkList t = _ApplyNode(val ,plist->prior, plist);
if(t == NULL)
{
return;
}
plist->prior->next = t;
plist->prior= t;
}
删除
void Delete(DCLinkList plist,int pos)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DCLinkList p = FindNode(plist,pos);
if(p == plist || p == NULL)
{
return;
}
p->prior->next=p->next;
p->next->prior = p->prior;
free(p);
}
头删
void Delete_Head(DCLinkList plist)
{
Delete(plist,1);
}
尾删
void Delete_Tail(DCLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
if(ListEmpty(plist))//链表为空不需要删除
{
return;
}
DCLinkList p = plist->prior;
p->prior->next=p->next;
p->next->prior = p->prior;
free(p);
}
判空
int ListEmpty(DCLinkList plist)
{
if(plist == NULL || plist->next == plist)
{
return 1;
}
return 0;
}
置空
void Clear(DCLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return ;
}
while(!ListEmpty(plist))
{
Delete_Head(plist);
}
}
显示
void Show(DCLinkList plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
DCLinkList p = plist ->next;
while(p != plist)
{
printf("%d——>",p->data);
p=p->next;
}
printf("NULL\n");
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)