线性表循环双链表实现基础操作和效果图

C语言实现循环双链表
本文介绍了一种使用C语言实现循环双链表的方法,包括创建、求长度、插入和删除操作。通过实例展示了如何操作循环双链表,以及如何在链表中插入和删除元素。

前言:

本代码用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;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值