Quick actions

cmd+k|ctrl+k

Navigation

Languages

EX 01

Snippet info

Language

C

Visibility

public

Author

rodrigogons

Created

2017-05-24T22:19:14Z

Updated

2017-05-25T01:05:13Z

/*
    Faça um programa para gerenciar uma lista dinâmica duplamente enca-
    deada circular. O usuário terá a opção de inserir quantos nós (elementos)
    desejar e imprimir sequencialmente a lista em qualquer ordem.  O pro-
    grama também deverá permitir ao usuário eliminar nós pelo valor digitado
    e inserir nós na posição que o usuário desejar.
*/


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

typedef int bool;
#define true 1
#define false 0

typedef struct estru 
{
    int num, posi;
    struct estru *ant;
    struct estru *prox;
} lista;

lista *ini=NULL, *p, *q=NULL, *r;


/*
    renumera a posicao da lista
*/
void reordena()
{
    p = ini;
    int i = 1;
    do
    {
        p->posi = i;
        i++;
        p = p->prox;
    } while(p != ini);
}

/*
    Procura a posicao a ser a inicial a partir dai imprime os valores
*/
int print(int val)
{
    p = ini;
    while(p->posi != val)
    {   
        if(p->prox == ini)
        {
            printf("Posicao nao encontrada.");
            return 0;
        }
        p = p->prox;
    }
    do
    {
        printf("posicao %d, valor do no: %d\n", p->posi, p->num);
        p = p->prox;
    }while(p->posi != val);
}

/*
    inicia a lista com os valores do usuario
*/
void cria(int val, int posicao)
{
    p = malloc(sizeof(lista));
    p->num = val;
    p->posi = posicao;
    if(ini==NULL) ini = p;
    else
    {
        p->ant = q;
        q->prox = p;
    }
    p->prox = ini;
    ini->ant = p;
    q = p;
}


/*
    localiza a posicao onde sera inserido o novo ponteiro e 
    posiciona-o na lista
*/
void insere(int val, int posicao)
{
    q = malloc(sizeof(lista));
    q->num = val;
    q->posi = posicao;
    p = ini;
    do
    {
        if(p->posi == posicao)
        {
            r = p->ant;
            r->prox = q;
            q->prox = p;
            q->ant = p->ant;
            p->ant = q;
        }
        p = p->prox;
    } while(p != ini);
    reordena();
}


/*
    localiza o valores a serem removidos e remove-os
*/
void popn(int val)
{
    bool naoExiste = true;
    p = ini;
    do
    {
        q = p->prox;
        if(p->num == val)
        {
            printf("posicao %d, valor %d removida.\n", p->posi, p->num);
            p = p->ant;
            p->prox = q;
            q->ant = p;
            naoExiste = false;
        }
        p = p->prox;
    } while(p != ini);
    if(naoExiste) printf("valor %d não existe na lista.", val);
    printf("\n");
    reordena();
}


int main()
{
    int num, i=1;
    
    // recebe valores
    while(1)
    {
        scanf("%d", &num);
        if(num == -1) break;
        printf("posicao %d, valor do no: %d\n", i, num);
        cria(num, i);
        i++;
    }
    
    printf("\n");
    
    scanf("%d", &num);
    printf("valor inicial para imprimir %d\n\n", num);
    print(num);
    
    
    scanf("%d", &num);
    printf("\nvalor a ser removido %d\n\n", num);
    popn(num);
    print(1);
    
    scanf("%d %d", &num, &i);
    printf("\nvalor %d sera adicionado na posicao %d\n\n", num, i);
    insere(num, i);
    print(1);
    
    free(ini);
    return 0;
}











INFO