EX 01
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
/*
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;
}
C
INFO