Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Ruben_Barbosa

Listas em C

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.