从0开始的数据结构的书写-------线性表(双向循环链表)

该篇文章介绍了如何不使用C++STL库,而是基于严蔚敏数据结构,通过malloc和realloc动态内存,实现了一个包含双向和循环的链表,包括头插法、尾插法、插入、删除节点以及获取节点前驱和后继的功能。
摘要由CSDN通过智能技术生成

(复习考研的休息区,心血来潮,写点代码)

三个规则:

1、不使用c++ stl库进行书写

2、最好基于严蔚敏老师的数据结构

3、最好使用malloc和realloc动态分配内存

(如果有问题或者是有没有实现的操作,请大家提出来)

一个链表直接包含双向和循环的

// 链表实现 
#include<iostream>
#include<cstring>

using namespace std;

const int INF = 0x3f3f3f3f3f;
#define N 100
#define M 10 
#define OK true 
#define ERROR false

typedef struct DuLNode
{
	// 单链表 
	int data;
	struct DuLNode *ne;
	struct DuLNode *prior;
}DuLNode , *DuLinkList;


void InitList(DuLinkList &L)
{
	L = (DuLinkList)malloc(sizeof(DuLNode));
	L -> data = INF;
	// 循环的是指向自己即可 
	L -> prior = L -> ne = L;// 建立带头节点的单链表 
}

// 头插法 
void HeadInsert(DuLinkList &L)
{
	DuLinkList now = L;
	for(int i = 1;i <= M;i ++)
	{
		DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));
		p -> data = i;
		p -> ne = now -> ne;
		now -> ne -> prior = p;
		now -> ne = p;
		p -> prior = now;
		
	}
} 

// 尾插法
void TailInsert(DuLinkList &L)
{
	DuLinkList head = L , tail = L -> prior;
	for(int i = 1;i <= M;i ++)
	{
		DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));
		p -> data = i;
		tail -> ne = p;
		p -> prior = tail;
		p -> ne = head;
		head -> prior = p;
		tail = tail -> ne; // 注意尾部在变化 
	}
} 

// 插入到第idx位置 
bool InsertList(DuLinkList &L , int idx , int e)
{
	DuLinkList p = L -> ne;
	idx --; 
	int i = 0;
	while(p != L && i < idx - 1) 
	{
		p = p -> ne;
		i ++;
	}
	if(i > idx - 1) return ERROR;
	
	cout << "插入数据" << e << endl; 
	DuLinkList s = (DuLinkList) malloc(sizeof(DuLNode));
	s -> data = e;
	s -> ne = p -> ne;
	p -> ne -> prior = s;
	p -> ne = s;
	s -> prior = p;
	return OK; 
}

// 删除节点 
int DeleteList(DuLinkList &L , int idx)
{
	DuLinkList p = L -> ne;
	int i = 0;
	idx --;
	while(p != L && i < idx - 1)
	{
		p = p -> ne;
		i ++;
	}
	if(i > idx - 1) return ERROR;
	
	int e = p -> ne -> data;
	cout << "删除节点" << e << endl; 
	p -> ne = p -> ne -> ne;
	p -> ne -> prior = p;
	return e;
}

// idx节点的前驱和后继 
pair<int , pair<int , int>> GetElem(DuLinkList L , int idx)
{
	DuLinkList p = L -> ne;
	int i = 0;
	while(p != L && i < idx - 1)
	{
		p = p -> ne;
		i ++;
	}
	return {(p -> prior -> data == INF) ? p -> prior -> prior -> data : p -> prior -> data , 
	{p -> data , 
	(p -> ne -> data == INF) ? p -> ne -> ne -> data : p -> ne -> data}};
} 

void print(DuLinkList L)
{
	DuLinkList p = L;
	cout << "当前链表数据为:";
	p = p -> ne;
	bool f = false;
	while(p != L) // 注意结束条件因为循环所以会不停的输出 
	{
		if(f) cout << "->";
		cout << p -> data;
		f = true;
		p = p -> ne;
	}
	cout << endl;
}

void printdata(auto t){printf("当前节点的值是%d , 前驱节点的值是%d , 后继几点的值是%d\n" , t.second.first , t.first , t.second.second);}

int main()
{
	DuLinkList L;
	InitList(L);
	// HeadInsert(L);
	TailInsert(L);
	print(L);
	
	// 从1开始编号 
	InsertList(L , 3 , 11);
	print(L);
	InsertList(L , 7 , 12);
	print(L);
	
	// 从1开始编号 
	DeleteList(L , 5);
	print(L);
	DeleteList(L , 4);
	print(L);
	
	auto t = GetElem(L , 6);
	printdata(t);
	t = GetElem(L , 4);
	printdata(t);
	t = GetElem(L , 1);
	printdata(t);
	t = GetElem(L , 10);
	printdata(t);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值