Ir ao conteúdo

Estrutura de dados: LISTA em C, ajuda ae!


HugoSabino

Posts recomendados

Postado

Olá,

Rapaz meu professor de estrutura de dados ensino como inserir no inicio e no fim, excluir no inicio e no fim, pórem passou um trabalho para inserir e excluir no meio da lista. Assim, estou entendendo tudo que ele passou, mas não consigo chegar a uma solução para inserir ou excluir um nó no meio de 1 lista. E entendo que tenho que achar o antecedente, mas como? E lembro que a pessoa tem que digitar a posição que quer inserir ou excluir. Como associar a posição indicada ao nó antecessor ao que será adicionado?

Desde já Grato por qualquer ajuda!

Hugo.

Segue meu programa em C, estou aposto a ajudas! Respondo na hora!

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

struct no{

int num;

no *prox;

};

no *ini,*fim;

int n;

//////////////////////////////////////////////////////////////////////

void insere_ini(no **pra mim, no **ult, int *nelem)

{

no *aux;

int valor;

printf ("Digite o elemento a ser inserido: ");

scanf ("%d",&valor);

if (ini==NULL)

{

*pra mim=(no*)malloc(sizeof(no));

(*pra mim)->num=valor;

(*pra mim)->prox=NULL;

*ult=*pra mim;

}

else

{

aux=(no*)malloc(sizeof(no));

aux->prox=*pra mim;

aux->num=valor;

*pra mim=aux;

}

(*nelem)++;

}

////////////////////////////////////////////////////////////////////////

void insere_fim(no **pra mim, no **ult, int *nelem)

{

no *aux;

int valor;

printf ("Digite o elemento a ser inserido: ");

scanf ("%d",&valor);

if (ini==NULL)

{

*pra mim=(no*)malloc(sizeof(no));

(*pra mim)->num=valor;

(*pra mim)->prox=NULL;

*ult=*pra mim;

}

else

{

aux=(no*)malloc(sizeof(no));

(*ult)->prox=aux;

aux->num=valor;

aux->prox=NULL;

*ult=aux;

}

(*nelem)++;

}

////////////////////////////////////////////////////////////////////////

void insere_meio(no **pra mim, no **ult, int *nelem)

{

}

////////////////////////////////////////////////////////////////////////

void exclui_prim(no **pra mim, no **ult, int *nelem)

{

no *aux;

if (*pra mim==NULL)

{

printf ("lista vazia...");

getch();

}

else

{

if (*pra mim==*ult)

{

free (*pra mim);

*pra mim=NULL;

*ult=NULL;

}

else

{

aux=*pra mim;

*pra mim=(*pra mim)->prox;

free(aux);

}

(*nelem)--;

}

}

////////////////////////////////////////////////////////////////////////

void exclui_ult(no **pra mim, no **ult, int *nelem)

{

no *aux;

no *noatual=*pra mim;

if (*ult==NULL)

{

printf ("lista vazia...");

getch();

}

else

{

if (*pra mim==*ult)

{

free (*pra mim);

*ult=NULL;

*pra mim=NULL;

}

else

{

while (noatual->prox->prox!=NULL)

{

noatual=noatual->prox;

}

aux=*ult;

*ult=noatual;

(*ult)->prox=NULL;

free(aux);

}

(*nelem)--;

}

}

////////////////////////////////////////////////////////////////////////

void exclui_meio(no **pra mim, no **ult, int *nelem)

{

}

////////////////////////////////////////////////////////////////////////

void listar(no *pra mim, int nelem)

{

int i=0;

if (pra mim==NULL)

{

printf ("\n\nLista vazia...");

}

else

{

while (pra mim!=NULL)

{

i++;

printf ("\n%dº elemento: %d", i,pra mim->num);

pra mim=pra mim->prox;

}

printf ("\n\nA lista possui %d elementos.",nelem);

}

}

/////////Programa Principal////////////////////////////////////////////

void main()

{

int opcao;

ini=NULL;

fim=NULL;

n=0;

do

{

clrscr();

printf ("[1] INSERIR NO INICIO\n");

printf ("[2] INSERIR NO FIM\n");

printf ("[3] INSERIR EM QUALQUER POSICAO\n");

printf ("[4] EXCLUIR O PRIMEIRO\n");

printf ("[5] EXCLUIR O ULTIMO\n");

printf ("[6] EXCLUIR EM QUALQUER POSICAO\n");

printf ("[7] LISTAR\n");

printf ("[8] SAIR\n");

printf ("Digite a Opcao: ");

scanf ("%d",&opcao);

switch (opcao)

{

case 1: insere_ini (&ini,&fim,&n);

break;

case 2: insere_fim (&ini,&fim,&n);

break;

case 3: insere_meio (&ini,&fim,&n);

break;

case 4: exclui_prim (&ini,&fim,&n);

break;

case 5: exclui_ult (&ini,&fim,&n);

break;

case 6: exclui_meio (&ini,&fim,&n);

break;

case 7: listar (ini,n);

getch();

}

}

while(opcao!=8);

}

/////////////////////FIM///////////////////////////////////////////////

Postado

Salve, HugoSabino!

Eu acho que a melhor maneira de se controlar um registro, seria associando à esse registro um número de identificação. Dentro da sua estrutura, você cria um campo para identificar o registro, tipo isso daqui:

struct no{
int num_registro;
int num;
no *prox;
};

No seu programa, você vai atribuindo os novos números, de acordo com o valor armazenado em uma variável de controle.

No início do programa, uma rotina percorre a lista para saber qual é o último registro e guarda esse valor na variável que conta os registros.

Se você precisar subtrair ou inserir um outro registro através desse tipo de organização, suas funções que inserem e removem registros, percorreriam a lista até encontrar o registro específico. Daí, a função guarda o ponteiro do registro anterior e o ponteiro do registro posterior. Remove o registro e atualiza os ponteiros dos registros que ficaram antes e depois da alteração.

Uma outra forma que tb poderia ser utilizada, é criando estruturas duplamente ligadas (ponteiro do registro anterior e ponteiro do registro posterior), utilizando-se dentro dos registros, ponteiros para os registros que ficam antes e depois do registro atual. Parecido com isso:

struct no{
int num;
no *anterior;
no *prox;
};

É uma outra forma de organização, mas, no caso dos ponteiros da linguagem C, bastante trabalhosa de implementar, mas, uma vez implementada, rapidíssima e muito eficiente.

Deve haver outras formas de fazer esse algorítmo, mas, que eu conheço são só esses.

Boa sorte.

[]'s

Postado

to estudando esta M. de materia em java, e para esta questão de (incluir/excluir no meio) temos que definir a posição em que será feita a operação tipo: insira(5,56) seria mais ou menos: insira na posição 5 o valor 56...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!