数据结构---循环链表
循环链表
最后一个结点的指针域指向头结点
其中空表的指针域不再是空而是指向头结点
判别当前指针是否指向表尾结点判别条件为p!=L,p->next=L。
双向链表
结点中有两个指针域,一个指向直接后继(next),一个指向直接前趋(prior)
其中空表的两个指针都指向本身
双向链表中的循环链表满足d->next->prior = d->prior->next = d
双向链表的基本操作中插入和删除和单向链表不相同
要对两个方向的指针都进行修改
插入结点s其中已知结点p
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
删除结点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;
}