Ir para conteúdo
Fórum Script Brasil
  • 0

Lista encadeada ponteiro e vetor


tanure

Pergunta

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

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...