C++ realiza a operação básica da lista encadeada circular

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;
}

おすすめ

転載: blog.csdn.net/henry594xiaoli/article/details/124083263