• 0
Sign in to follow this  
tanure

Lista encadeada ponteiro e vetor

Question

Olá galera, boa tarde, sou novo na área de programação e tenho a seguinte questão

1 – Ajuste o algoritmo que implementa Lista Encadeada para:

a) Imprimir a lista da seguinte forma:

à | Posição | Elemento | Endereço de memória |

B) Permitir a inserção em qualquer posição da lista, bastando informar o elemento e a posição desejada para o mesmo.

c) Efetuar a remoção de qualquer elemento da lista, informando apenas a posição do elemento.

fiz este código

#include <stdio.h>
#include <conio.h>
#include <iostream>

#define N 10

typedef struct {
    int Chave;
} TipoItem; //Cria o TipoItem como struct

typedef struct TipoCelulas *TipoApontador; //Cria apontador para TipoCelula
typedef struct TipoCelulas {
    TipoItem Item;
    TipoApontador Ant,Prox;
} TipoCelula[N]; //Cria TipoCelula como struct


void FLVazia (TipoCelula *Lista){
     int i;
     i = 1;
     while(i <= 10) {
         if (Lista[i]->prox != NULL)||(Lista[i]->ant != NULL){
           Lista[i]->prox = NULL;
           Lista[i]->ant = NULL;
           Lista[i]->item = NULL;
        i++;
     }
}    


int Vazia(TipoCelula *Lista) { //verifica se a lista está vazia
    int i;
    i = 1;
    while(i <= 10) {
        if (Lista[i]->prox != NULL)
          if (Lista[0].prox==Lista[i].prox){
            return (Lista[0].prox==Lista[i].prox);
            break;
          }  
    i++;
    }
}

void Insere(ultimo, posicao, TipoItem x, TipoLista *Lista) {//Insere elemento na lista
    
    Lista[posicao]->Ultimo->Prox=(TipoApontador) malloc(sizeof(TipoCelula));//Aloca dinamicamente em memoria espaco do tamanho TipoCelula para o ponteiro TipoApontador
    if (ultimo != posicao)
      Lista[posicao]->ant = &Lista[ultimo];
    Lista[posicao]->item = x;    
    Lista[posicao]->prox = NULL;
}

void Retira(TipoApontador p, TipoLista *Lista, TipoItem *Item) { //Remove um elemento da lista
    TipoApontador q; // Cria um apontador auxiliar
    if(Vazia(*Lista)) { // Verifica se alista não está vazia
        printf("Erro: Lista vazia ou posicao não existe\n");
        return;
    }
    if (lista[posicao]->item == NULL)
        printf("Erro: Posicao não existe\n");
    else{
       lista[posicao]->ant->prox = lista[posicao]->prox;
       lista[posicao]->prox->ant = lista[posicao]->ant;
    }   
}

void Imprime(TipoLista Lista) { //Imprime o conteudo da lista
    while(i <= 10) {
        if (Lista[i]->item != NULL)
           Printf("%d, ",i);
           Printf("%d, ",Lista[i]->item);
           Printf("%d\n",&Lista[i]);
        }  
    i++;
    
    TipoApontador Aux; //Cria um apontador auxiliar
    Aux=Lista.Primeiro->Prox; //Atribui o endereco do primeiro elemento ao apontador
    while(Aux!=NULL) {
        printf("%d\n",Aux->Item.Chave); //Imprime o elemento para qual o apontador auxiliar aponta
        Aux=Aux->Prox;//Atribui o endereco do proximo elemento ao apontador auxiliar
    }
}

void BuscaERetira(int num, TipoLista Lista) { //Busca um determinado elemento e o remove da lista
    TipoApontador Aux; //Cria um apontador auxiliar
    Aux=Lista.Primeiro->Prox;//Atribui o endereco do primeiro elemento ao apontador
    while(Aux!=NULL) { //Percorre a lista até o final dela
        if(Aux->Item.Chave==num){ //Compara se é o elemento procurado da lista
           printf("Elemento encontrado: %d\n",Aux->Item.Chave);
           printf("Ponteiro para o elemento: %d\n",Aux);  
           Retira(Aux,&Lista,&Aux->Item);//Efetua a remocao do elemento identificado da lista
           system("pause");     
           }
        Aux=Aux->Prox; //Atualiza o ponteiro auxiliar para o proximo elemento da lista
    }
}

int main() {
    int t,opcao, ultimo, posicao;
    TipoLista NumerosInteiros;
    FLVazia(&NumerosInteiros);
    ultimo = NULL;
    do {
        printf("Digite a opcao desejada ou 0 para sair:\n ");
        printf("1 - Inserir elemento na lista\n ");
        printf("2 - Remover elemento da lista\n ");
        printf("3 - Exibir a lista\n");
        scanf("%d", &opcao);
        switch (opcao){
               case 1:
                    TipoItem temp;
                    printf("Digite a posicao a inserir\n");
                    scanf("%d",&posicao);
                    printf("Digite o valor a inserir\n");
                    scanf("%d",&temp.Chave);
                    Insere(ultimo,Posicao,temp,&NumerosInteiros);
                    ultimo = posicao;
                    break;
               case 2:
                    printf("Digite o valor a ser removido da lista\n");
                    scanf("%d",&t);
                    BuscaERetira(t,NumerosInteiros);
                    break;
               case 3:
                    Imprime(NumerosInteiros);
                    system("pause");
                    break;
               default:
                    printf("Tchau\n\n ");
                    system("pause");
                    break;
        }
        system("cls");
    } while (opcao != 0);
    return 0; 
}

porém da erro do começo ao final e o problema é que eu não sei nada de programação e este é o trabalho mais importante do semestre, o que vale mais nota, tenho também o programa em que o professor deu de exemplo, se alguém quiser de coração me ajudar, posso passar o código fonte, conto com a ajuda de vocÊs abraços

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Pessoal, boa tarde!

Estou analisando o código do Ziviani de lista encadeada. Alguém sabe me explicar o porque da necessidade de se usar o TipoCelula no início da estrutura e no final? Pergunto pois, se eu tiro do início ele da o erro "error: conflicting declaration 'typedef struct TipoCelula TipoCelula" e se eu tiro do final ele funciona perfeitamente. Ainda não conseguir pegar a ideia.

Alguém poderia me auxiliar?

 

typedef struct {

  int Chave;

  /* outros componentes */

} TipoItem;

 

typedef struct TipoCelula *TipoApontador;

 

typedef struct TipoCelula {

TipoItem Item;

TipoApontador Prox;

} TipoCelula;

 

typedef struct {

TipoApontador Primeiro, Ultimo;

} TipoLista;

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this