Lista Simplesmente Encadeada

1. Lista Simplesmente Encadeada

Semateruki
semateruki

(usa Slackware)

Enviado em 14/09/2008 - 23:09h

gente...tou com um problemao aki

eu acho que ta na parte do codigo que remove um valor duma posicao x

mas eu num consigo achar...ja reescrevi o codigo varias vezes e continua dano erro

alguem pode me ajudar?

http://www.4shared.com/file/63017232/c06d66e7/Lista.html

nesse link ta os arquivos do programa




  


2. Re: Lista Simplesmente Encadeada

leandro morita
borwitz

(usa Ubuntu)

Enviado em 14/09/2008 - 23:34h

ajudaria se vc colocasse o erro q dá... =)


3. Re: Lista Simplesmente Encadeada

Semateruki
semateruki

(usa Slackware)

Enviado em 14/09/2008 - 23:55h

da erro de: o Lista.exe encontrou um problema e precisa ser fechado

[sim...eu to no windows...eh trabalho de escola e eu tenho que entregar o arquivo com o projeto .dev, feito numa IDE pra windows =/(kd a liberdade? so pq o prof num sabe usar linux =/)]


4. Re: Lista Simplesmente Encadeada

Denis Doria
thuck

(usa Debian)

Enviado em 14/09/2008 - 23:56h

Bem, fiz o código abaixo na minha aula de SO, não é lá essas coisas, mas pode te dar uma luz, não tem o remover de uma posição, mas tem o inserir em uma posição e remover um item específico, creio que se vc olhar as duas funções deve ajudar:


#define NULL 0
#define FALSE 0
#define TRUE 1

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

struct item{

char nome[50];
char telefone[40];
int idade;
};

struct node{

struct item info;
struct node *proximo;

};

typedef struct{

struct node *inicio ;
struct node *fim ;
int num_elementos;
}lista;

typedef struct node *PPNODE;

void inserirNO(struct item *novo, lista *l);

void inicializarLista(lista *l);

struct item criarItem();

struct item *buscarItem(const char *string,lista *l);

PPNODE removerItem(const char *string, lista *l);

void mostrarLista(lista *l);

void ordenarLista(lista *l);

PPNODE buscarMenor(lista *l);

void menu();

void inserirNOP(struct item *novo, lista *l, int pos);

int main(void){

lista l;
struct item nitem, *bitem;
char nome[50];
int ok = TRUE, valor, pos;

inicializarLista(&l);

do{

menu();

scanf("%d",&valor);

switch (valor){

case 1: nitem = criarItem();

inserirNO(&nitem,&l);
break;

case 2:
if(l.num_elementos > 0){

printf("\nInsira o Nome: ");
scanf("%s",nome);

bitem = buscarItem(nome,&l);

if(bitem != NULL){

printf("\nNome: %s\n", bitem->nome);
printf("Telefone: %s\n", bitem->telefone);
printf("Idade: %d\n\n", bitem->idade);

}
else printf("\n\nNão está cadastrado\n\n");
}
else printf("\n\nNão há itens na lista\n\n");
break;

case 3:
if(l.num_elementos > 0){

printf("\nInsira o Nome: ");
scanf("%s",nome);

free(removerItem(nome,&l));
}
else printf("\n\nNão há itens na lista\n\n");

break;

case 4:
if(l.num_elementos > 0){

mostrarLista(&l);
}
else printf("\n\nNão há itens na lista\n\n");
break;

case 5: ordenarLista(&l);
break;

case 6: printf("Em qual posição deseja inserir: ");
scanf("%d",&pos);
if(l.num_elementos >= pos){


nitem = criarItem();
inserirNOP(&nitem, &l, pos);

}
else printf("\nPosição inválida!!\n\n");

break;

case 7: ok = FALSE;
break;

default : printf("\nValor não tratado\n\n");

}

}while (ok);

return 0;
}

void inserirNO(struct item *novo, lista *l){

PPNODE p;/*ponteiro para um no*/

p = (PPNODE) malloc(sizeof(struct node));/*alocação dinâmica de memória*/

(p->info) = *novo; /*copia do item para o novo nó*/

if(l->inicio == NULL){/*inserção no caso de ser a primeira vez*/

l->inicio = p;
l->fim = p;
p->proximo = NULL;
l->num_elementos = 1;

}
else{

l->fim->proximo = p;
p->proximo = NULL;
l->fim = p;
l->num_elementos++;

}

}


void inicializarLista(lista *l){/*insere os valores na lista*/

l->inicio= NULL;
l->fim = NULL;
l->num_elementos = 0;

}

struct item criarItem(){/*cria o nome item lendo um a um*/

struct item novo;

printf("\nDigite o nome: ");
scanf("%s",&novo.nome);

printf("\nDigite o telefone: ");
scanf("%s", &novo.telefone);

printf("\nDigite a idade: ");
scanf("%d",&novo.idade);
printf("\n");


return novo;

}

struct item *buscarItem(const char *string,lista *l){/*busca um item específico*/

int cont = 1;
PPNODE p = l->inicio;

while(strcmp(string, p->info.nome)!= 0 && p->proximo !=NULL){/*avança até encontrar ou chegar ao fim da lista*/

p = p->proximo;
cont++;

}

if(cont == l->num_elementos && strcmp(string, p->info.nome)!= 0){/*verifica se o último não é o elemento procurado*/

return NULL;

}else return &p->info;


}

PPNODE removerItem(const char *string, lista *l){/*remove um item específico*/

PPNODE q,p;
int cont = 1;
p = l->inicio;

while(strcmp(string, p->info.nome)!= 0 && p->proximo !=NULL){/*procura o item armazenando o anterior*/

q = p;
p = p->proximo;
cont++;

}

if(cont == 1 && strcmp(string, p->info.nome)== 0){/*verifica se o item procurado não é o primeiro*/

l->inicio = p->proximo;
l->num_elementos--;
return p;
}
else
if(cont == l->num_elementos && strcmp(string, p->info.nome)!= 0){

printf("\nItem não localizado!!!\n\n");


}
else{/*faz a troca no meio da lista ou no fim*/

q->proximo = p->proximo;
l->num_elementos--;
return p;


}



}



void mostrarLista(lista *l){/*imprimi todos os itens da lista*/

PPNODE p = l->inicio;

while(p->proximo != NULL){

printf("Nome: %s\nTelefone: %s\nIdade: %d\n\n", p->info.nome, p->info.telefone, p->info.idade);
p = p->proximo;

}
printf("Nome: %s\nTelefone: %s\nIdade: %d\n\n", p->info.nome, p->info.telefone, p->info.idade);

}



void ordenarLista(lista *l){/*Ordena a lista (Péssimo algoritmo)*/

lista tmp;
PPNODE p,q;
register int i = 0;
inicializarLista(&tmp);

for(; i=l->num_elementos;i++){

p = buscarMenor(l);
q = removerItem(p->info.nome, l);
inserirNO(&q->info, &tmp);
free(q);

}


*l = tmp;
}


PPNODE buscarMenor(lista *l){/*Encontra o menor item de uma lista*/

PPNODE p = l->inicio, q = p;
register int i = 0;

for(;i<l->num_elementos;i++){

if(strcmp(q->info.nome,p->info.nome) > 0){

q = p;

}

p = p->proximo;

}


return q;
}

void menu(){

printf("O que deseja fazer: \n\n");
printf("1) Inserir item\n");
printf("2) Buscar item\n");
printf("3) Remover item\n");
printf("4) Mostrar Toda a Lista\n");
printf("5) Ordenar Lista\n");
printf("6) Inserir numa posição\n");
printf("7) Sair\n\n");


}


void inserirNOP(struct item *novo, lista *l, int pos){

register int i = 1;

PPNODE p, q, s;/*ponteiro para um no*/

p = (PPNODE) malloc(sizeof(struct node));/*alocação dinâmica de memória*/
q = l->inicio;
s = q;
(p->info) = *novo; /*copia do item para o novo nó*/

for(; i < pos; i++){

s = q;
q = q->proximo;

}

if(i == 1){/*inserção no caso de ser a primeira vez*/

p->proximo = l->inicio;
l->inicio = p;

l->num_elementos++;

}
else{

p->proximo = q;
s->proximo = p;
l->num_elementos++;

}


}





5. Re: Lista Simplesmente Encadeada

Semateruki
semateruki

(usa Slackware)

Enviado em 15/09/2008 - 00:10h

no que eu vi, parece que vc acha o individuo que vai remover pelo o que ele eh

no meu eu tenho que tirar de acordo com a posicao dele

mas eu num consegui achar o que acontece qdo vc acha o individuo [talvez seja pq usa struc's...nem entendo direito struc...so classes]


6. Re: Lista Simplesmente Encadeada

leandro morita
borwitz

(usa Ubuntu)

Enviado em 15/09/2008 - 00:15h

mas o erro acontece qd vc faz o q?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts