前言:
本代码用C语言实现,可以直接复制下来运行,都是笔者自己敲的,运行过的,可以实现功能的,有不懂可以直接评论,会解答
效果图:

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct DLink{
ElemType data; //数据域
struct DLink *before,*next; //前驱和后继指针
}DLink,*DLinkList;
/*创建一个双向链表*/
DLinkList InitDLink(DLink *dl)
{
dl = (DLinkList)malloc(sizeof(DLink));
DLinkList newnode,firstnode=dl,oldnode=dl;
oldnode->next = oldnode;
int i = 1;
while(i<=10)
{
newnode = (DLinkList)malloc(sizeof(DLink));
newnode->next = oldnode->next;
oldnode->next = newnode;
newnode->before = oldnode;
newnode->data=i;
oldnode=newnode;
i++;
}
firstnode->before=oldnode;
return dl;
}
/*求循环双链表长度*/
int LenghtDLink(DLink *dl)
{
DLink *oldnode=dl;
int lenght=0;
while(oldnode->next!=dl)
{
oldnode = oldnode->next;
lenght++;
}
return lenght;
}
/*向循环双链表插入数据*/
DLinkList InsertDLink(DLink *dl,int i,ElemType e)
{
if(i<1||i>LenghtDLink(dl)+1) //判断插入数据位置
return dl;
DLinkList newnode,oldnode=dl;
for(int j=1 ; j<i ; j++)
{
oldnode = oldnode->next;
}
newnode = (DLinkList)malloc(sizeof(DLink));
newnode->data = e;
newnode->next = oldnode->next; //老节点后继指针域的值,赋值给新结点的后继指针域
oldnode->next = newnode; //把新结点的值赋值给老节点后继指针域,让老节点后继指针域指向新结点
newnode->before = oldnode; //把老节点的值赋值给,新结点前驱指针域,让新结点前驱指针域指向老节点
return dl; //插入数据完成
}
/*删除循环双链表的值*/
DLinkList DeleteDLink(DLink *dl,int i)
{
if(i<1||i>LenghtDLink(dl)) //判断删除数据位置
return dl;
DLinkList deletenode,oldnode=dl;
for(int j =1;j<i;j++)
{
oldnode = oldnode->next;
}
deletenode = oldnode->next; //deletenode是要删除的结点
oldnode->next->next->before = oldnode->next->before; //把deletenode结点前驱指针域的值,给deletenode后结点的前驱指针域,让其指向deletenode结点前的结点
oldnode->next = oldnode->next->next; //把deletenode结点后继指针域的值,给deletenode前结点的后继指针域,让其指向deletenode结点后的结点
free(deletenode); //释放结点
return dl;
}
int main(void)
{
DLink initdlk,insertdlk,deletedlk,*initDlink,*insertDlink,*deleteDlink,*Headnode;
initDlink = InitDLink(&initdlk);
Headnode = initDlink;
int lenght = LenghtDLink(Headnode);
printf("循环双链表长度为:%d\n",lenght);
initDlink = initDlink->next;
while(Headnode!=initDlink->next)
{
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",initDlink->before,initDlink->data,initDlink->next);
initDlink = initDlink->next;
if(initDlink->next==Headnode) //把最后一个数据输出出来,形成一个“圈”
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",initDlink->before,initDlink->data,initDlink->next);
}
printf("\n\n");
//添加数据
insertDlink = InitDLink(&insertdlk);
int address = 6;
insertDlink = InsertDLink(insertDlink,address,666); //添加数据
Headnode = insertDlink;
lenght = LenghtDLink(Headnode);
printf("插入数据后循环双链表长度为:%d\n",lenght);
insertDlink = insertDlink->next;
while(Headnode!=insertDlink->next)
{
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",insertDlink->before,insertDlink->data,insertDlink->next);
insertDlink = insertDlink->next;
if(insertDlink->next==Headnode) //把最后一个数据输出出来,形成一个“圈”
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",insertDlink->before,insertDlink->data,insertDlink->next);
}
printf("\n\n");
//删除数据
deleteDlink = DeleteDLink(Headnode,address); //删除数据
Headnode = deleteDlink;
lenght = LenghtDLink(Headnode);
printf("删除数据后循环双链表长度为:%d\n",lenght);
deleteDlink = deleteDlink->next;
while(Headnode!=deleteDlink->next)
{
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",deleteDlink->before,deleteDlink->data,deleteDlink->next);
deleteDlink = deleteDlink->next;
if(deleteDlink->next==Headnode) //把最后一个数据输出出来,形成一个“圈”
printf("前驱指针域:%p\t数据域:%d\t后继指针域:%p\n",deleteDlink->before,deleteDlink->data,deleteDlink->next);
}
printf("\n\n");
return 0;
}
C语言实现循环双链表
本文介绍了一种使用C语言实现循环双链表的方法,包括创建、求长度、插入和删除操作。通过实例展示了如何操作循环双链表,以及如何在链表中插入和删除元素。
433

被折叠的 条评论
为什么被折叠?



