数据结构---循环链表

循环链表

最后一个结点的指针域指向头结点

image-20220110143233990

其中空表的指针域不再是空而是指向头结点

判别当前指针是否指向表尾结点判别条件为p!=L,p->next=L。

双向链表

结点中有两个指针域,一个指向直接后继(next),一个指向直接前趋(prior)

image-20220110144602698

其中空表的两个指针都指向本身

双向链表中的循环链表满足d->next->prior = d->prior->next = d

双向链表的基本操作中插入和删除和单向链表不相同

要对两个方向的指针都进行修改

image-20220110145045904

插入结点s其中已知结点p

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

image-20220110145618145

删除结点p

p->prior->next=p->next;

p->next->prior=p->prior;

delete p;

顺序表和链表的比较

顺序表 链表
存储空间的分配 预先分配,元素扩充受到限制,会有存储空间闲置或溢出 动态分配,不会出现存储空间闲置或溢出
存储密度的大小 1,不用额外增加存储开销 <1,需要额外的指针域来存储指针
存取元素的效率 随机存储效率高,O(1) 顺序存储,需遍历链表,O(n)
插入和删除操作的效率 移动多,O(n) 不需要移动,O(1)

顺序表适用于:表长变化不大,习惯按元素位置访问数据元素,很少进行插入和删除

链表适用于:表长变化大,频繁进行插入和删除

代码实现

#include<iostream>
using namespace std;
typedef struct DuLNode
{
	int data;
	struct DuLNode* prior;
	struct DuLNode* next;
}DuLNode, * DuLinkList;
bool InitDuLinkList(DuLinkList& L)
{
	L = new DuLNode;
	L->next = L;
	L->prior= L;
	return true;
}
DuLNode* CreatDuLinkList(DuLinkList& L,int n)
{
	L = new DuLNode;
	cin >> L->data;
	DuLNode* q = L;
	for (int i = 1; i < n; i++)
	{
		DuLNode*p = new DuLNode;
		cin >> p->data;
		p->next = NULL;
		q->next = p;
		p->prior = q;
		q = q->next;

	}
	return L;
}
void ShowDuLinkList(DuLinkList& L)
{
	DuLNode* p = L;
	while (p != NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
	p = L;
	while (p->next != NULL)
		p = p->next;
	DuLNode* q = p;
	while (q != NULL)
	{
		cout << q->data << " ";
		q = q->next;
	}
}
bool GetElem_DuL(DuLinkList L, int i, int& e)
{
	DuLNode*p = L->next; int j = 1;
	{
		p = p->next; 
			++j;
	}
	if (!p||j > i)return false;
		e = p->data;
		return true;
}
bool Listinsert_DuL(DuLinkList& L, int i, int e)
{
	DuLNode* p;
	DuLNode* s;
	if (! ( GetElem_DuL(L, i,e)))
		return false;
	s = new DuLNode;
	s->data = e;
	s->prior = p->prior;
	p->prior->next = s;
	return true;
}

bool ListDelete_DuL(DuLinkList& L, int i,int e)
{
	DuLNode* p;
	if (!(GetElem_DuL(L, i,e)))
		return false;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p;
	return true;
}
int main()
{
	int n;
	cin >> n;
	DuLNode* L = CreatDuLinkList(L, n);
	ShowDuLinkList(L);
	Listinsert_DuL(L, 6, 3);
	ShowDuLinkList(L);
	ListDelete_DuL(L, 4,3);
	ShowDuLinkList(L);
	return 0;
}

posted on 2022-02-06 17:09  眉目作山河  阅读(158)  评论(0编辑  收藏  举报

导航