数据结构——循环链表和企业链表

数据结构——循环链表和企业链表

循环链表

单链表只能从头结点开始遍历整个链表,若希望从任意结点开始遍历整个链表,则需要用循环链表,即首尾相接。
在这里插入图片描述
循环链表的插入和删除操作,如下:
在这里插入图片描述
设置结点结构体:

struct  LinkNode
{
	LinkNode* Next;
	int data;
};

设置链表类:

class LinkList
{
public:
	LinkList();
	void Insert_LinkList(int pos,int value);
	void Removepos_LinkList(int pos);
	void Remove_LinkList(int value);
	int GetSize_LinkList();
	int Find_LinkList(int value);
	void Free_LinkList();
	void Print_LinkList();
	void inverse();
	~LinkList();

	LinkNode* head;
	int size;
};

1.初始化
注意:初始化时头结点的下一个结点是它自身 this->head->Next = this->head;

LinkList::LinkList()
{
	this->head = new LinkNode;
	this->head->Next = this->head;
	this->size = 0;
}

2.插入

void LinkList::Insert_LinkList(int pos, int value)
{
	if (pos<0 || pos > this->size)
	{
		cout << "位置插入有误" << endl;
	}
	LinkNode* newP = new LinkNode;
	newP->data = value;
	newP->Next = NULL;
	LinkNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->Next;
	}
	newP->Next = pCurrent->Next;
	pCurrent->Next = newP;
	this->size++;
}

3.按位置删除

void LinkList::Removepos_LinkList(int pos)
{
	if (pos<0 || pos > this->size)
	{
		cout << "位置插入有误" << endl;
	}
	LinkNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->Next;
	}
	LinkNode* Delep = pCurrent->Next;
	pCurrent->Next = Delep->Next;
	this->size--;
}

4.按元素删除

void LinkList::Remove_LinkList(int value)
{
	LinkNode* pCurrent = this->head->Next;
	int idx = 0;
	for (int i = 0; i < this->size; i++)
	{
		if (pCurrent->data==value)
		{
			break;
		}
		idx++;
		pCurrent = pCurrent->Next;
	}
	Removepos_LinkList(idx);
}

5.寻找

int LinkList::Find_LinkList(int value)
{
	LinkNode* pCurrent = this->head->Next;
	int idx = 0;
	int flag = -1;
	for (int i = 0; i < this->size; i++)
	{
		if (pCurrent->data == value)
		{
			flag = idx;
			break;
		}
		idx++;
		pCurrent = pCurrent->Next;
	}
	return flag;
}

6.打印

void LinkList::Print_LinkList()
{
	LinkNode* pCurrent = this->head->Next;
	for (int i = 0; i < this->size*3; i++)
	{
		if (pCurrent==this->head)
		{
			pCurrent = pCurrent->Next;
		}
		cout << pCurrent->data << "  ";
		pCurrent = pCurrent->Next;
		if ((i+1)%this->size==0)
		{
			cout << endl;
		}
	}
	cout << endl;
}

7.逆置

void LinkList::inverse()
{
	LinkNode* temp;
	LinkNode* p = this->head->Next;
	head->Next = this->head;
	while (p!=this->head)
	{
		temp = p->Next;
		p->Next = this->head->Next;
		head->Next = p;
		p = temp;
	}
}

8.释放

void LinkList::Free_LinkList()
{
	LinkNode* pCurrent = this->head->Next;
	LinkNode* temp;
	while (pCurrent!=this->head)
	{
		temp = pCurrent->Next;
		delete pCurrent;
		pCurrent = temp;
	}
	this->head->Next = this->head;
	this->size = 0;
	cout << "The LinkList has empty!" << endl;
}

企业链表

在这里插入图片描述
可以储存各种元素类型,同时,不需要修改来链表的结构

企业链表的结点只有指针域,没有数据域。数据域是挂载指针域下面的。
同样头结点为空节点。
在这里插入图片描述
定义结点结构体

struct LinkNode
{
	LinkNode* next;
};

定义数据域结构体

struct MyData
{
	LinkNode node;
	int value;
};
此处定义为int类型,使用时可定义其他类型,或自定义数据类型

定义企业链表类

class LinkList
{
public:
	LinkList();
	void Insert_LinkList(int pos, LinkNode* data);
	void Remove_LinkList(int pos);
	int Find_LinkList(MyData* data);
	int GetSize_LinkList();
	void Print_LinkList();
	MyData* Front_LinkList();
	//void Free_LinkList();
	~LinkList();

	LinkNode* head;
	int size;

};

1.插入

void LinkList::Insert_LinkList(int pos, LinkNode* data)
{
	if (pos<0||pos>this->size)
	{
		pos = this->size;
	}
	LinkNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	data->next = pCurrent->next;
	pCurrent->next = data;
	this->size++;
}

2.删除

void LinkList::Remove_LinkList(int pos)
{
	if (this->head->next==NULL)
	{
		std::cout << "链表为空" << std::endl;
	}
	if (pos<0 || pos>this->size)
	{
		std::cout << "删除位置错误" << std::endl;
	}
	LinkNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	LinkNode* Delep = pCurrent->next;
	pCurrent->next = Delep->next;
	this->size--;
}

3.查找

int LinkList::Find_LinkList(MyData* data)
{
	if (this->head->next == NULL)
	{
		std::cout << "链表为空" << std::endl;
	}
	LinkNode* pCurrent = this->head->next;
	int idx = 0;
	int flag = -1;
	while (pCurrent!=NULL)
	{
		if (data==(MyData*)pCurrent)
		{
			flag = idx;
			break;
		}
		idx++;
	}
	return flag;
}

4.打印

void LinkList::Print_LinkList()
{
	LinkNode* pCurrent = this->head->next;
	if (pCurrent == NULL)
	{
		std::cout << "链表为空" << std::endl;
	}
	while (pCurrent != NULL)
	{
		MyData* p = (MyData*)pCurrent;
		std::cout << p->value << "  ";
		pCurrent = pCurrent->next;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值