Objetivo: Compreender a estrutura de armazenamento da lista circular encadeada e dominar o projeto de vários algoritmos básicos de operação em lista encadeada circular.
Conteúdo: Realize várias operações básicas de lista encadeada circular e algoritmo geral de construção de tabelas. (Suponha que o tipo de elemento ElemType da lista circular vinculada individualmente seja char)
Requisitos do programa:
1. Inicialize a lista circular encadeada individualmente h.
2. Insira os elementos a, b, c, d e e em sequência usando o método de inserção de cauda.
3. Emita a lista circular vinculada individualmente h.
4. Exiba o comprimento da lista circular vinculada individualmente h.
5. Determine se a lista circular encadeada h está vazia.
6. Emita os elementos da lista circular vinculada individualmente h de acordo com a posição inserida pelo usuário.
7. De acordo com a entrada do elemento pelo usuário, imprima a posição do elemento da lista circular vinculada individualmente h.
8. Insira um novo elemento na lista circular vinculada individualmente h de acordo com a posição e o elemento inserido pelo usuário.
9. Emita a lista circular vinculada individualmente h.
10. De acordo com a posição inserida pelo usuário, exclua o elemento correspondente da lista circular vinculada individualmente h.
11. Gere a lista circular vinculada individualmente h.
12. Libere a lista circular vinculada individualmente h.
-------------------------------------------------- ---------------------------------------------
Defina a estrutura de dados da lista circular vinculada individualmente
#include <iostream>
using namespace std;
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *next;
} LinkList;
1. Inicialize a lista circular vinculada individualmente
void InitList(LinkList *&L)
{
L= new LinkList;
L->next=L;
}
2. Método de inserção de cauda para construir a tabela
O último nó aponta para o nó principal, formando uma lista circular encadeada individualmente.
void CreateListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
L = new LinkList;
r = L;
for (int i=0;i<n;i++)
{
s = new LinkList;
s->data = a[i];
r->next = s;
r = s;
}
r->next = L;
}
3. Destrua a lista circular encadeada individualmente
No final, apenas o nó principal e o nó final são deixados sem exclusão, pre é o nó final e p é o nó principal, portanto, dois nós precisam ser excluídos após o término do loop.
void DestroyList(LinkList *&L)
{
LinkList *pre=L->next,*p=pre->next;
while (p != L)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
delete p;
}
4. Determine se a lista circular vinculada individualmente é uma lista vazia
bool ListEmpty(LinkList *L)
{
return (L->next==L);
}
5. Encontre o comprimento da lista circular encadeada individualmente
int ListLength(LinkList *L)
{
int count = 0;
LinkList *p=L->next;
while (p != L)
{
count ++;
p = p->next;
}
return count;
}
6. Saída circular de lista encadeada individualmente
void DispList(LinkList *L)
{
LinkList *p=L->next;
while (p != L)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
7. Encontre o valor de um elemento de dados
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0; LinkList *p=L;
while (j < i && p->next != L)
{
j ++;
p = p->next;
}
if (i<1 || i>j)
return false;
e = p->data;
return true;
}
8. Encontre pelo valor do elemento
int LocateElem(LinkList *L, ElemType e)
{
LinkList *p=L->next;
int i=1;
while (p != L && p->data != e)
{
i ++;
p = p->next;
}
if (p == L)
return 0;
else
return i;
}
9. Insira elementos de dados
//8.插入数据元素
bool ListInsert(LinkList *&L,int i,ElemType e)
{
if (i < 1) return false;
int j=0; LinkList *p=L,*s;
if (i==1)
{
s = new LinkList;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
else
{
while (j < i-1 && p->next!=L)
{
j ++;
p = p->next;
}
if (i > j+1 || p==L)
return false;
s = new LinkList;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
10. Excluir elementos de dados
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
if (i < 1) return false;
int j=0;
LinkList *p=L,*q;
if (i==1)
{
q = p->next;
e = q->data;
p->next = q->next;
delete q;
return true;
}
else
{
while (j < i-1 && p->next!=L)
{
j ++;
p = p->next;
}
if (p->next==L)
return false;
q = p->next;
e = q->data;
p->next = q->next;
delete q;
return true;
}
}
-------------------------------------------------- ---------------------------------------------
função principal
int main()
{
LinkList *L1;
cout<<"1.初始化循环链表:"<<endl;InitList(L1);
cout<<"\n2.尾插法建表:"<<endl;
ElemType a[5]={'A','B','C','D','E'};
for(int i=0;i<5;i++)
if(!ListInsert(L1,i+1,a[i]))
cout<<"插入失败!";
cout<<"\n3.循环链表的元素为:";
DispList(L1);
cout<<"\n4.该循环链表的长度为:"<<ListLength(L1)<<endl;
cout<<"\n5.该循环链表 ";
if(ListEmpty(L1))
cout<<"为空!"<<endl;
else
cout<<"不为空!"<<endl;
cout<<"\n6.取元素..........."<<endl;
ElemType temp;cout<<"请输入取的位置:";int k;cin>>k;
if(GetElem(L1,k,temp))
cout<<"取值成功,该循环链表的第"<<k<<"个元素的值为:"<<temp<<endl;
else
cout<<"取值失败,你输入的位置"<<k<<"越界:"<<endl;
cout<<"\n7.查找元素:"<<endl<<"请输入查找元素的值:";cin>>temp;
if(LocateElem(L1,temp))
cout<<"输出元素'"<<temp<<"'的位置为:"<<LocateElem(L1,temp)<<endl;
else
cout<<"元素'"<<temp<<"'不存在."<<endl;
cout<<"\n8.在循环链表指定位置插入元素 :"<<endl;
cout<<"请输入插入的位置:";cin>>k;
cout<<"请输入插入元素的值:";cin>>temp;
if(ListInsert(L1,k,temp))
cout<<"插入成功"<<endl;
else
cout<<"插入失败!"<<endl;
cout<<"\n9.输出循环链表"<<endl;
DispList(L1);
cout<<"\n10.删除循环链表指定位置的元素"<<endl;
cout<<"请输入删除的位置:";cin>>k;
if(ListDelete(L1,k,temp))
cout<<"删除成功,删除的元素为:"<<temp<<endl;
else
cout<<"删除失败!"<<endl;
cout<<"\n11.输出循环链表"<<endl;
DispList(L1);
cout<<"\n12.释放循环链表"<<endl;
DestroyList(L1);
return 0;
}