Logo Hardware.com.br
Maragato
Maragato Membro Senior Registrado
423 Mensagens 0 Curtidas

Problemão em C

#1 Por Maragato 24/10/2003 - 16:54
Gente eu faço faculdade de computação e esse semestre estamos tendo Estrutura de Dados em C# o caso é que a maioria de nós não conhecia a linguagem, o professor pediu que implementássemos a seguinte definição de programa:

Atividade Listas Lineares por Encadeamento com Ponteiros
1) Elabore um programa em C que contenha funções e um pequeno programa de teste para implementar as seguintes funcionalidades:

Declaração das variáveis físicas que representarão a lista (variável para o início da lista)

Inicialização da lista

Inserção de elemento na lista

Deleção de Elemento da Lista

Percorrimento da lista mostrando o conteúdo na tela

As funções devem retornar uma indicação de sucesso ou insucesso da operação

As funções não interagem com o usuário, apenas com os parâmetros que recebem

A lista contém a seguinte estrutura: nome[50], idade, salario

As funções que devem ser implementadas são as seguintes:

llep_inicializa(&inicio)

llep_insere(&inicio, nodo)

llep_percorre(&inicio)

llep_deleta(&nodo)

O programa principal deve fazer a declaração das estruturas e o teste das funções.

Obs1: Estas funções farão parte da biblioteca do aluno. Faça-as da forma mais genérica possível para que possam ser facilmente adaptadas a outros contextos.


Depois de me debater um pouco cheguei perto do fim mas não sei como fazer para deletar os elementos da lista, aqui vai o meu código, digam oque acham e se possível como posso finalizá-lo.

#include <stdio.h>
#define NOT_PRESENT -1
#define NULL 0
#define LIST_CREATED 123456


typedef struct
{
int key;
char name[32];
}Node;


typedef struct
{
Node *array;
int array_size;
int list_size;
int first_pos;
int next_pos;
int magic_number;
}List;


List * listCreate(int max_size);
int listGetSize(List *l);
void listMakeEmpty(List *l);
void listDestroy (List *l);
void listPrint (List *l);
Node nodeCreate(int key, char *nome);
void listInsertNode (List *l, Node n, int pos);
int listFindNode (List *l, int key);
Node listGetNode (List *l, int pos);
void listRemoveNode (List *l, int pos);




int main(int argc, char *argv[])
{
printf("\t\tGerencia uma lista Linear\n&quot;
listCreate(100);
getchar();

return 0;
}



List* listCreate (int max_size)
{
Node *new_array;
List *new_list;

new_array = (Node*) calloc(max_size,sizeof(Node));
new_list = (List*) calloc(1,sizeof(List));

(*new_list).array = new_array;
(*new_list).array_size = max_size;
(*new_list).list_size = 0;
(*new_list).first_pos = 0;
(*new_list).next_pos = 0;
(*new_list).magic_number = LIST_CREATED;

return new_list;
}

void listInsertNode (List *l, Node n, int pos)
{
if ((*l).next_pos ==(*l).array_size)
return;
if (pos <= (*l).next_pos-(*l).first_pos)
{
(*l).array[pos+(*l).first_pos] = n;
if (pos==(*l).next_pos-(*l).first_pos)
{
++ (*l).next_pos;
++ (*l).list_size;
}
}
}



void listPrint (List *l)
{
int i=0;
for (i+(*l).first_pos; i<(*l).next_pos; ++i);
{
nodePrint((*l).array[i]);
printf(" &quot;
}
printf("\n&quot;
}


void nodePrint(Node n)
{
printf("(%d,%s)", n.key, n.name);
}






Posso criar só uma funçãozinha para pega o nodo tipo getNode e passar ele pra dentro da insertNode? Qual a maneira mais fácil de deletar os nodos? onde acho algorítimos parecidos com esse.
Maragato
Maragato Membro Senior Registrado
423 Mensagens 0 Curtidas
#2 Por Maragato
25/10/2003 - 21:32
Simplifiquei a bagaça
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


typedef struct nodo {
int info;
struct nodo *prox; //referencia uma struct dentro de outra
} nodo_T;


//============INICIALIZA A LISTA===================
int LLEP_inicializa(nodo_T **lista_P) {
*lista_P=NULL;
return 1;
}
//=================================================
//==============ALOCA NODO NA MEMORIA==============
nodo_T *LLEP_newnodo(int num) {

nodo_T *nodo_L;

nodo_L=malloc(sizeof(nodo_T));
nodo_L->info=num;
nodo_L->prox=NULL;

return nodo_L;
}
//=================================================
int LLEP_ins_nodo_ini (nodo_T **lista_P,nodo_T *nodo_P) {

nodo_P->prox=*lista_P;
*lista_P=nodo_P;
return 1;
}
//===========BUSCA A LISTA======================
nodo_T *LLEP_search (nodo_T **lista_P,int pos) {

int i;
nodo_T *aux;

aux=*lista_P;
for (i=1;i<pos;i++) {
aux=aux->prox;
}
printf("%d",aux->info);
return aux;
}
//==================================================
//===========IMPRIME A LISTA======================
nodo_T *LLEP_print (nodo_T **lista_P) {


nodo_T *aux;

aux=*lista_P;
for (aux=*lista_P; aux!=NULL ; aux=aux->prox) {

printf("\n%d",aux->info);
}

return aux;
}
//==================================================


int main()
{
nodo_T *nodo;
nodo_T *lista;
nodo_T *aux;

//inicializa lista
LLEP_inicializa(&lista);


nodo=LLEP_newnodo(99);
LLEP_ins_nodo_ini(&lista,nodo);
nodo=LLEP_newnodo(88);
LLEP_ins_nodo_ini(&lista,nodo);
nodo=LLEP_newnodo(66);
LLEP_ins_nodo_ini(&lista,nodo);
nodo=LLEP_newnodo(55);
LLEP_ins_nodo_ini(&lista,nodo);

LLEP_search(&lista,4);
LLEP_print(&lista);




getch();;
return 0;
}


Como eu posso deletar um nodo agora?
Lgub
Lgub Super Participante Registrado
936 Mensagens 1 Curtida
#3 Por Lgub
27/10/2003 - 11:03
O algortimo é assim,

Vc percorre a lista até achar o valor a ser encontrado, depois vc remove;
tipo:

Node *aux,*ant;
aux=inicio; // inicio é o ponteiro para o primeiro elemento
while(aux->valor!= valor_a_ser_removido && aux!=NULL)
{

ant=aux;
aux=aux->prox;
}

if(aux==NULL)
printf("Não achou&quot;
else
if(aux==inicio) // é o primeiro da lista;
inicio = aux->prox;
else
ant->prox=aux->prox;
free(aux);
}

Seria mais ou menos assim, qualquer duvida post ai.
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal