Ir para conteúdo

Arquivado

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

MichelleAraujo

Inserindo em uma lista dentro de outra lista

Recommended Posts

Olá pessoa, tudo bem?

 

Cá estou eu com outra dúvida.

Nesse código, tenho duas estruturas: uma lista que armazena números e outra lista que aramazena palavras e tem a lista citada anteriormente.

typedef struct ListLine{
	int value;
	struct ListLine *next;
} ll;

typedef struct ListWord{
	char* oWord;
	char* mWord;
	struct ListWord *nextWord;
	struct ListLine *lines;
} lw;

Acredito que na declaração da estrutura esteja correto.

Agora, segue a função para acrescentar um valor na lista de um determinado nó:

void insertLine(lw* node, int where){
	ll *new=(ll*)malloc(sizeof(ll));
	if (new==NULL){
		puts("Erro de memoria"); exit(1);
	}
	new->value=where;
	new->next=NULL;
	if (node->lines==NULL) node->lines=new;
	else{
		ll* aux=node->lines;
		while (aux->next!=NULL) aux=aux->next;
		aux->next=new;
	}
}

Meu problema é o seguinte: quando quero adicionar um determinado valor na primeira célula da lista, ele acaba adicionando o valor também os pŕoximos nós. Agora, para adicionar em alguma célula que não seja a primeira ele não adiciona.

Achei que o problema fossem dois:

1. é necessário criar uma lista do tipo ListLines separadamente? Exemplo:

lw* listaWord = NULL;
ll* listaLines = NULL;

2. é necessário alocar dentro do novo nó a lista? Por via das dúvidas, coloquei na função que aloca um novo nó para listaWord:

new->lines = NULL;

Mesmo eu fazendo essas duas coisas, não funcionou. Acreditei que fosse a função de procurar o nó onde quero alterar a lista. A função busca na lista fiz da seguinte forma:

lw* searchWordList (char *palavra){
	lw*n;
	for (n=listaWord;n;n=n->nextWord)
		if (strcmp(n->mWord,palavra)==0)
			return n;
	return NULL;
}

Bom, ainda não continua funcionando. Aguardo respostas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O algorítimo de iserção na lista me parece correto, assim como o de busca. Sugiro que poste o código completo para que possamos depurar e encontrar o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GBecker,

Lá vai. Alterei a função de inserir esperando uma mudança...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void strlwr(char* str) {
	size_t i;
	size_t len = strlen(str);

	for (i = 0; i < len; i++)
		str[i] = tolower((unsigned char) str[i]);
}

typedef struct ListLine{
	int value;
	struct ListLine *next;
} ll;

typedef struct ListWord{
	char* oWord;
	char* mWord;
	struct ListWord *nextWord;
	struct ListLine *lines;
} lw;

lw* listaWord = NULL;

ll* insertLine(ll* node, int where){
	ll *new=(ll*)malloc(sizeof(ll));
	if (new==NULL){
		puts("Erro de memoria"); exit(1);
	}
	new->value=where;
	new->next=NULL;
	if (node==NULL) node=new;
	else{
		ll* aux=node;
		while (aux->next!=NULL) aux=aux->next;
		aux->next=new;
	}
	return node;
}

lw* searchWordList (char *palavra){
	lw*n=listaWord;
	for (;n!=NULL;n=n->nextWord)
		if (strcmp(n->mWord,palavra)==0)
			break;
	return n;
}

void insertWordList (char *palavraOrig, char *palavra){
	if (searchWordList(palavra)==NULL){
		lw* new = (lw*)malloc(sizeof(lw));
		new->oWord=(char*)malloc(strlen(palavra)+1);
		new->mWord=(char*)malloc(strlen(palavra)+1);
		if (new == NULL || new->oWord==NULL || new->mWord==NULL){
			puts("Erro de memoria!"); exit(1);
		}
		strcpy(new->oWord,palavraOrig);
		strcpy(new->mWord,palavra);
		new->lines = NULL;
		lw*ant=NULL; lw*p=listaWord;
		while (p!=NULL){
			ant=p;
			p=p->nextWord;
		}
		if (ant==NULL){
			new->nextWord=listaWord;
			listaWord=new;
		}
		else {
			new->nextWord=ant->nextWord;
			ant->nextWord=new;
		}
	}
}

void printIndice(){
	lw* q;
	for (q=listaWord;q!=NULL;q=q->nextWord){
		printf("%s ",q->oWord);
		ll *r;
		for (r=listaWord->lines;r!=NULL;r=r->next) printf("%d ",r->value);
		puts("");
	}
}

int main(int argc, char **argv) {
	int ch, i=0;//, cont=0, linha=1;
	char *word_dic=(char*)malloc(sizeof(char));
	char *word_dic_orig=(char*)malloc(sizeof(char));
	
	// OPEN DICTIONARY //
	FILE *dictionary;
	dictionary = fopen("dicionario.txt", "r");
	if (dictionary == NULL) {
		printf("Erro, nao foi possivel abrir o arquivo\n");
		return 0;
	}

	while ((ch=fgetc(dictionary))!=EOF){
		if ( (ch>=65 && ch<=90) || (ch>=97 && ch<=122)){
			word_dic[i]=ch;
			i++;
		}
		else {
			strcpy(word_dic_orig,word_dic);
			strlwr(word_dic);
			insertWordList(word_dic_orig,word_dic);
			word_dic=(char*)calloc(0,sizeof(char));
			i=0;
		}
	}
	fclose(dictionary);	
	
	lw* q=searchWordList("a");
	q->lines=insertLine(q->lines,1);
	q->lines=insertLine(q->lines,2);
	printIndice();
	
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.