Jump to content

Manipulação de Listas Ligadas


setevintecinco
 Share

Recommended Posts

Boas pessoal.

Sou novo aqui no fórum e na parte de programação em C também um bocado novato...

Tenho um trabalho para fazer e ainda não atinei muito bem com isto...

O trabalho consiste na implementação de uma pequena biblioteca de funções para manipulação de listas ligadas de strings em C.

Para este trabalho são-nos disponibilizados 3 ficheiros:

- lista.h que inclui as declarações das funções a implementar e que não é para alterar;

- lista.c que é o ficheiro onde deverão ser implementadas as funções da biblioteca;

- lista-teste.c que inclui os testes feitos à biblioteca e que também não é para alterar;

A estrutura de dados lista é a base da biblioteca e tem a seguinte declaração:

typedef struct

{

elemento *raiz;

int tamanho;

} lista;

Nesta estrutura são guardados: 1) um apontador para o primeiro elemento da lista (raiz); e 2)

o tamanho da lista. É ainda definida a estrutura de dados elemento que tem a seguinte

declaração:

typedef struct _elemento

{

char* str;

struct _elemento *proximo;

} elemento;

Nesta estrutura são guardados: 1) um apontador para char que guarda uma string, ou seja,

cada um dos elementos do lista; 2) um apontador para o próximo elemento da lista.

As funções a implementar e que estão associadas à estrutura de dados lista são:

1. lista *lista_nova();

cria uma nova lista vazia

2. void lista_apaga(lista *lst);

elimina uma lista, libertando toda a memória ocupada

3. int lista_tamanho(lista *lst);

indica o comprimento da lista

4. const char* lista_elemento(lista *lst, int pos);

retorna a string armazenada na posição especificada

5. int lista_atribui(lista *lst, int pos, const char* str);

atribui o valor especificado a uma posição

6. int lista_insere(lista *lst, const char* valor, int pos);

insere um elemento na posicao especificada, se pos=FIM insere no fim da lista

7. int lista_remove(lista *lst, int pos);

remove o elemento da posição especificada

8. int lista_pesquisa(lista *lst, const char* str);

devolve a posição do primeiro elemento da lista com a string especificada

9. int lista_ordena(lista *lst);

ordena uma lista por ordem alfabética

10. int lista_compara(lista *lst1, lista *lst2);

compara duas listas

11. lista* lista_inverte(lista *lst);

cria uma nova lista com a ordem dos elementos inverte

Se alguém me puder ajudar ficava eternamente grato e disponibilizo ainda mais informação sobre as funções a implementar e etc sobre este trabalho...

Obrigado.

Link to comment
Share on other sites

Certo, e as dúvidas são? Trabalho feito tens?

Acho que também deves ter lido esta pequena regra ao efecturares o teu registo:

Não é permitida a criação de tópicos ou colocação de mensagens a pedir que se façam trabalhos. Pedir ajuda é diferente de pedir trabalhos feitos. Em caso de incumprimento o staff pode bloquear, ou mesmo apagar, o tópico/mensagem.

Link to comment
Share on other sites

na função inserir, tens dois casos ou esta na cabeça da lista ou não, se esta é só ligar, se não estiver fazes um ciclo que percorre a lista toda ate encontrar o seu lugar, quer ele seja por comparação de elementos das estruturas ou só meter no final. Em remover, fazes outro ciclo para encontrar o tal elemento que queres, e ligar de novo os elementos.

Link to comment
Share on other sites

int lista_compara(lista *lst1, lista *lst2)
{
 int x=0;
 elemento *aux;
 while(lst1!=NULL && lst2!=NULL)
 {
   if(lst1->str == lst2->str)
   {
     x=1;
   }
   else return 0;

   lst1=lst1->proximo;
   lst2=lst2->proximo;
 }

 return x;
}

Esta função é suposto comparar duas listas e retornar 1 se lst1 for igual a lst2 ou retornar 0 se forem diferentes... Dadas as duas estruturas que tenho referidas no primeiro post, o código dá-me erro quando faço referência a lst1->str, lst2->str e lst1=lst1->proximo;

lst2=lst2->proximo; Eu percebo o porquê de dar erro, uma vez que são tipos de variáveis diferentes, mas tenho andado a pensar e não consigo perceber como posso passar estes erros... Será que alguém me pode ajudar nesta situação?

Obrigado pessoal

Link to comment
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
 Share

×
×
  • Create New...

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.