falcon67
Membros-
Total de itens
2 -
Registro em
-
Última visita
Sobre falcon67
falcon67's Achievements
0
Reputação
-
Olá galera estou com dificuldades pra resolver esse problema não sei nem começar, se alguém puder me ajudar. Implementar para lista com ponteiros: 1) A inserção em uma posição qualquer da lista, dada uma posição: 0 - insere antes do primeiro, 1 - insere antes do segundo, e assim por diante. Caso a posição seja inválida, não faça nada. 2) A concatenação de listas: concatena ([1,3,4], [7,9]) = [1,3,4,7,9]. A lista resultado deve ser uma nova lista diferente das 2 listas de entrada. #include <sys/time.h> #include <stdlib.h> #include <stdio.h> #define MAX 10 /* ========================================================================= */ typedef int TipoChave; typedef struct { int Chave; /* outros componentes */ } TipoItem; typedef struct TipoCelula *TipoApontador; typedef struct TipoCelula { TipoItem Item; TipoApontador Prox; } TipoCelula; typedef struct { TipoApontador Primeiro, Ultimo; } TipoLista; /* ========================================================================= */ void FLVazia(TipoLista *Lista) { Lista -> Primeiro = (TipoApontador) malloc(sizeof(TipoCelula)); Lista -> Ultimo = Lista -> Primeiro; Lista -> Primeiro -> Prox = NULL; } int Vazia(TipoLista Lista) { return (Lista.Primeiro == Lista.Ultimo); } void Insere(TipoItem x, TipoLista *Lista) { Lista -> Ultimo -> Prox = (TipoApontador) malloc(sizeof(TipoCelula)); Lista -> Ultimo = Lista -> Ultimo -> Prox; Lista -> Ultimo -> Item = x; Lista -> Ultimo -> Prox = NULL; } void Retira(TipoApontador p, TipoLista *Lista, TipoItem *Item) { /* --- Obs.: o item a ser retirado e o seguinte ao apontado por p --- */ TipoApontador q; if (Vazia(*Lista) || p == NULL || p -> Prox == NULL) { printf(" Erro Lista vazia ou posi c a o n a o existe\n"); return; } q = p -> Prox; *Item = q -> Item; p -> Prox = q -> Prox; if (p -> Prox == NULL) Lista -> Ultimo = p; free(q); } void Imprime(TipoLista Lista) { TipoApontador Aux; Aux = Lista.Primeiro -> Prox; while (Aux != NULL) { printf("%d\n", Aux -> Item.Chave); Aux = Aux -> Prox; } } /* ========================================================================== */ int main(int argc, char *argv[]) { struct timeval t; TipoLista lista; TipoItem item; int vetor[MAX]; TipoApontador p; int i, j, k, n; float tamanho=0; gettimeofday(&t,NULL); srand((unsigned int)t.tv_usec); FLVazia(&lista); /*Gera uma permutacao aleatoria de chaves entre 1 e MAX*/ for(i = 0; i < MAX; i++) vetor = i + 1; for(i = 0; i < MAX; i++) { k = (int) (10.0 * rand()/(RAND_MAX + 1.0)); j = (int) (10.0 * rand()/(RAND_MAX + 1.0)); n = vetor[k]; vetor[k] = vetor[j]; vetor[j] = n; } /*Insere cada chave na lista */ for (i = 0; i < MAX; i++) { item.Chave = vetor; Insere(item, &lista); tamanho++; printf("Inseriu: %d \n", item.Chave); } Imprime(lista); /*Retira cada chave da lista */ for(i = 0; i < MAX; i++) { /*escolhe uma chave aleatoriamente */ k = (int) ((tamanho) * rand() / (RAND_MAX + 1.0)); p = lista.Primeiro; /*retira chave apontada */ Retira(p, &lista, &item); tamanho--; printf("Retirou: %d\n", item.Chave); } Imprime (lista); return(0); }