Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Ricardo15lis

Listas ligadas

Recommended Posts

Ricardo15lis

Boa tarde,

Estou com algumas duvidas na implementação de listas ligadas.

A lista é deste tipo

typedef struct
{
elemento *ini;
elemento *fim;
int tamanho;
} lst;

e tenho outra estrutura deste tipo

typedef struct_elemento
{
char *string;
struct_elemento *prox;
struct_elemento *ante;
}

Como devo implementar uma funcao em que tenho de inserir um elemento na lista(esta funcao recebe uma lista do tipo lst,uma string e a posição onde quero inserir o elemento) e uma funcao que remove um elemento na lista(esta recebe a lista do tipo lst e a posição)?

Edited by thoga31
Tags code + GeSHi + formatação

Share this post


Link to post
Share on other sites
HappyHippyHippo

vamos pelo início, achas que as estruturas apresentadas estão correctas ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

A primeira estrutura é uma estrutura que tem o apontador da primeira posição e da ultima.A segunda estrutura é a que deve ser usada para aceder aos outros elementos da lista( entre o inicio e o fim).

No enunciado do problema as estruturas são apresentadas assim.

Share this post


Link to post
Share on other sites
HappyHippyHippo

mas são apresentadas exactamente como estão escritas no primeiro post ? e por essa ordem ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

então o enunciado está errado, isso nunca irá compilar devido a :

- uso de tipos de dados não definidos

- sintaxe errada de declaração de um tipo de dados

achas que consegues identificar estes problemas no código ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

esqueci me de por elemento na segunda estrutura

a segunda estrutura é assim:

typedef struct_elemento
{
char *string;
struct_elemento *prox;
struct_elemento *ante;
}elemento

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

novamente, os mesmos problemas ainda persistem mesmo adicionando/alterando o código que apresentas.

achas que consegues identificar estes problemas no código ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

Nao estou a ver qual seja o erro a funcao insere seda:

insere(lst lista,char string,elemento *pos)

seria

o problema é só uma lista ligada

mas com duas estruturas

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não falei no código da função, só falei na declaração das estruturas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

- uso de tipos de dados não definidos

mesmo tendo adicionado o nome do tipo de dados criado na segunda estrutura, esta nunca está definida antes do seu uso na declaração do tipo de dados lst

- sintaxe errada de declaração de um tipo de dados

o segundo tipo de dados criado não está bem declarado, a mim parece que anda p«rai um underscore a mais, mas de eu achar ao ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

existe efectivamente um espaço entre o tpydef struct e o _elemento

a primeira estrutura está bem

Share this post


Link to post
Share on other sites
HappyHippyHippo

agora que já sabemos que esse código está errado e como corrigir, qual é mesmo o problema ?

isto porque perguntar como fazer é o mesmo que pedir o código inteiro (o que não se faz aqui no fórum), além de ser assumido que deverás ter sido apresentado à matéria de como fazer o problema.

conclusão : qual é mesmo o problema ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

A questão e a seguinte:não percebo porque o código abaixo da me mal

elemento* lista_insere(lista *lst,char *valor,elemeto *pos)
elemento *temp,*insere;
       insere=(elemento *)malloc(sizeof(elemento));
       if(pos==NULL)
           insere=lst->fim;
           insere->proximo=NULL;
           strcpy(insere->str,valor);
           lst->tamanho=lst->tamanho+1;
           return insere;
       temp=lst->inicio;
       while(temp!=NULL){
           if(temp==pos){
               if(pos!=lst->fim){
                   insere->proximo=temp->proximo;
                   temp->proximo=insere;
                   strcpy(insere->str,valor);
                   lst->tamanho=lst->tamanho+1;
                   return insere;
               }
           else{
                       temp->proximo=insere;
                       insere->proximo=NULL;
                       strcpy(insere->str,valor);
                       lst->tamanho=lst->tamanho+1;
                       return insere;
           }
       }

       else{
               temp=temp->proximo;
           }
       }

elemento

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, vamos então por partes

se dizes que "dá mal", o que é "dar mal" ? (não esperes que uma pessoa olhe para linhas e linhas de código a procura de algo que não sabe o que procurar ...

segundo, para que serve o terceiro elemento da função ? achas mesmo que é necessário ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ricardo15lis

Em relação ao facto de dar mal quero dizer que na funcao main não executa nada apesar de não dar erros.O terceiro elemento é a posição na qual quero inserir o elemento e é necessário

na main a funcao só executa se tiver o terceiro elemento

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de mais, como falta (pelo menos) o código de inicialização da lista, a resposta não 100% concreta, mas existe algo nas primeiras linhas do teu código que não parece correcto:

elemento* lista_insere(lista *lst,char *valor,elemeto *pos)
elemento *temp,*insere;
       insere=(elemento *)malloc(sizeof(elemento));
       if(pos==NULL)
           insere=lst->fim; // perder o ponteiro para a memória alocada 

segundo, não faz sentido o terceiro argumento da função descrita, isto porque não é normal saber o ponteiro para a posição onde irás inserir, mas sim, dizer o índice da posição que pretendes inserir na lista


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.