链式存储结构-双向循环链表的初始化、头插法、尾插法、插入、删除(C语言)


双向循环链表
双向循环链表的时间效率很高,当然,用空间换的

双向循环链表时间复杂度
查找头结点O(1)
查找尾结点O(1)
查找第 i 个结点的前驱结点O(1)

双向循环链表示意图
在这里插入图片描述

双向循环链表的定义

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0

typedef int Elemtype;
typedef struct Dulnode {
	Elemtype data;
	struct Dulnode* prior;
	struct Dulnode* next;
}Dulnode;
typedef struct Dulnode* Dulinklist;

初始化

/* 初始化 */
int Initlist(Dulinklist* L)
{
	(*L) = (Dulinklist)malloc(sizeof(Dulnode));

	if ((*L) == NULL) exit(-1);
	(*L)->prior = (*L)->next = (*L);
	return OK;
}

头插法

/* 头插法 */
int Listhead(Dulinklist* L, int i)
{
	int j,data;
	for (j = 1; j <= i; j++)
	{
		Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
		Dulinklist first = (*L)->next;    //第一个结点
		scanf("%d", &data);
		p->data = data;

		//连接p与first
		p->next = first;
		first->prior = p;

		//连接p与头结点
		(*L)->next = p;
		p->prior = (*L);

	}
	return OK;
}

尾插法

/* 尾插法 */
int Listtail(Dulinklist* L, int i)
{
	int j, data;
	for (j = 1; j <= i; j++)
	{
		Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
		Dulinklist tail = (*L)->prior;    //尾结点
		scanf("%d", &data);
		p->data = data;

		//连接p 与 tail
		tail->next = p;
		p->prior = tail;

		//连接p与头结点
		(*L)->prior = p;
		p->next = (*L);
	}
	return OK;
}

在第i个结点前插入一个结点

/* 在第i个结点前插入一个结点 */
int Insertlist(Dulinklist* L, int i)
{
	 
	Dulinklist place = (*L);   //用来定位第 i-1 个结点
	int j = 0;
	while (place->next != (*L) && j < i - 1)
	{
		place = place->next;
		j++;
	}
	if (place->next == (*L) || j > i - 1) return ERROR;

	Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
	Dulinklist placei_ = place->next; //定位第 i 个结点
	int data;
	scanf("%d", &data);
	p->data = data;

	//连接 p 与 第 i-1 个结点
	p->prior = place;
	place->next = p;

	//连接 p 与 第 i 个结点
	p->next = placei_;
	placei_->prior = p;
	return OK;
}

删除第 i 个结点

/* 删除第 i 个结点 */
int Deletelist(Dulinklist* L, int i, Elemtype *e)
{
	Dulinklist place = (*L);   //用来定位第 i-1 个结点
	int j = 0;
	while (place->next != (*L) && j < i - 1)
	{
		place = place->next;
		j++;
	}
	if (place->next == (*L) || j > i - 1) return ERROR;
	Dulinklist placei_ = place->next; //定位第 i 个结点
	*e = placei_->data;

	place->next = placei_->next;
	placei_->next->prior = place;
	free(placei_);
	return OK;
}

总结

线性表
顺序存储结构链式存储结构
单链表静态链表循环链表双向链表
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mirror_zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值