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);
}
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Visualizar câmeras IP ONVIF no Linux sem necessidade de instalar aplicativos
Realizar overclock no Miyoo Mini (plus ou normal)
Otimização de memória para máquinas modestas
Dúvidas sobre a originalidade de conteúdos online (8)
Monitoramento pfsense com zabbix (3)
Google Crhome não abre desde que eu atualizei pelo "program... (13)
como instalar o amdgpu no linux manjaro no linux, pelo o repo e comand... (4)