Enviado em 02/04/2017 - 12:06h
Bom dia caros colegas, venho mais uma vez recorrer a ajuda de vocês para um problema que eu estou tendo.
//ListaDuplEncad.h
#include <stdio.h>
#include <stdlib.h>
struct no
{
no *ant;
int item;
no *prox;
};
struct TipoLista
{
no *inicio;
no *fim;
};
void Inicializa(TipoLista *lista)
{
lista->inicio = lista->fim = NULL;
}
int Vazia(TipoLista *lista)
{
return (lista->inicio == NULL && lista->fim == NULL);
}
//Insere no fim da lista
void Insere_Fim(int elem, TipoLista *lista)
{
no *novo;
novo = (no *)malloc(sizeof(no));
novo->ant = novo->prox = NULL;
novo->item = elem;
if (Vazia(lista))
{
lista->inicio = novo;
}
else
{
lista->fim->prox = novo;
novo->ant = lista->fim;
}
lista->fim = novo;
}
//Insere o elemento na posição indicada
void Insere_Pos(int elem, int pos, TipoLista *lista)
{
no *novo;
novo = (no *)malloc(sizeof(no));
novo->ant = novo->prox = NULL;
novo->item = elem;
if (pos == 0)
{
novo->prox = lista->inicio;
lista->inicio = novo;
}
else
{
int contador = 0; //contador de posicoes
no *aux, *proximo, *anterior; //declaracao de ponteiros
aux = proximo = anterior = NULL; //no inicio todos são nulos
aux = lista->inicio; //auxiliar aponta para o inicio da fila
while(contador < pos && aux->prox != NULL)
{
contador++;
anterior = aux; //auxiliar passa a ser anterior
aux = aux->prox; //atualiza o endereço do auxiliar para o proximo
proximo = aux->prox; //indica quem vem a frente do auxiliar atualizado
}
if (contador == pos)
{
novo->ant = anterior;
anterior->prox = novo;
novo->prox = aux;
aux->ant = novo;
/*
anterior->prox = novo; //atualiza o prox do anterior para apontar para o novo item
novo->ant = anterior; //aponta para o item anterior
novo->prox = aux; //aponta para o item que entrou na frente
aux->ant = novo; //faz o item da posicao ocupada apontar seu ant para o novo
*/
}
}
}
//Imprime a lista
void Imprime(TipoLista *lista)
{
no *aux;
aux = lista->inicio;
int contador = 0;
while(aux != NULL)
{
printf("pos %d - item %d\n", contador, aux->item);
contador++;
aux = aux->prox;
}
}
//Remove o elemento indicado se houver
void Remove_Elem(int elem, TipoLista *lista)
{
no *aux, *anterior, *proximo;
aux = anterior = proximo = NULL;
aux = lista->inicio;
proximo = aux->prox;
int busca, contador;
busca = contador = 0;
while(aux->item != elem && aux != NULL)
{
anterior = aux;
aux = aux->prox;
proximo = aux->prox;
contador++;
}
if (contador == 0 && busca == 0)
{
lista->inicio = proximo;
proximo->ant == NULL;
busca = 1;
puts("Removido elemento da posicao 0");
getchar();
}
else
if (elem == aux->item && aux->prox == NULL && busca == 0)
{
lista->fim = anterior;
anterior->prox = NULL;
busca = 1;
free(aux);
printf("Removido elemento da posicao %d - Fim da fila alterado\n", contador);
getchar();
}
else
if(aux->item == elem && aux->prox != NULL && busca == 0)
{
anterior->prox = proximo;
proximo->ant = anterior;
busca = 1;
free(aux);
printf("Removido o elemento da posicao %d\n", contador);
getchar();
}
if(busca == 0)
{
puts("Elemento nao encontrado");
getchar();
}
}
//Temp.cpp
#include <stdio.h>
#include <stdlib.h>
#include "ListaDuplEncad.h"
int main()
{
TipoLista lista;
Inicializa(&lista);
Insere_Fim(1, &lista);
Insere_Fim(2, &lista);
Insere_Fim(3, &lista);
Insere_Pos(8, 0, &lista);
Insere_Pos(9, 1, &lista);
Insere_Pos(8, 4, &lista);
if(Vazia(&lista))
{
puts("Lista Vazia");
getchar();
}
else
{
puts("Lista contem itens");
getchar();
}
Imprime(&lista);
Remove_Elem(10, &lista);
Imprime(&lista);
}
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
UUID da partição efi mudou, multiboot já era...e agora? (0)