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

Ruben_Barbosa

Listas em C

Recommended Posts

Ruben_Barbosa

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

typedef struct nodo{
    int dado;
    struct nodo *elo;
    struct nodo *down;
}NODO;

typedef struct vector_listas{
    int index_lista;
    NODO *prim;
}VECTOR_LISTAS;

typedef struct array{
    int tamanho;
    VECTOR_LISTAS *elo_listas;
}ARRAY;

#define MAXLINHA 200
#define MAXCOLUNA 200
#define MAX 200

void init_array(ARRAY *p, int tam);
void validacao(int linhas, int colunas, int *array, int sizing);
void insert_valor(ARRAY *p, int num);
void link_nodos(ARRAY *p, int linhas);
//void remove_valor(ARRAY *p, int num);
void save_work(char filename[], ARRAY *p);
void print_lista(ARRAY *p);

int main()
{
    int i = 0; int j = 0;
    int linhas; int colunas; int sizing;
    int vector[MAX];
    VECTOR_LISTAS vlista;
    char filename[]="projecto.txt";
    printf("Introduza o numero de linhas:");
    scanf("%d", &linhas);
    printf("Introduza o numero de colunas:");
    scanf("%d", &colunas);
    printf("Introduza o tamanho das Palavras:");
    scanf("%d", &sizing);
    printf("Introduza os numeros:\n");
    for(i=0;i<sizing;i++)
        scanf(" %d",&vector[i]);

    validacao(linhas,colunas,vector,sizing);
    init_array(&vlista, linhas);
    for(i=0; i < linhas; i++){
        for(j=0; j < colunas; j++){
            insert_valor(&vlista, i);
        }
    }
    link_nodos(&vlista,linhas);
    //remove_valor(&vlista,i);
    print_lista(&vlista);
    save_work(filename, &vlista);
}

void init_array(ARRAY *p, int tam)
{
    int i = 0;
    p->tamanho = tam;
    p->elo_listas = (VECTOR_LISTAS*)malloc(sizeof(VECTOR_LISTAS) * p->tamanho); //[cria tamanho links]
    //[listas de arrays forem necessarias]
    for(i=0; i < tam; i++)
    {
        (p->elo_listas + i)->prim = NULL; //[1 Elo da Lista e dps consoante o numero de linhas inseridas pelo utilizador vai incrementado]
        (p->elo_listas + i)->index_lista = i;//[Obter o numero Linhas com X Nodos/elos inseridas pelo Utilizador]
    }
}

void validacao(int linhas, int colunas, int *array, int sizing)
{
    int soma = 0;
    int random = 0;
    int i = 0;
    int maior = 0;
    int cal_aux = ((linhas - 1)*colunas); //MAX palavras
    int MaxPal =cal_aux;
    int cal_aux2 = (linhas*colunas); //espaço total do puzzle
    int MinPal = cal_aux2 -MaxPal; // Min Pal
    maior = array[0];

    for(i = 0; i < sizing; i++)
    {
        soma = soma + array[i];
        if(array[i] > maior)
        {
            maior = array[i];
        }
    }
    printf("maior = %d\n", maior);
    printf("soma = %d\n", soma);
    printf("Calculo auxiliar --> (linhas - 1)* colunas) = %d obtemos numero maximo de palavras \n",cal_aux2);
    printf("Calculo auxiliar --> (linhas * colunas) = %d obtemos espaço total do puzzle \n", MaxPal);
    printf("Valor minimo de Palavras = %d\n", MinPal);
    printf("Valor maximo de Palavras = %d\n", MaxPal - MinPal);
    if(sizing >= (MaxPal - MinPal))
    {
        printf("ERRO: Numero de palavras a introduzir demasiado grande para o puzzle\n");
    }
    if(sizing < MinPal)
    {
        printf("ERRO: Numero de palavras demasiado pequeno para preencher o puzzle\n");
    }
    if(soma > cal_aux2)
    {
        printf("ERRO: Somatorio do tamanho de todas as palavras inseridas demasiado grande para ser inserido no puzzle\n");
    }
    if(soma != MaxPal)
    {
        printf("ERRO: O sumatorio do numero de palavras inserido para preencher totalmente o puzzle tem de ser = %d\n", MaxPal);
    }
    if(maior > linhas)
    {
        printf("ERRO: Introduziu uma palavra com tamanho superior a %d do tamanho coluna \n", linhas);
    }
}

void insert_valor(ARRAY *p, int num)
{

    int i;
    NODO *NOVO=NULL;
    NODO *ptemp=NULL;

    for (i=0; i < p->tamanho; i++)
    {
        //[Percorre o array de listas]
        if(num == (p->elo_listas + i)->index_lista)
        {
            //Encontrou o numero correspondente onde inserir o novo nodo
            ptemp=(p->elo_listas + i)->prim;
            //[Percorrendo a lista propriamente dita ate encontrar]
            while (ptemp != NULL && ptemp->dado != num)
            {
                ptemp = ptemp->elo;
            }
                //[se não existir nenhum NODO, cria um novo NODO]
                NOVO = (NODO*)malloc(sizeof(NODO));
                NOVO->dado = '0';
                NOVO->down = NULL;
                NOVO->elo = (p->elo_listas + i)-> prim;
                (p->elo_listas + i)->prim = NOVO;
            break;
        }
        }
}

void link_nodos(ARRAY *p, int linhas)
{
    int i=0,k=0;
    NODO *ptemp = NULL;
    NODO *ptemp1 = NULL;

    for (i=0, k=1; i <p->tamanho; i++,k++)
    {
        ptemp=(p->elo_listas + i)->prim; //Elo1
        ptemp1=(p->elo_listas + k)->prim; //Elo2
        if(k == linhas)
        {
            ptemp1 = NULL; // Lista das Linhas chegou ao fim
        }

        while(ptemp != NULL && ptemp1 != NULL) //Lista Da coluna para ligacao
        {
            ptemp->down = ptemp1;
            ptemp = ptemp->elo;
            ptemp1 = ptemp1->elo;
        }
    }
}

void print_lista(ARRAY *p)
{
    int i=0;
    NODO *ptemp;
    //[Enquanto o i For menor que o Valor Inserido Pelo utilizador nas linhas.Ele Imprime a Linha e Depois vai incrementando os elos até chegar
    //ao fim do valor inserido pelo utilizador das colunas]
    for(i = 0; i < p->tamanho; i++)
    {
        ptemp = (p->elo_listas + i)->prim; // tomar valor do Elo no 1 Nodo
        printf("\nlinha[%d] ->   ",i);
        //[incrementa os Nodos enquanto não Chegar a NULL]
        while(ptemp!=NULL)
        {
            printf(" [%d] ->",ptemp->dado);
        //[incrementando os Elos]
            ptemp=ptemp->elo;
        }
    }
}

void save_work(char filename[], ARRAY *p)
{
    FILE *f;
    NODO *ptemp = NULL;
    int i=0;
    f = fopen(filename, "a");
    if( f == NULL )
    {
         printf("ERRO: não consigo abrir o ficheiro Trabalho.txt\n");
         exit(1);
    }

    for (i=0;i <p->tamanho;i++)
    {
        ptemp = (p->elo_listas + i)->prim;
         fprintf(f,"\nlinha [%d] -> ", i); //LINHA = X
        while (ptemp != NULL)
        {
           fprintf (f, "[%d]->",ptemp->dado);
           ptemp = ptemp->elo; //Incrementa o proximo valor de ptemp
        }
    }
    fclose;
}


/**void remove_valor(ARRAY *p, int num)
{
    int i;
    NODO *pant=NULL;
    NODO *ptemp=NULL;

    for (i=0;i<p->tamanho;i++)
    {
        if(num == (p->elo_listas + i)->index_lista)
        {
            ptemp=(p->elo_listas +i)->prim;
            //while (ptemp!=NULL && strcmp(ptemp->ppal,pal)!=0)
            while (ptemp != NULL && ptemp->dado != num)
            {
                pant=ptemp;
                ptemp=ptemp->elo;
            }
            if (pant==NULL)
            {
                (p->elo_listas + i)->prim=ptemp->elo;
                free(ptemp);
            }
            else
            {
                pant->elo=ptemp->elo;
                free(ptemp);
            }
            break;
        }
    }
}
**/

Bem pessoal eu estou com um problema que é o seguinte:

Eu introduzo linha 3,coluna 3 e tamanho da palavra 6

Depois insiro os numeros que pretendo.

E a minha aplicação está me sempre a Criar as Listas mas sempre com os mesmo numeros

Linha [48]-> [48]->[48]

Linha [48]-> [48]->[48]

Linha [48]-> [48]->[48]

já procurei e nao sei que mais e Continuo na mesma :|, eu acho que o problema ou é da ligação dos Nodos ou então da Inserção mas nao consegui detectar ainda o problema  :wallbash:

Desde Ja agradeco toda ajuda.

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.