Autoria: Carlos Eduardo Cayres | 4o

27 

Full text

(1)

Estrutura de Dados

Autoria: Carlos Eduardo Cayres | 4

o

semestre

Tema 05

Lista

Tema 05

Lista

Autoria: Carlos Eduardo Cayres

Como 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. 3

CONVITE

À

LEITURA

(2)

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

{

(3)

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´

(4)

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)

{

(5)

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

{

(6)

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

(7)

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

(8)

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;

(9)

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)

{

(10)

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.

(11)

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”);

}

(12)

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)

{

(13)

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

(14)

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:

(15)

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.

(16)

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.

(17)

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[

(18)

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;

(19)

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;

};

(20)

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)

{

(21)

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: “;

(22)

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)

(23)

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

(24)

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

}

(25)

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)

{

(26)

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

(27)

Figure

Updating...

References

Updating...

Download now (27 pages)