数据结构--循环双链表

循环双链表的示意图:


代码:

CDList.h

#ifndef _CDLIST_H_
#define _CDLIST_H_

typedef char ElemType;
typedef struct DNode
{
	ElemType data;
	struct DNode *next;	
	struct DNode *prior;
}DLinkList;

void InitList(DLinkList *&L);

void DestoryList(DLinkList *L);

int ListEmpty(DLinkList *L);

int ListLength(DLinkList *L);

void PrintList(DLinkList *L);

int GetElem(DLinkList *L,int n,ElemType &e);

int LocateElem(DLinkList *L,ElemType e);

int InsertList(DLinkList *&L,int n,ElemType e);

int ListDelete(DLinkList *&L,int n,ElemType &e);
#endif

CDList.cpp

#include<iostream>
#include<malloc.h>
#include"CDList.h"

using namespace std;

void InitList(DLinkList *&L)
{
	L=(DLinkList*)malloc(sizeof(DLinkList));
	L->prior=L;
	L->next=L;
}

void DestoryList(DLinkList *L)
{
	DLinkList *p=L,*q=p->next;
	while(q!=L)
	{
		free(p);//头结点也要释放滴
		p=q;
		q=p->next;
	}
	free(p);
}

int ListEmpty(DLinkList *L)
{
	return (L->next==L);	
}

int ListLength(DLinkList *L)
{
	DLinkList *p=L->next;
	int length=0;
	while(p!=L)
	{
		length++;
		p=p->next;
	}
	return length;
}

void PrintList(DLinkList *L)
{
	DLinkList *p=L->next;
	while(p!=L)
	{
		cout<<p->data<<'\t';
		p=p->next;
	}
	cout<<endl;
}

int GetElem(DLinkList *L,int n,ElemType &e)
{
	DLinkList *p=L->next;
	int i=0;
	if(p!=L)//链表不为空
	{
		if(n==1)
		{
			e=p->data;
			return 1;
		}
		else//n!=1
		{
			while(p!=L&&i<n-1)
			{
				i++;
				p=p->next;
			}
			if(p==L)
				return 0;
			else
			{
				e=p->data;
				return 1;
			}
		}
	}
	else//链表为空
		return 0;
}

int LocateElem(DLinkList *L,ElemType e)
{
	DLinkList *p=L->next;
	int n=1;
	while(p->data!=e&&p!=L)
	{
		n++;
		p=p->next;
	}
	if(p==L)
		return 0;//没有找到元素e
	else
		return n;

}

int InsertList(DLinkList *&L,int n,ElemType e)
{
	DLinkList *p=L,*q;
	int i=0;
	if(p->next==L)//链表为空
	{
		q=(DLinkList*)malloc(sizeof(DLinkList));
		q->data=e;
		p->next=q;
		q->next=p;
		p->prior=q;
		q->prior=p;
		return 1;	
	}
	else if(n==1)//链表不为空,但在第一个位置插入结点
	{
		q=(DLinkList*)malloc(sizeof(DLinkList));
		q->data=e;
		q->next=p->next;
		p->next=q;
		q->next->prior=q;
		q->prior=p;
		return 1;	
	}
	else//链表不为空,也不在第一个位置插入结点
	{
		p=p->next;
		while(i<n-2&&p!=L)
		{
			i++;
			p=p->next;
		}
		if(p==L)//没有找到第n-1个位置
			return 0;
		else
		{
			q=(DLinkList*)malloc(sizeof(DLinkList));
			q->data=e;
			q->next=p->next;
			if(p->next!=NULL)//??????
				p->next->prior=q;
			q->prior=p;
			p->next=q;	
			return 1;
		}	
	}
}

int ListDelete(DLinkList *&L,int n,ElemType &e)
{
	DLinkList *p=L,*q;
	int i=0;
	if(p->next!=L)//链表不为空
	{
		if(n==1)//删除第一个结点
		{
			q=L->next;
			e=q->data;
			q=p->next;
			p->next=q->next;
			q->next->prior=p;
			free(q);
			return 1;
		}
		else
		{
			p=L->next;
			while(i<n-2&&p!=L)
			{
				i++;
				p=p->next;
			}
			if(p==L)
				return 0;
			else
			{
				q=p->next;//q为删除的结点
				if(q==NULL)//:??????
					return 0;
				e=q->data;
				p->next=q->next;
				if(p->next!=NULL)//???????
					p->next->prior=p;
				free(q);
				return 1;
			}
		}
	}
	else
		return 0;//链表为空
}

main.cpp

#include<iostream>
#include"CDList.h"

using namespace std;
int main()
{
	DLinkList *L;
	ElemType e;
	cout<<"========================================================================"<<endl;
	cout<<"=======对循环双链表进行创建、插入、删除、================================"<<endl;
	cout<<"=====对循环双链表进行判断是否为空、求链表长度、打印链表等操作============="<<endl;
	cout<<"(1)初始化循环双链表L"<<endl;
	InitList(L);

	cout<<"(2)依次采用尾插入法插入a,b,c,d,e元素"<<endl;
	InsertList(L,1,'a');
	InsertList(L,2,'b');
	InsertList(L,3,'c');
	InsertList(L,4,'d');
	InsertList(L,5,'e');

	cout<<"(3)输出循环双链表"<<endl;
	PrintList(L);

	cout<<"(4)循环双链表的长度Length="<<ListLength(L)<<endl;
	cout<<"(5)判断循环双链表是否为空"<<endl;
	if (ListEmpty(L))
	{
		cout<<"循环双链表为空"<<endl;
	} 
	else
	{
		cout<<"循环双链表不为空"<<endl;
	}
	GetElem(L,3,e);
	cout<<"(6)循环双链表L的第3个元素为="<<e<<endl;

	cout<<"(7)循环双链表中元素c的位置i="<<LocateElem(L,'c')<<endl;

	cout<<"(8)在第4个元素位置上插入f元素"<<endl;
	InsertList(L,4,'f');
	cout<<"(9)输出循环双链表"<<endl;
	PrintList(L);

	cout<<"(10)删除循环双链表中的第3个元素"<<endl;
	ListDelete(L,3,e);																	
	cout<<"(11)输出循环双链表L"<<endl;
	PrintList(L);

	cout<<"(12)释放循环双链表L"<<endl;
	DestoryList(L);
	return 0;
}

结果示意图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值