双向循环链表

#define _CRT_SECURE_NO_WARNINGS

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2


typedef int Status;

typedef struct {
	double a;
	int b;
}ElemType;

typedef struct DuLnode {
	ElemType elem;
	struct DuLnode* prior, * next;
}DuLnode, *DuLinkList;


void visit(ElemType e);								
Status InitList(DuLinkList &L);										//初始化链表
Status ListLength(DuLinkList L);									//返回线性表的长度
DuLnode* GetElem(DuLinkList L, int i);								//返回线性表中第i个元素的值
Status ListInsert_Dul(DuLinkList& L, int i, ElemType e);			//双向循环链表的插入
Status ListDelete_Dul(DuLinkList& L, int i, ElemType& e);			//双向循环链表的删除
void ListTraverse(DuLinkList L);									//遍历双向循环链表


int main()
{
	DuLinkList L = NULL;
	InitList(L);

	ElemType elem;
	int sum = 0;
	scanf("%d", &sum);
	for (int i = 0; i < sum; i++)
	{
		scanf("%lf%d", &elem.a, &elem.b);
		ListInsert_Dul(L, i + 1, elem);
	}
	printf("--------------------------------------\n");
	ListTraverse(L);
	printf("--------------------------------------\n");

	ListDelete_Dul(L, 3, elem);
	printf("删除双向循环链表中第3个元素e是:");
	visit(elem);

	printf("--------------------------------------\n");
	ListTraverse(L);
	
	return 0;
}


Status InitList(DuLinkList& L)
{
	L = (DuLinkList)malloc(sizeof(DuLnode));
	L->prior = L->next = L;

	if (!L)
		exit(OVERFLOW);
	return OK;
}


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


DuLnode* GetElem(DuLinkList L, int i)
{
	if (i < 1)
		return L;

	int j = 1;
	DuLnode* p = L->next;
	while (p != L && j < i)
	{
		p = p->next;
		j++;
	}
	if (p == L)
		return L;

	return p;
}


Status ListInsert_Dul(DuLinkList& L, int i, ElemType e)
{
	DuLnode* p = NULL;
	if (!(p = GetElem(L, i)) && ListLength(L))
		return ERROR;
	
	DuLnode* s = (DuLnode*)malloc(sizeof(DuLnode));
	s->elem = e;

	s->prior = p->prior;
	s->next = p;
	p->prior->next = s;
	p->prior = s;
	
	return OK;
}


Status ListDelete_Dul(DuLinkList& L, int i, ElemType& e)
{
	DuLnode* p = L;
	if(!(p = GetElem(L, i)))
		return ERROR;

	e = p->elem;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
	return OK;
}


void visit(ElemType e)
{
	printf("%lf %d\n", e.a, e.b);
}

void ListTraverse(DuLinkList L)
{
	DuLnode* p = L->next;
	while (p != L)
	{
		visit(p->elem);
		p = p->next;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值