双向循环链表的建立及操作

一、代码如下

/*
项目名称:双向循环链表的建立与基本操作

编译环境:VC++ 2008

作者相关:。。。

最后修改:2019.6.19


学习目标:判空、求长、获取元素位置、返回某个位置的元素、插入元素、删除元素、清空链表、销毁链表

注意事项:1.测试所有功能是否正常



*/
#include <stdio.h>
#include <stdlib.h>

#define  OK     1
#define  ERROR  0
#define  TRUE   true
#define  FALSE  false

typedef int   ElemType;
typedef bool  Status;


typedef struct DuLNode{

	ElemType data;
	struct DuLNode *prior;
	struct DuLNode *next;

}DuLNode,*DuLinkList;

Status Create_DuLNode(DuLinkList *L);

Status Init_DuL(DuLinkList *L);

Status Empty_DuL(DuLinkList L);

int Length_DuL(DuLinkList L);

Status Insert_DuL(DuLinkList *L,int i,ElemType e);

Status GetElem_DuL(DuLinkList L,int i,ElemType *e);

int Locate_DuL(DuLinkList L,ElemType e);

Status Delete_DuL(DuLinkList *L,int i,ElemType *e);

Status Clear_DuL(DuLinkList *L);

Status Destroy_DuL(DuLinkList *L);

void Out_List(DuLinkList L);


int main()
{
	DuLinkList L1;
	ElemType e;

	Create_DuLNode(&L1);
	Init_DuL(&L1);

	if(Empty_DuL(L1))
		printf("双向循环链表为空!\n\n");
	else
		printf("双向循环链表非空!\n\n");

	int length;
	length = Length_DuL(L1);
	printf("双向循环链表的长度为: %d\n\n",length);

	for(int i=1;i<10;i++)
	{
		Insert_DuL(&L1,1,i);
	}
	Out_List(L1);

	GetElem_DuL(L1,4,&e);
	printf("第4个元素是: %d \n\n",e);

	int k = Locate_DuL(L1,7);
	printf("元素7的位置是: %d\n\n",k);

	Delete_DuL(&L1,3,&e);
	printf("删除的第3个元素为: %d\n\n",e);
	Out_List(L1);

	if(Clear_DuL(&L1))
		printf("双向循环链表已清空!\n\n");

	if(Empty_DuL(L1))
		printf("双向循环链表为空!\n\n");
	else
		printf("双向循环链表非空!\n\n");

	if(Destroy_DuL(&L1))
		printf("双向循环链表已被销毁!\n\n");

	return 0;
}

Status Create_DuLNode(DuLinkList *L)
{
	(*L)=(DuLinkList)malloc(sizeof(DuLNode));
	if(!L)
		return ERROR;
	else
		return OK;

}

Status Init_DuL(DuLinkList *L)
{
	if(!Create_DuLNode(L))
		return ERROR;
	else
	{
		(*L)->next  = *L;
		(*L)->prior = *L;

		return OK; 
	}
}

Status Empty_DuL(DuLinkList L)
{
	if(L->next == L)
		return TRUE;
	else
		return FALSE;
}

int Length_DuL(DuLinkList L)
{
	int length = 0;
	DuLinkList p = L->next;

	while(p != L)
	{
		++length;
		p = p->next;
	}

	return length;
}

Status Insert_DuL(DuLinkList *L,int i,ElemType e)
{
	if(i<1||i>Length_DuL(*L)+1)
	{
		printf("i的值必须合法!\n");	  
		return ERROR;
	}
	DuLinkList p = *L;//*L与p是同类型的指针,进行的是赋值操作,相当于p引用*L
	DuLinkList s;

	int j = 1;
	while(j<i)
	{
		p=p->next;
		++j;
	}

	if(Create_DuLNode(&s))//创建结点成功
	{
		s->data = e;
		s->next = p->next;
		p->next->prior = s;
		s->prior = p;
		p->next  = s;
	}
	else//创建结点失败
		return ERROR;

	return OK;
}

//e返回链表中第i个数据元素的值
Status GetElem_DuL(DuLinkList L,int i,ElemType *e)
{
	if(i<1||i>Length_DuL(L))
		return ERROR;
	DuLinkList p = L->next;
	int j = 1;
	while(j<i)
	{
		p = p->next;
		++j;
	}
	*e = p->data;
	return OK;
}

//获取元素的位置
int Locate_DuL(DuLinkList L,ElemType e)
{
	DuLinkList p = L->next;
	int k =1;
	while(p!=L)
	{
		if(p->data==e)
			break;
		else
		{
			++k;
			p=p->next;
		}
	}
	return k;
}

//删除第i个元素的位置
Status Delete_DuL(DuLinkList *L,int i,ElemType *e)
{
	if(i<1||i>Length_DuL(*L))
	{
		printf("i的值必须合法!\n");
		return ERROR;
	}
	DuLinkList p = *L;//相当于p引用*L
	int j = 0;
	while(j<i)
	{
		p=p->next;
		++j;
	}
	*e = p->data;
	p->prior->next=p->next;
	p->next->prior=p->prior;
	free(p);

	return OK;

}

Status Clear_DuL(DuLinkList *L)
{
	DuLinkList p,q;
	p = (*L)->next;

	while(p != *L)
	{
		q = p->next;
		free(p);
		p = q;
	}

	(*L)->next = *L;

	return OK;
}

Status Destroy_DuL(DuLinkList *L)
{
	Clear_DuL(L);
	free(*L);

	return OK;
}

void Out_List(DuLinkList L)
{
	DuLinkList p = L->next;

	printf("双向循环链表内容: ");
	while(p!=L)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n\n");

}

二、效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值