学习笔记------数据结构(C语言版) 双循环链表

本文详细介绍了如何使用C语言来实现双循环链表的数据结构,包括关键的函数实现和示例代码。
摘要由CSDN通过智能技术生成

//Function realization.cpp

#include"predefined.h"
#include"DoubleLinkList.h"
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e)
//算法2.18:在带头结点的双链循环线性表L中第i个位置之前插入元素e,
//i的合法值为1<=i<=表长+1。
{
	DuLinkList p,s;
	if(!(p=GetElemP_DuL(*L,i))) return ERROR;
	if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;
	(*s).data=e;
	(*s).prior=(*p).prior;
	(*(*p).prior).next=s;
	(*s).next=p;
	(*p).prior=s;
	return OK;
}

Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e)
//算法2.19:删除带头结点的双链循环表L的第i个元素,i的合法值为1<=i<=表长。
{
	DuLinkList p;
	if(!(p=GetElemP_DuL(*L,i))) return ERROR;
	*e=(*p).data;
	(*(*p).prior).next=(*p).next;
	(*(*p).next).prior=(*p).prior;
	free(p);
	return OK;
}

Status InitList_DuL(DuLinkList *L)//构造一个带头结点的空双链表
{
	(*L)=(DuLinkList)malloc(sizeof(DuLNode));
	if(!(*L)) exit(OVERFLOW);
	(**L).next=(**L).prior=*L;
	return OK;
}

Status DestroyList_DuL(DuLinkList *L)//销毁双链表
{
	DuLinkList p,q;  
    p=*L;  
   do
    {  
        q=(*p).next;  
        free(p);  
        p=q;  
    }  
	while(p!=*L);
	(*L)=NULL;
    return OK; 
}

Status ClearList_DuL(DuLinkList *L)//双链表置空
{
	DuLinkList p,q;  
    p=*L;  
    if(!p) return FALSE;   
    p=(*p).next;  
    while(p!=*L)  
    {  
        q=p;  
        p=(*p).next;  
        free(q);  
    }  
	(**L).next=(**L).prior=*L;  
    return OK;  
}

Status ListEmpty_DuL(DuLinkList L)//若双链表为空,返回TRUE。
{
	if(L&&(*L).next==L&&(*L).prior==L) return TRUE;
	else return FALSE;
}

Status ListLength_DuL(DuLinkList L)//求双链表L的长度。
{
	ElemType n=0;  
    DuLinkList p;
	if(L)
	{
		p=(*L).next; 
        while(p!=L) 
		{
			n++;
		    p=(*p).next;
	    }
	}
    return n;
}

Status GetElem_DuL(DuLinkList L,int i,ElemType *e)//用e返回L中第i的元素的值
{
	DuLinkList p;  
	int j=1;
	p=(*L).next;
	if(L)
	{
		while(p!=L&&j<i)
		{
			p=(*p).next;
			++j;
		}
	   if(p==L||j>i) return ERROR;  
       *e=(*p).data;  
       return OK;
	}
	else return ERROR;
}

Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e))
//返回双链表L中第一个与e满足关系compare元素的位序
{
	DuLinkList p;  
    p=L;  
    Status n;  
    n=compare(p,e);  
    if(n) return n;  
    else return FALSE; 
}

Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//返回前驱
{
	DuLinkList p;
	p=(*L).next;
	if(L)
	{
		while(p!=L)
		{
			if((*p).data==cur_e)
			{
				if((*p).prior==L) return ERROR;
				else
				{
					*e=(*(*p).prior).data;
					return OK;
				}

			}
			p=(*p).next;
		}
	}
	return ERROR;
}

Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//返回后继
{
	DuLinkList p;
	p=(*L).next;
	if(L)
	{
		while(p!=L)
		{
			if((*p).data==cur_e)
			{
				if((*p).next==L) return ERROR;
				else 
				{
					*e=(*(*p).next).data;
					return OK;
				}
			}
			p=(*p).next;
		}
	}
	return ERROR;
}

DuLinkList GetElemP_DuL(DuLinkList L,int i)
//返回双链表L指向第i个元素的指针。
{
	DuLinkList p;
	int j;
	if(i>ListLength_DuL(L)+1||i<1) return NULL;
	p=(*L).next;
	for(j=1;j<i;j++)
	{
		p=(*p).next;
	}
	return p;
}

Status ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L))
//依次对双链表L中每个元素调用visit函数。
{
	DuLinkList p;  
    Status m; 
    p=(*L).next;
    while(p!=L)
    {  
        m=visit(p);  
        if(m) p=(*p).next;  
        else return FALSE;  
    }  
    return OK;
}

//main.cpp

#include"predefined.h"
#include"DoubleLinkList.h"
Status equal(DuLinkList L,ElemType e)  
{  
    int i;
	DuLinkList p;
	p=(*L).next;
    for(i=1;p!=L;i++)
    {  
		if((*p).data==e)  return i;  
        p=(*p).next;
    }
	return FALSE;
}
Status visit(DuLinkList L)  
{  
    printf("%d ",(*L).data);  
    return OK;  
} 
int main()
{
	DuLinkList La;
	Status s;
	int n,i,m;
	ElemType e;
	printf("Function 1\n★函数InitList_DuL(DuLinkList *L)测试...\n");
	s=InitList_DuL(&La);
	printf("▲初始化双链循环表La: %d (0:失败 1:成功)\n\n",s);
	printf("Function 2\n★函数ListEmpty_DuL(DuLinkList L)测试...\n");
	s=ListEmpty_DuL(La); 
	printf("▲表La是否为空表: %d   (0:否 1:是)\n\n",s);
	printf("Function 3\n★函数ListInsert_DuL(DuLinkList *L,int i,ElemType e)测试...\n");
    printf("▲请输入准备向La输入的个数:");  
    scanf("%d",&n);
	for(i=1;i<=n;i++)  
    {  
        printf("▲请输入La第%d个数:",i);  
        scanf("%d",&m);  
        s=ListInsert_DuL(&La,i,m);  
        printf("▲插入成功?:%d   (1:成功 0:失败)\n",s);  
    }  
    printf("\n");
	printf("Function 4\n★函数ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L))测试...\n");
	printf("▲La中的元素为:La={");
	ListTraverse_DuL(La,visit);
	printf("}\n\n"); 
	printf("Function 5\n★函数ListLength_DuL(DuLinkList L)测试...\n");
	s=ListLength_DuL(La);  
    printf("▲La的长度为:%d\n\n",s);
	printf("Function 6\n★函数ListDelete_DuL(DuLinkList *L,int i,ElemType *e)测试...\n");
	ListDelete_DuL(&La,3,&e);
	printf("▲删除La中第3个元素:\"%d\"\n",e);  
    printf("▲La中的元素为:La={");
	ListTraverse_DuL(La,visit);
	printf("}\n\n"); 
	printf("Function 7\n★函数GetElem_DuL(DuLinkList L,int i,ElemType *e)测试...\n");
	GetElem_DuL(La,3,&e);
	printf("▲La中第三个位置元素为 \"%d\"\n\n",e); 
	printf("Function 8\n★函数LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e))测试...\n");
	s=LocateElem_DuL(La,5,equal);
	printf("▲La中第一个等于元素\"5\"的位置为 %d\n\n",s);
	printf("Function 9\n★函数PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)测试...\n");
	PriorElem_DuL(La,5,&e);
	printf("▲La中元素\"5\"的前驱为 %d\n\n",e);
	printf("Function 10\n★函数NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)测试...\n");
	NextElem_DuL(La,5,&e);
	printf("▲La中元素\"5\"的后继为 %d\n\n",e);
	printf("Function 11\n★函数ClearList_DuL(DuLinkList *L)测试...\n");
	printf("▲La置空前 :");  
    ListEmpty_DuL(La)?printf("表La为空!!!\n"):printf("表La非空!!!\n");
	ClearList_DuL(&La);
	printf("▲La置空后 :");  
    ListEmpty_DuL(La)?printf("表La为空!!!\n"):printf("表La非空!!!\n");
	printf("Function 12\n★函数DestroyList_DuL(DuLinkList *L)测试...\n");
	printf("▲La销毁前 :");  
    La?printf("表La存  在!!!\n"):printf("表La不存在!!!\n");
	DestroyList_DuL(&La);
	printf("▲La销毁后 :");  
    La?printf("表La存  在!!!\n"):printf("表La不存在!!!\n");
}

//DoubleLinkList.h

typedef struct DuLNode
{
	ElemType data;
	struct DuLNode *prior;
	struct DuLNode *next;
}DuLNode,*DuLinkList;
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e);
Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e);
Status InitList_DuL(DuLinkList *L);
Status DestroyList_DuL(DuLinkList *L);
Status ClearList_DuL(DuLinkList *L);
Status ListEmpty_DuL(DuLinkList L);
Status ListLength_DuL(DuLinkList L);
Status GetElem_DuL(DuLinkList L,int i,ElemType *e);
Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e));
Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
DuLinkList GetElemP_DuL(DuLinkList L,int i);
Status ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L));

Status equal(DuLinkList L,ElemType e);
Status visit(DuLinkList L);


//predefined.h

#include "stdio.h"
#include "stdlib.h"
#define   TRUE           1
#define   FALSE          0
#define   OK             1
#define   ERROR          0
#define   INFEASIBLE    -1
#define   OVERFLOW      -2
typedef   int Status;
typedef   int ElemType;

注意:双循环链表插入和删除操作和单链表的区别!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值