/*
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;
}