Estrutura de Dados
Autoria: Carlos Eduardo Cayres | 4
osemestre
Tema 05
Lista
Tema 05
Lista
Autoria: Carlos Eduardo CayresComo citar esse documento:
CAYRES, Carlos Eduardo. Estrutura de Dados: Lista. Caderno de Atividades. Valinhos: Anhanguera Educacional, 2014.
Índice
$QKDQJXHUD (GXFDFLRQDO 3URLELGD D UHSURGXomR ¿QDO RX SDUFLDO SRU TXDOTXHU PHLR GH LPSUHVVmR HP IRUPD LGrQWLFD UHVXPLGD RX PRGL¿FDGD HP OtQJXD SRUWXJXHVDRXTXDOTXHURXWURLGLRPD
Pág. 31
Pág. 32 Pág. 33
Pág. 32 Pág. 28 Pág. 27
ACOMPANHE
NA
WEB
Pág. 3CONVITE
À
LEITURA
3
Este tema apresenta a estrutura de dados do tipo lista, uma estrutura de programação muito utilizada em programação. Apresentaremos conceitos de lista, introduziremos seu uso em C com vários exemplos práticos.
A estrutura de dados do tipo lista pode ser representada em cinco tipos diferentes, e cada um pode ser implementado de forma estática ou dinâmica: lista simplesmente encadeada e não ordenada, lista simplesmente encadeada e ordenada, lista duplamente encadeada e não ordenada, lista duplamente encadeada e ordenada e listas circulares.
A estrutura de dados do tipo lista, a depender de ser homogênea ou heterogênea, pode armazenar somente um ou YiULRVGDGRV&RPUHODomRjOLVWDYHUHPRVDVRSHUDo}HVGHLQVHUomRFRQVXOWDUHPRomRHHVYD]LDPHQWRGD¿OD 3DUD¿QDOL]DUKiDOJXQVH[HUFtFLRVSDUDUHIRUoDURFRQWH~GRHVWXGDGRUHIHUHQWHjHVWUXWXUDGHGDGRVGRWLSROLVWD
POR
DENTRO
DO
TEMA
Lista
2WUDEDOKRFRPFRQMXQWRVGHGDGRVTXHSRGHPUHSUHVHQWDUFROHo}HVGHQ~PHURVGDGRVGHXPFOLHQWHGDGRVGH um fornecedor, entre outros, é muito difundido e importante para a Computação.
Esses conjuntos podem ser chamados de conjuntos dinâmicos, pois os algoritmos que os manipulam fazem com que eles aumentem, diminuam ou sofram alterações durante sua manipulação. Algumas operações sobre os conjuntos dinâmicos podem ser: inserir elemento, excluir elemento, buscar elemento, encontrar o maior, o menor, somar elementos, alterar elementos, entre outras.
A estrutura de dados do tipo lista representa um conjunto de dados organizados em ordem linear. Quando a estrutura lista é representada por um arranjo, ou seja, quando se utilizam vetores na representação, tem-se o uso de endereços
POR
DENTRO
DO
TEMA
FRQWtJXRVGHPHPyULDGRFRPSXWDGRUHDRUGHPOLQHDUpGHWHUPLQDGDSHORVtQGLFHVGRYHWRURTXHH[LJHXPPDLRU esforço computacional em algumas situações. Tal representação denomina-se lista estática.
Quando a estrutura lista é representada por elementos que, além de conter o dado, possuem também um ponteiro para RSUy[LPRHOHPHQWRRXVHMDHOHPHQWRVHQFDGHDGRVWHPVHDUHSUHVHQWDomRGHQRPLQDGDOLVWDGLQkPLFD
Tipos de Lista e Exemplos em C
Lista Simplesmente Encadeada e Não Ordenada
Na estrutura do tipo lista simplesmente encadeada e não ordenada, cada elemento pode armazenar um ou mais dados (estrutura homogênea ou heterogêneaUHVSHFWLYDPHQWHHXPSRQWHLURSDUDRSUy[LPRHOHPHQWRTXHSHUPLWH
RHQFDGHDPHQWRHPDQWpPDHVWUXWXUDOLQHDU$VHJXLUDSUHVHQWDVHXPH[HPSORFRPDVRSHUDo}HVLQVHULUQRLQtFLR GDOLVWDLQVHULUQR¿PFRQVXOWDUWRGDDOLVWDFRQVXOWDUXPQ~PHURQDOLVWDUHPRYHUXPHOHPHQWRTXDOTXHUHHVYD]LiOD Exemplo:
#include <iostream> #include <stdio.h>
int main() {
struct lista {
int num; lista *prox;
};
OLVWDLQLFLR¿PDX[DX[ inicio=NULL;
int op,qtde,nc,achou; do
{
5
printf(“\nMENU”);
printf(“\n1 - Inserir no inicio”); SULQWI³?Q,QVHULUQR¿P´ printf(“\n3 - Consultar toda a lista”); printf(“\n4 - Consultar um n§ da lista”); printf(“\n5 - Excluir n§ da lista”); printf(“\n6 - Esvaziar a lista”); printf(“\n7 - Sair”);
printf(“\nDigite a opcao: “); scanf(“%d”, &op);
if (op<1||op>7)
printf(“\nOpção inválida.\n”); else
{
if (op==1)
{
aux=new(lista);
SULQWI³?Q'LJLWHXPQ~PHUR³
scanf(“%d”, &aux->num); if (inicio==NULL)
¿P DX[
aux->prox=inicio;
inicio=aux;
SULQWI³?Q1~PHURLQVHULGR?Q´
}
LIRS
{
aux=new(lista);
SULQWI³?Q'LJLWHXPQ~PHUR³ scanf(“%d”, &aux->num); if (inicio==NULL)
inicio=aux;
else
¿P!SUR[ DX[
¿P DX[
¿P!SUR[ 18//
SULQWI³?Q1~PHURLQVHULGR?Q´
}
if (op==3)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
printf(“%d\n”, aux->num);
aux=aux->prox;
}
}
}
if (op==4)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
qtde=0;
SULQWI³?Q'LJLWHRQ~PHURDVHUFRQVXOWDGR³ scanf(“%d”, &nc);
aux=inicio;
while (aux!=NULL)
{
if (aux->num==nc)
qtde++;
aux=aux->prox;
}
if (qtde==0)
SULQWI³?Q1~PHURQmRHQFRQWUDGR?Q´
7
else if (qtde==1)
SULQWI³?Q1~PHURGDSDUHFHYH]?Q´QF
else
SULQWI³?Q1~PHURGDSDUHFHGYH]HV?Q´QFTWGH
}
}
if (op==5)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
SULQWI³?Q'LJLWHRQ~PHURTXHGHVHMDH[FOXLU³ scanf(“%d”, &nc);
aux=inicio;
achou=0;
while (aux!=NULL)
{
if (aux->num==nc)
{
achou++;
if (aux==inicio)
{
inicio=aux->prox;
delete(aux);
aux=inicio;
}
HOVHLIDX[ ¿P
{
DX[ LQLFLR
ZKLOHDX[!SUR[ DX[
DX[ DX[!SUR[
delete(aux);
¿P DX[
¿P!SUR[ 18//
aux=NULL;
}
else
{
DX[ LQLFLR
ZKLOHDX[!SUR[ DX[
DX[ DX[!SUR[
DX[!SUR[ DX[!SUR[
delete(aux);
DX[ DX[!SUR[
}
}
else
aux=aux->prox;
}
if (achou==0)
SULQWI³?Q1Q~PHURQmRH[LVWHQDOLVWD?Q´ else if (achou==1)
SULQWI³?Q)RLH[FOXtGDGRFRUUrQFLDGRQQ~PHURG?Q´DFKRXQF
else
SULQWI³?Q)RUDPH[FOXtGDVGRFRUUrQFLDVGRQ~PHURG?Q´DFKRXQF
}
}
if (op==6)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
9
inicio=inicio->prox;
delete(aux);
aux=inicio;
}
printf(“\nLista esvaziada.\n”);
}
}
}
system(“PAUSE”); }while (op!=7); }
Lista Simplesmente Encadeada e Ordenada
Na estrutura do tipo lista simplesmente encadeada e ordenada, cada elemento pode armazenar um ou mais dados (estrutura
homogênea RXKHWHURJrQHDUHVSHFWLYDPHQWHHXPSRQWHLURSDUDRSUy[LPRHOHPHQWRTXHSHUPLWHRHQFDGHDPHQWR
e mantém a estrutura linear. Tem-se, também, um campo denominado chave, por meio do qual determinada ordenação é mantida. Apresenta-se um exemplo com as seguintes operações: inserir na lista, consultar toda a lista, consultar um Q~PHURQDOLVWDUHPRYHUXPHOHPHQWRTXDOTXHUHHVYD]LiOD
Exemplo:
#include <iostream> #include <stdio.h> int main() {
struct lista {
int num; lista *prox; };
OLVWDLQLFLR¿PDX[DX[ inicio=NULL;
int op,qtde,nc,achou; do
{
system(“CLS”); printf(“\nMENU”);
printf(“\n1 - Inserir na lista”); SULQWI³?Q&RQVXOWDUWRGDDOLVWD´ printf(“\n3 - Consultar um n§ da lista”); printf(“\n4 - Excluir nº da lista”); printf(“\n5 - Esvaziar a lista”); printf(“\n6 - Sair”);
printf(“\nDigite a opcao: “); scanf(“%d”, &op);
if (op<1||op>6)
printf(“\nOpcao invalida.\n”); else
{
if (op==1)
{
aux=new(lista);
printf(“\nDigite o numero a ser inserido: “); scanf(“%d”, &aux->num);
if (inicio==NULL)
{
¿P DX[
aux->prox=inicio;
inicio=aux;
}
else if (aux->num <= inicio->num)
{
aux->prox=inicio;
inicio=aux;
}
HOVHLIDX[!QXP! ¿P!QXP
{
11
¿P!SUR[ DX[
aux->prox=NULL;
¿P DX[
}
else //insercao no meio
{
DX[ LQLFLR
ZKLOHDX[!SUR[!QXPDX[!QXP
DX[ DX[!SUR[
DX[!SUR[ DX[!SUR[
DX[!SUR[ DX[
}
printf(“\nNumero inserido.\n”);
}
LIRS
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
printf(“%d\n”, aux->num);
aux=aux->prox;
}
}
}
if (op==3)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
DENTRO
TEMA
{
qtde=0;
printf(“\nDigite o nº a ser consultado: “); scanf(“%d”, &nc);
aux=inicio;
while (aux!=NULL && aux->num<=nc)
{
if (aux->num==nc)
qtde++;
aux=aux->prox;
}
if (qtde==0)
printf(“\nNº nao encontrado.\n”);
else if (qtde==1)
SULQWI³?Q1~PHURGDSDUHFHYH]?Q´QF
else
SULQWI³?Q1~PHURGDSDUHFHGYH]HV?Q´QFTWGH
}
}
if (op==4)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
printf(“\nDigite o numero que deseja excluir: “); scanf(“%d”, &nc);
aux=inicio;
achou=0;
while (aux!=NULL && aux->num<=nc)
{
if (aux->num==nc)
{
achou++;
13
if (aux==inicio)
{
inicio=aux->prox;
delete(aux);
aux=inicio;
}
HOVHLIDX[ ¿P
{
DX[ LQLFLR
ZKLOHDX[!SUR[ DX[
DX[ DX[!SUR[
delete(aux);
¿P DX[
¿P!SUR[ 18//
aux=NULL;
}
else
{
DX[ LQLFLR
ZKLOHDX[!SUR[ DX[
DX[ DX[!SUR[
DX[!SUR[ DX[!SUR[
delete(aux);
DX[ DX[!SUR[
}
}
else
aux=aux->prox;
}
if (achou==0)
printf(“\nNumero não encontrado.\n”); else if (achou==1)
SULQWI³?Q)RLH[FOXtGDGRFRUUrQFLDGRQQ~PHURG?Q´DFKRXQF
else
SULQWI³?Q)RUDPH[FOXtGDVGRFRUUrQFLDVGRQ~PHURG?Q´DFKRXQF
}
}
if (op==5)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
inicio=inicio->prox;
delete(aux);
aux=inicio;
}
printf(“\nLista esvaziada.\n”);
}
}
}
system(“PAUSE”); }while (op!=6);
}
Lista Duplamente Encadeada e Não Ordenada
Na estrutura do tipo lista duplamente encadeada e ordenada, cada elemento pode armazenar um ou mais dados HVWUXWXUD KRPRJrQHD RX KHWHURJrQHD UHVSHFWLYDPHQWH H GRLV SRQWHLURV 2 SULPHLUR SDUD R SUy[LPR HOHPHQWR H o segundo para o elemento anterior. Esses ponteiros permitem o duplo encadeamento e mantêm a estrutura linear. $SUHVHQWDVHXPH[HPSORFRPDVVHJXLQWHVRSHUDo}HVLQVHULUQRLQtFLRGDOLVWDLQVHULUQR¿PFRQVXOWDUWRGDDOLVWDGR LQtFLRDR¿PRXGR¿PDRLQtFLRFRQVXOWDUXPQ~PHURGDOLVWDUHPRYHUXPHOHPHQWRTXDOTXHUHHVYD]LiOD
15
Exemplo:
#include <iostream> #include <stdio.h> int main() {
struct lista {
int num; lista *ant,*prox;
};
OLVWDLQLFLR¿PDX[DX[ inicio=NULL;
int op,qtde,nc,achou; do
{
system(“CLS”); printf(“\nMENU”);
printf(“\n1 - Inserir no inicio”); SULQWI³?Q,QVHULUQR¿P´
SULQWI³?Q&RQVXOWDUWRGDDOLVWDGRLQLFLRSDUDR¿P´ SULQWI³?Q&RQVXOWDUWRGDOLVWDGR¿PSDUDRLQLFLR´ printf(“\n5 - Consultar um n§ da lista”);
printf(“\n6 - Excluir nº da lista”); printf(“\n7 - Esvaziar a lista”); printf(“\n8 - Sair”);
printf(“\nDigite a opcao: “); scanf(“%d”, &op);
if (op<1||op>8)
printf(“\nOpcao invalida.\n”); else
{
if (op==1)
{
aux=new(lista);
printf(“\nDigite o numero a ser inserido: “); scanf(“%d”, &aux->num);
if (inicio==NULL)
{
inicio=aux;
¿P DX[
inicio->prox=NULL; inicio->ant=NULL;
}
else
{
aux->prox=inicio; inicio->ant=aux; aux->ant=NULL;
inicio=aux;
}
printf(“\nNumero inserido.\n”);
}
LIRS
{
aux=new(lista);
printf(“\nDigite o numero a ser inserido: “); std::cin>>aux->num;
if (inicio==NULL)
{
inicio=aux;
¿P DX[
inicio->prox=NULL; inicio->ant=NULL;
}
else
{
¿P!SUR[ DX[ DX[!DQW ¿P aux->prox=NULL;
17
¿P DX[
}
printf(“\nNumero inserido.\n”);
}
if (op==3)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
printf(“%d\n”, aux->num);
aux=aux->prox;
}
}
}
if (op==4)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
DX[ ¿P
while (aux!=NULL)
{
printf(“%d\n”, aux->num); aux=aux->ant;
}
}
}
if (op==5)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
qtde=0;
printf(“\nDigite o nº a ser consultado: “); scanf(“%d”, &nc);
aux=inicio;
while (aux!=NULL)
{
if (aux->num==nc)
qtde++;
aux=aux->prox;
}
if (qtde==0)
printf(“\nNº nao encontrado.\n”);
else if (qtde==1)
SULQWI³?Q1~PHURGDSDUHFHYH]?Q´QF
else
SULQWI³?Q1~PHURGDSDUHFHGYH]HV?Q´QFTWGH
}
}
if (op==6)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
printf(“\nDigite o numero que deseja excluir: “); scanf(“%d”, &nc);
aux=inicio;
achou=0;
while (aux!=NULL)
{
19
if (aux->num==nc)
{
achou++;
if (aux==inicio)
{
inicio=inicio->prox;
inicio->ant=NULL;
delete(aux);
aux=inicio;
}
HOVHLIDX[ ¿P
{
¿P ¿P!DQW
¿P!SUR[ 18//
delete(aux);
aux=NULL;
}
else
{
aux->ant->prox=aux->prox; aux->prox->ant=aux->ant;
DX[ DX[!SUR[
delete(aux);
DX[ DX[
}
}
else
aux=aux->prox;
}
if (achou==0)
printf(“\nNumero não encontrado.\n”); else if (achou==1)
SULQWI³?Q)RLH[FOXtGDGRFRUUrQFLDGRQQ~PHURG?Q´DFKRXQF
else
SULQWI³?Q)RUDPH[FOXtGDVGRFRUUrQFLDVGRQ~PHURG?Q´DFKRXQF
}
}
if (op==7)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
inicio=inicio->prox;
delete(aux);
aux=inicio;
}
printf(“\nLista esvaziada.\n”);
}
}
}
system(“PAUSE”); }while (op!=8); }
Lista Duplamente Encadeada e Ordenada
Na estrutura do tipo lista duplamente encadeada e ordenada, cada elemento pode armazenar um ou mais dados HVWUXWXUDKRPRJrQHDRXKHWHURJrQHDUHVSHFWLYDPHQWHHGRLVSRQWHLURV2SULPHLURSDUDRSUy[LPRHOHPHQWRHR segundo para o elemento anterior, permitindo o duplo encadeamento e mantendo a estrutura linear. Tem-se, também, um campo denominado chave, por meio do qual determinada ordenação é mantida. Segue um exemplo com as operações: LQVHULUQDOLVWDFRQVXOWDUWRGDDOLVWDGRLQtFLRDR¿PRXGR¿PDRLQtFLRFRQVXOWDUXPQ~PHURGDOLVWDUHPRYHUXP elemento qualquer e esvaziá-la.
21
Exemplo:
#include <iostream> #include <stdio.h> int main() {
struct lista {
int num; lista *ant,*prox;
};
OLVWDLQLFLR¿PDX[DX[ inicio=NULL;
int op,qtde,nc,achou; do
{
system(“CLS”); printf(“\nMENU”);
printf(“\n1 - Inserir na lista”);
SULQWI³?Q&RQVXOWDUWRGDDOLVWDGRLQLFLRSDUDR¿P´ SULQWI³?Q&RQVXOWDUWRGDOLVWDGR¿PSDUDRLQLFLR´ printf(“\n4 - Consultar um n§ da lista”);
printf(“\n5 - Excluir nº da lista”); printf(“\n6 - Esvaziar a lista”); printf(“\n7 - Sair”);
printf(“\nDigite a opcao: “); scanf(“%d”, &op);
if (op<1||op>7)
printf(“\nOpcao invalida.\n”); else
{
if (op==1)
{
aux=new(lista); printf(“\nDigite um nº: “); scanf(“%d”, &aux->num);
if (inicio==NULL)
{
inicio=aux;
¿P DX[
inicio->prox=NULL; inicio->ant=NULL;
}
else if (aux->num<=inicio->num)
{
inicio->ant=aux;
aux->prox=inicio;
aux->ant=NULL;
inicio=aux;
}
HOVHLIDX[!QXP! ¿P!QXP
{
¿P!SUR[ DX[
DX[!DQW ¿P
aux->prox=NULL;
¿P DX[
}
else
{
DX[ LQLFLR
ZKLOHDX[!SUR[!QXPDX[!QXP
DX[ DX[!SUR[
DX[!DQW DX[
DX[!SUR[ DX[!SUR[
DX[!SUR[ DX[
aux->prox->ant=aux;
}
printf(“\nNumero inserido.\n”);
}
23
LIRS
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
printf(“%d\n”, aux->num);
aux=aux->prox;
}
}
}
if (op==3)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
DX[ ¿P
while (aux!=NULL)
{
printf(“%d\n”, aux->num);
aux=aux->ant;
}
}
}
if (op==4)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
qtde=0;
printf(“\nDigite o nº a ser consultado: “); scanf(“%d”, &nc);
aux=inicio;
while (aux!=NULL && aux->num<=nc)
{
if (aux->num==nc)
qtde++;
aux=aux->prox;
}
if (qtde==0)
printf(“\nNº nao encontrado.\n”);
else if (qtde==1)
SULQWI³?Q1~PHURGDSDUHFHYH]?Q´QF
else
SULQWI³?Q1~PHURGDSDUHFHGYH]HV?Q´QFTWGH
}
}
if (op==5)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
printf(“\nDigite o numero que deseja excluir: “); scanf(“%d”, &nc);
aux=inicio;
achou=0;
while (aux!=NULL && aux->num<=nc)
{
if (aux->num==nc)
{
achou++;
if (aux==inicio)
{
25
inicio=inicio->prox;
inicio->ant=NULL;
delete(aux);
aux=inicio;
}
HOVHLIDX[ ¿P
{
¿P ¿P!DQW
¿P!SUR[ 18//
delete(aux);
aux=NULL;
}
else
{
aux->ant->prox=aux->prox; aux->prox->ant=aux->ant;
DX[ DX[!SUR[
delete(aux);
DX[ DX[
}
}
else
aux=aux->prox;
}
if (achou==0)
printf(“\nNumero não encontrado.\n”); else if (achou==1)
SULQWI³?Q)RLH[FOXtGDGRFRUUrQFLDGRQQ~PHURG?Q´DFKRXQF
else
SULQWI³?Q)RUDPH[FOXtGDVGRFRUUrQFLDVGRQ~PHURG?Q´DFKRXQF
}
}
if (op==6)
{
if (inicio==NULL) printf(“\nLista vazia.\n”);
else
{
aux=inicio;
while (aux!=NULL)
{
inicio=inicio->prox;
delete(aux);
aux=inicio;
}
printf(“\nLista esvaziada.\n”);
}
}
}
system(“PAUSE”); }while (op!=7); }
27
Listas Encadeadas: Conceito, Representação e Algoritmos
Acesse o texto Listas Encadeadas: Conceito, Representação e Algoritmos. Entenda o conceito de listas encadeadas, conheça sua representação usual; entenda a diferença entre alocação VHTXHQFLDOHDORFDomRHQFDGHDGDGHPHPyULDQRFRQWH[WRGRDUPD]HQDPHQWRGHFRQMXQWRVGH elementos.
'LVSRQtYHOHP<KWWSZZZGFXIVFDUEUaEVLPDWHULDLVHGXKWPO>$FHVVRHPMXQ
Conceito de Lista Linear Simplesmente Encadeada
$VVLVWDDRYtGHR&RQFHLWRGH/LVWD/LQHDU6LPSOHVPHQWH(QFDGHDGD6DLEDPDLVVREUHDORFDomR HVWiWLFDHGLQkPLFD9HMDXPH[HPSORGHLQVHUomRQRLQtFLRGHXPDOLVWDOLQHDUVLPSOHVPHQWH encadeada.
'LVSRQtYHOHP<KWWSKRPHSDJHVGFFXIPJEUaURGROIRDHGVL)XQFRHVIXQFRHVKWPO>. Acesso em: 1 jul.
7HPSRPLQVHJ
Inserir no Fim de uma Lista Linear Simplesmente Encadeada
$VVLVWDDRYtGHR,QVHULUQR)LPGHXPD/LVWD/LQHDU6LPSOHVPHQWH(QFDGHDGD(VWHYtGHR aborda o conceito de lista linear simplesmente encadeada e apresenta um exemplo de inserção QR¿PGHXPDOLVWDOLQHDUVLPSOHVPHQWHHQFDGHDGD
'LVSRQtYHOHP<https://www.youtube.com/watch?v=-xzfTsafixI>$FHVVRHPMXQ 7HPSRPLQVHJ
AGORA
É
A
SUA
VEZ
Instruções:
$JRUDFKHJRXDVXDYH]GHH[HUFLWDUVHXDSUHQGL]DGR$VHJXLUYRFrHQFRQWUDUiDOJXPDVTXHVW}HVGHP~OWLSOD escolha e dissertativas. Leia cuidadosamente os enunciados e atente-se para o que está sendo pedido.
Questão 1
&RPRLQWXLWRGHYHUL¿FDUDVKDELOLGDGHVGHSURJUDPDomRDGTXLULGDVDWpDJRUDDDWLYLGDGHSURSRVWDpDVROXomRGHXPSUREOHPD simples utilizando os recursos de programação estudados no tema anterior. Tais conhecimentos são extremamente necessários QDVHTXrQFLDGRVFRQWH~GRVSRLVWHUHPRVPXLWRVH[HPSORVHH[HUFtFLRVIXQGDPHQWDGRVQDOLQJXDJHP&
Problema proposto: ,PSOHPHQWDUXPSURJUDPDHP&TXHFDUUHJXHXPD¿ODGLQkPLFDKRPRJrQHDFRPQ~PHURVLQWHLURVSRVL-tivos. O programa deverá executar as operações a seguir:
29
Questão 2
2EVHUYHRFyGLJRDVHJXLUHFODVVL¿TXHRWLSRGHOLVWDXWLOL]DGDFRPUHODomRjHVWUXWXUDGHSURJUDPDomR
aux=new(lista);
std::cin>>aux->num;
DX[!SUR[ DX[
DX[!DQW DX[
aux->prox=NULL;
DX[ DX[
a) 6LPSOHVPHQWHHQFDGHDGDFRPLQVHUomRQRLQtFLRGDOLVWD b) 'XSODPHQWHHQFDGHDGDFRPLQVHUomRQR¿PGDOLVWD c) 6LPSOHVPHQWHHQFDGHDGDFRPLQVHUomRQR¿PGDOLVWD
d) 'XSODPHQWHHQFDGHDGDFRPLQVHUomRQRLQtFLRGDOLVWD e) Nenhuma das alternativas é verdadeira.
Questão 3
2EVHUYHRFyGLJRDVHJXLUHFODVVL¿TXHRWLSRGHOLVWDXWLOL]DGDFRPUHODomRjHVWUXWXUDGHSURJUDPDomR
aux=new(lista);
std::cin>>aux->num;
if (aux1==NULL)
DX[ DX[
aux->prox=aux1;
aux1=aux;
a) 6LPSOHVPHQWHHQFDGHDGDFRPLQVHUomRQRLQtFLRGDOLVWD b) 6LPSOHVPHQWHHQFDGHDGDFRPLQVHUomRQR¿PGDOLVWD c) 'XSODPHQWHHQFDGHDGDFRPLQVHUomRQR¿PGDOLVWD d) 'XSODPHQWHHQFDGHDGDFRPLQVHUomRQRLQtFLRGDOLVWD e) Nenhuma das alternativas é verdadeira.
Questão 4
Com base na estrutura de programação da linguagem C, crie um programa que carregue uma lista simplesmente encadeada e QmRRUGHQDGDSDUDVLPXODUXPFRQWUROHGHYRRV$OLVWDGHYHUiPDQLSXODUXPDHVWUXWXUDFRQWHQGRRQ~PHURGRYRRRQ~PHURGH OXJDUHVGLVSRQtYHLVQRYRRDRULJHPHRGHVWLQRGRYRR5HVROYDRVLWHQVDVHJXLU
a) Cadastrar voo.
b) &RQVXOWDUSRUQ~PHURGRYRR
c) &RQVXOWDUWRGRVRVYRRVFRPOXJDUHVGLVSRQtYHLV
d) Excluir um voo.
e) Esvaziar a lista de voos.
31
Questão 5
Com base na estrutura de programação da linguagem C, crie um programa que carregue uma lista simplesmente encadeada e RUGHQDGDSDUDVLPXODUXPVLVWHPDGHFRQWUROHGHDOXQRV$OLVWDGHYHUiPDQLSXODUXPDHVWUXWXUDFRQWHQGRRQ~PHURRQRPHD QRWDQDSURYDHDQRWDQDSURYD5HVROYDRVLWHQVDVHJXLU
a) ,QVHULUDOXQRRUGHQDGRSHORQ~PHUR
b) Consultar por inicial do nome.
c) Consultar os aprovados.
d) Mostrar a quantidade de reprovados.
e) Excluir aluno.
f) Mostrar todos os alunos com média e situação.
Observação: é considerado aprovado o aluno com média aritmética maior ou igual a 6.
FINALIZANDO
Os conceitos e exemplos práticos em C apresentados neste tema deixaram bem claro que a estrutura de dados do tipo lista é muito versátil na solução de problema do cotidiano. Sua estrutura permite armazenar tipos de dados variados, possibilitando o trabalho com estruturas homogêneas e heterogêneas.
$VRSHUDo}HVEiVLFDVGHLQVHUomRFRQVXOWDUWRGDDOLVWDFRQVXOWDUOLVWDGRLQtFLRSDUDR¿PHGR¿PSDUDRLQtFLRUHPRomR HHVYD]LDPHQWRGDOLVWDIRUDPEHPH[SORUDGDVQRVH[HPSORVHH[HUFtFLRVSURSRVWRVEHPFRPRRIRUDPDVHVWUXWXUDVGH lista ordenada, não ordenada, homogênea e heterogênea com exemplos em C para cada uma das estruturas.
REFERÊNCIAS
/,67$6(QFDGHDGDV&RQFHLWR5HSUHVHQWDomRH$OJRULWPRV'LVSRQtYHOHP<KWWSZZZGFXIVFDUEUaEVLPDWHULDLVHG
u6.html>$FHVVRHP
&21&(,72GH/LVWD/LQHDU6LPSOHVPHQWH(QFDGHDGD'LVSRQtYHOHP<https://www.youtube.com/watch?v=5FG7FC-6Fng>. $FHVVRHP
&21&(,72GH/LVWD/LQHDU6LPSOHVPHQWH(QFDGHDGD'LVSRQtYHOHP<https://www.youtube.com/watch?v=-xzfTsafixI>. Acesso HP
TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J. Estruturas de dados usando C. São Paulo: Makron %RRNV
GLOSSÁRIO
Encadeada: ligar em cadeia, estar numa sequência, ter conexão.
Estrutura de Dados:QD&RPSXWDomRHVWUXWXUDGHGDGRVpXPDIRUPDHVSHFt¿FDGHRUJDQL]DomRHDUPD]HQDPHQWR
GHGDGRVSDUDTXHVHMDPXWLOL]DGRVGHIRUPDH¿FD]$VHVWUXWXUDVGHGDGRVHVHXVDOJRULWPRVVmRPXLWRXWLOL]DGRVQD &LrQFLDGD&RPSXWDomRHPGLYHUVDViUHDVGRFRQKHFLPHQWRHFRPDVPDLVGLIHUHQWHV¿QDOLGDGHVQDVROXomRGHSUR -blemas computacionais.
Heterogênea: aquilo que é composto por elementos diferentes, desiguais.
33
Questão 1
Resposta:
#include<iostream>
#include<stdio.h>
int main()
{
VWUXFW¿OD
{
int num;
¿ODSUR[
};
¿ODLQLFLR¿PDX[
int op;
inicio=NULL;
do
{
system(“CLS”);
std::cout<<”\n\t.MENU.”;
std::cout<<”\n1. Inserir”;
VWGFRXW´?Q&RQVXOWDUWRGD¿OD´
std::cout<<”\n5. Excluir”;
std::cout<<”\n6. Esvaziar”;
std::cout<<”\n7. Sair”;
std::cout<<”\nDigite sua opção: “;
std::cin>>op;
switch(op)
{
case(1):
{
DX[ QHZ¿OD
VWGFRXW´?Q'LJLWHRQ~PHURDLQVHULU³
std::cin>>aux->num;
if(inicio==NULL)
inicio=aux;
else
¿P!SUR[ DX[
¿P DX[
35
break;
}
FDVH
{
if(inicio==NULL)
std::cout<<”\nFila vazia.\n”;
else
{
VWGFRXW´?Q7RGDD¿OD³
aux=inicio;
while(aux!=NULL)
{
std::cout<<aux->num<<” “;
aux=aux->prox;
}
}
break;
}
case(3):
{
if(inicio==NULL)
std::cout<<”\nFila vazia.\n”;
else
{
aux=inicio;
inicio=inicio->prox;
delete(aux);
VWGFRXW´?Q1~PHURH[FOXLGR?Q´
}
break;
}
case(4):
{
if(inicio==NULL)
std::cout<<”\nFila vazia.\n”;
else
{
aux=inicio;
37
inicio=inicio->prox;
delete(aux);
aux=inicio;
}
std::cout<<”\nFila esvaziada.\n”;
}
break;
}
default:
{
if(op!=5)
std::cout<<”\nOpção invalida.\n”;
}
}
system(“PAUSE”);
}
while(op!=5);
}
Clique aqui para retornar à seção Agora é a Sua Vez.
Questão 2
Resposta: Alternativa B.
$IRUPDFRPRDVYDULiYHLVDX[!SUR[ DX[DX[!DQW DX[DX[!SUR[ 18//HDX[ DX[VmRPDQLSXODGDVFDUDFWHUL]D DLQVHUomRQR¿PGHXPDOLVWDGXSODPHQWHHQFDGHDGDSRLVaux2->prox=auxLQGLFDTXHRHOHPHQWRVHUiLQVHULGRQR¿P da lista e aux->ant=aux2 mostra a preocupação em apontar para o endereço do elemento anterior.
Questão 3
Resposta: Alternativa A.
aux->prox=aux1 caracteriza que o ponteiro de aux está apontando para aux1 TXH p R LQtFLR DWXDO Haux1=aux caracteriza que o ponteiro aux1TXHLQGLFDRLQtFLRGDOLVWDDJRUDDSRQWDSDUDDSRVLomRGHauxSRUWDQWRRQ~PHURIRL LQVHULGRQRLQtFLRGDOLVWD
Questão 4
Resposta:
#include <iostream>
#include <stdio.h>
int main()
{
struct lista
{ int nv,lug;
FKDURUL>@GHVW>@ lista *posi;
};
39
inicio = NULL;
do
{
system(“CLS”);
std::cout<<”\nMenu “;
std::cout<<”\n1 - Cadastrar vôo”;
VWGFRXW´?Q&RQVXOWDUSRUQ~PHURGRY{R´
VWGFRXW´?Q&RQVXOWDUWRGRVRVY{RVFRPOXJDUHVGLVSRQtYHLV´ std::cout<<”\n4 - Excluir um vôo”;
std::cout<<”\n5 - Esvaziar a lista”;
std::cout<<”\n6 - Sair”;
std::cout<<”\nDigite sua opção: “;
std::cin>>op;
if (op < 1 || op > 6)
std::cout<<”\nOpção inválida.\n”;
if (op == 1)
{
novo =new(lista);
VWGFRXW´'LJLWHRQ~PHURGRY{R³ std::cin>>novo->nv;
std::cout<<”Digite a origem do vôo: “;
scanf(“%s”, novo->ori);
std::cout<<”Digite o destino do vôo: “;
scanf(“%s”, novo->dest);
std::cout<<”Digite o numero de lugares do vôo: “;
std::cin>>novo->lug;
novo->posi=inicio;
inicio=novo;
std::cout<<”\nVôo inserido.\n”;
}
LIRS {
if (inicio == NULL)
std::cout<<”\nLista vazia.\n”;
else
{
VWGFRXW´'LJLWHRQ~PHURGRY{RDVHUFRQVXOWDGR³ std::cin>>n;
aux = inicio;
achou=0;
while (aux != NULL)
{
41
std::cout <<”\nLugares: “<<aux -> lug;
std::cout <<”\nOrigem: “<<aux -> ori;
std::cout <<”\nDestino: “<<aux -> dest<<”\n”;
achou=1;
}
aux=aux->posi;
}
if (achou == 0)
std::cout<<”\nVôo nao encontrado.\n”;
}
}
if (op == 3)
{
if (inicio == NULL)
std::cout<<”\nLista vazia.\n”;
else
{
aux = inicio;
achou=0;
while (aux != NULL)
{
if (aux -> lug>0)
{
VWGFRXW´?Q1~PHURGRY{R³DX[!QY std::cout <<”\nLugares: “<<aux -> lug;
std::cout <<”\nOrigem: “<<aux -> ori;
std::cout <<”\nDestino: “<<aux -> dest<<”\n”;
achou=1;
}
aux=aux->posi;
}
if (achou == 0)
VWGFRXW´?Q1HQKXPY{RFRPOXJDUGLVSRQtYHO?Q´ }
}
if (op == 4)
{
if (inicio == NULL)
std::cout<<”\nLista vazia.\n”;
else
{
std::cout<<”Digite o numero do vôo a ser excluido: “;
43
aux = inicio;
while (aux != NULL)
{
if (aux -> nv == n)
{
achou = 1;
if (aux == inicio)
{
inicio = aux -> posi;
delete(aux);
}
else if (aux->posi == NULL)
{
DX[ LQLFLR
ZKLOHDX[!SRVL DX[
DX[ DX[!SRVL
DX[!SRVL 18//
}
else
{
DX[ LQLFLR
ZKLOHDX[!SRVL DX[
DX[ DX[!SRVL
DX[!SRVL DX[!SRVL
}
}
aux=aux->posi;
}
if (achou == 0)
std::cout<<”\nVôo nao encontrado.\n”;
else
std::cout<<”\nVôo excluido.\n”;
}
}
if (op == 5)
{
if (inicio == NULL)
std::cout<<”\nLista vazia.\n”;
else
{
aux = inicio;
while (aux != NULL)
45
delete(aux);
aux = inicio;
}
std::cout<<”\nLista de vôos esvaziada.\n”;
}
}
system(“PAUSE”);
}while (op != 6);
}
Clique aqui para retornar à seção Agora é a Sua Vez.
Questão 5
Resposta:
#include <iostream> #include <stdio.h> int main() {
struct lista {
int num; FKDUQRPH>@
ÀRDWSS
lista *posi; };
OLVWDLQLFLR¿PQRYRDX[DX[
int op,achou,media,cont,numero; char n;
inicio=NULL;
¿P 18//
cont = 0; do {
system(“CLS”); std::cout<<”\nMENU”;
VWGFRXW´?Q,QVHULUDOXQRRUGHQDGRSHORQ~PHUR´ VWGFRXW´?Q&RQVXOWDUSRULQLFLDOGRQRPH´ std::cout<<”\n3 - Consultar os aprovados”; std::cout<<”\n4 - Contar os reprovados”; std::cout<<”\n5 - Excluir aluno”;
std::cout<<”\n6 - Mostrar todos alunos com média e situação”; std::cout<<”\n7 - Sair”;
std::cout<<”\nDigite sua opção: “; std::cin >> op;
if (op<1 || op>7)
std::cout<<”\nOpção inválida.\n”;
if (op == 1) {
system(“CLS”); novo=new(lista);
std::cout<<”\nInserir aluno”;
VWGFRXW´?Q'LJLWHRQ~PHURGRDOXQR³ std::cin>>novo->num;
std::cout<<”\nDigite o nome do aluno: “; scanf(“%s”, novo->nome);
47
VWGFLQ!!QRYR!S
if (inicio==NULL) {
inicio=novo;
¿P QRYR
novo->posi=NULL; }
else if (novo->num <= inicio->num) {
aux=inicio; inicio=novo; inicio->posi=aux; }
HOVHLIQRYR!QXP! ¿P!QXP
{
¿P!SRVL QRYR
novo->posi=NULL;
¿P QRYR
} else {
aux=inicio;
DX[ 18//
ZKLOHDX[ 18//
{
if (novo->num<=aux->num)
DX[ DX[
else
aux=aux->posi; }
aux=inicio;
ZKLOHDX[!SRVL DX[
aux=aux->posi; aux->posi=novo;
QRYR!SRVL DX[
}
std::cout<<”\n\nAluno cadastrado com sucesso.\n”; }
LIRS
{ achou=0;
std::cout<<”\nConsulta por inicial do nome”; if (inicio==NULL)
std::cout<<”\n\nLista vazia.\n”; else
{
std::cout<<”\n\nDigite a inicial do nome que deseja consultar: “; std::cin>>n;
aux=inicio;
while (aux!=NULL)
{
LIDX[!QRPH>@ Q
{
VWGFRXW´?Q$OXQR³DX[!QRPH´3³DX[!S´3³DX[!S´?Q´
achou=1;
}
aux=aux->posi;
}
if (achou==0)
std::cout<<”\n Aluno no encontrado.\n”;
}
49
std::cout<<”\nConsulta de alunos aprovados”; if (inicio==NULL)
std::cout<<”\n\nLista vazia\n”; else
{
achou=0; aux=inicio; while (aux!=NULL)
{
PHGLD DX[!SDX[!S if (media>=6)
{
VWGFRXW´?Q´DX[!QRPH´3 ³DX[!S´3 ³DX[!S´?Q´ achou=1;
}
aux=aux->posi;
}
if (achou==0)
std::cout<<”\n Todos alunos reprovados.\n”; }
}
if (op == 4) {
std::cout<<”\nContar os alunos reprovados”; if (inicio==NULL)
std::cout<<”\n\nLista vazia.\n”; else
{
cont=0; aux=inicio; while (aux!=NULL)
{
PHGLD DX[!SDX[!S if (media<6)
cont = cont + 1; aux=aux->posi;
}
if (cont == 0)
std::cout<<”\n Nenhum aluno reprovado.\n”; else
std::cout<<”\nTotal de reprovados: “<<cont<<”\n”; }
}
if (op == 5) {
std::cout<<”\nExcluir aluno”; if (inicio==NULL)
std::cout<<”\n\nLista vazia.\n”; else
{
VWGFRXW´?Q'LJLWHRQ~PHURGRDOXQRTXHGHVHMDH[FOXLU³ std::cin>>numero;
achou=0; aux=inicio;
while ((aux!=NULL) && (aux->num<=numero)) {
if (aux->num==numero)
{
51
inicio=aux->posi; DX[ DX[!SRVL
delete(aux);
}
HOVHLIDX[ ¿P
{
DX[ LQLFLR
ZKLOHDX[!SRVL DX[
DX[ DX[!SRVL
DX[!SRVL 18//
¿P DX[
DX[ DX[!SRVL
delete(aux);
}
else
{
DX[ LQLFLR
ZKLOHDX[!SRVL DX[
DX[ DX[!SRVL
DX[!SRVL DX[!SRVL
DX[ DX[!SRVL
delete(aux);
}
VWGFRXW´?Q$OXQRH[FOXtGRFRPVXFHVVR?Q´
}
HOVHDX[ DX[!SRVL DX[ DX[
}
if (achou==0)
std::cout<<”\n\nAluno não encontrado.\n”;
} }
if (op == 6) {
if (inicio==NULL)
std::cout<<”\n\nLista vazia.\n”; else
{
aux=inicio; while (aux!=NULL) {
PHGLD DX[!SDX[!S
VWGFRXW´?Q1~PHUR³DX[!QXP´1RPH³DX[!QRPH VWGFRXW´?Q3³DX[!S´3³DX[!S´0pGLD³PHGLD if(media>=6)
std::cout<<” Situação: Aprovado.\n”; else
VWGFRXW´6LWXDomR5HSURYDGR?Q´ aux=aux->posi;
} } }
system(“PAUSE”); }while (op != 7); }