Criei esse programa que simula um taskmanager, apenas para praticar "lista circular duplamente encadeada" então fiz com função.
Opção 1 - Incluir (Ela inclui um valor em string e armazena) [Funciona]
Opção 2 - Deletar (Deleta a string que deseja) [Funciona]
Opção 3 - Listar (Lista todas as strings em ordem alfabetica [Funciona]
Opção 4 - Executa (Essa opção deveria receber um valor em int, e fazer um loop alternando as strings até o final. EX. você entrou com "A-B-C" e ao executar essa opção colocou o numero 4 deveria fazer "A=1 B=1 C=1 A=2 B=2 C=2... etc...
mas ele só faz a primeira certinho A=1 B=1 C=1 eda estouro de memoria.)
Segue o codigo.
// Projeto_Veiculos.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <iostream>
/* ---------------------------------------------------------------- */
struct _no // define a estrutura do processo
{
struct _no *anterior;
char nome[40];
struct _no *proximo;
};
/* ---------------------------------------------------------------- */
typedef struct _no No;
No *Raiz=NULL; // define um ponteiro para o numero raiz
No *Ultimo=NULL; // define um ponteiro para o ultimo numero
/* ---------------------------------------------------------------- */
void Insere(char *nome)
{
No *Atual;
No *NoAnterior;
No *NoPosterior;
No *NovoNo;
// Verifica se o nó na raiz é nulo, que é o caso quando a lista está vazia.
// Se for, cria nó na raiz com os dados fornecidos e faz o último nó coincidir com ele.
if (Raiz==NULL)
{
Raiz = new No;
strcpy (Raiz->nome,nome);
Raiz->proximo = NULL;
Raiz->anterior = NULL;
Ultimo = Raiz;
}
else
{
// se já houver raiz percorre a lista duplamente encadeada, comecando da raiz.
// inicialmente, não há nó anterior.
NoAnterior = NULL;
Atual = Raiz;
while (Atual!=NULL)
{
if (strcmp(Atual->nome,nome)>=0) break; // verifica se o nó atual é igual, se for superior pára
else
{
NoAnterior = Atual;
Atual = Atual->proximo;
}
}
if (Atual!=NULL) // só faz a comparação abaixo se existe o nó Atual
if (strcmp(Atual->nome,nome)==0)
{
printf ("\n\n Nome já existente!\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
return;
}
NoPosterior = Atual; // insere um novo nó entre o nó atual e o nó anterior
NovoNo = new No; // aloca memória para o novo nó
strcpy (NovoNo->nome,nome); // coloca dados no nó a ser inserido
// atualiza ponteiros do novo nó
NovoNo->proximo = NoPosterior;
NovoNo->anterior = NoAnterior;
// atualiza ponteiros dos nós vizinhos
if (NoAnterior != NULL)
NoAnterior->proximo = NovoNo;
if (NoPosterior != NULL)
NoPosterior->anterior = NovoNo;
// verifica se o novo nó foi inserido no início ou no fim da lista se foi, atualiza referências
if (NovoNo->anterior == NULL)
Raiz = NovoNo;
if (NovoNo->proximo == NULL)
Ultimo = NovoNo;
}
}
/* ---------------------------------------------------------------- */
void Lista()
{
No *Atual;
Atual = Raiz;
// percorre a lista duplamente encadeada desde a raiz
while(Atual!=NULL)
{
printf ("\n Processo: %s\n",Atual->nome);
Atual=Atual->proximo;
}
printf ("\n\n\n\n ");
system("pause");
system("cls");
}
/* ---------------------------------------------------------------- */
void Deleta(char *nome)
{
No *Atual;
No *Anterior=NULL;
No *Posterior;
Atual = Raiz;
// primeiro, percorre a lista duplamente encadeada desde a raiz
while (Atual!=NULL)
{
// verifica se já encontrei ou já passei do nome procurado
if (strcmp(Atual->nome,nome)>=0) break;
else
{ // se ainda não passou
Anterior = Atual;
Atual = Atual->proximo;
}
}
if (Atual!=NULL)
Posterior = Atual->proximo;
// verifica se o nó atual é mesmo o nó procurado
if (Atual != NULL)
if (strcmp(Atual->nome,nome)==0) { // se for, deleta
// faz com que o nó subsequente ao atual seja o subsequente ao nó anterior para manter a integridade da lista
if (Atual != Raiz)
Anterior->proximo = Atual->proximo;
else // se o no atual é a raiz, atualizo a referência para a raiz
Raiz = Atual->proximo;
// faz com que a referência para o nó anterior do próximo nó seja
// o nó anterior ao que será deletado, para manter a integridade
if (Atual != Ultimo)
Posterior->anterior = Anterior;
else // se o nó atual é o último, atualiza a referência para o último
Ultimo = Anterior;
// agora, o nó atual morreeeee!!!!
free(Atual);
printf ("\n\n Nome deletado! \n\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
return;
}
printf("\n\n não achei!\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
}
/* ---------------------------------------------------------------- */
void Executa()
{
int Ciclos, Qtde;
No *Atual;
Atual = Raiz;
Ciclos=1;
Qtde=1;
if (Raiz!=NULL)
{
// recebe o valor para executar o loop solicitado
printf("\n\n Entre com a quantidade de ciclos desejada: " );
scanf("%i", &Qtde);
while(Ciclos<Qtde) // verifica quando o loop é encerrado
{
if (Atual==Raiz)
{
Ciclos++;
}
printf(" Processo: %s | Qtde: %d | Ciclo: %i \n", Atual->nome, Qtde, Ciclos-1);
Atual = Atual->proximo;
Sleep(500);
}
}
else
{
printf("\n\n não existem processos na lista!");
}
printf("\n\n\n\n ");
system("pause");
system("cls");
Qtde=0;
Ciclos=1;
}
/* ---------------------------------------------------------------- */
void main ()
{
int opcao;
char nome[40];
do
{
printf("\n\n ****************** MENU ****************** \n (1) -> para inserir um novo processo:\n (2) -> para excluir um processo:\n (3) -> para listar todos os processos: \n (4) -> para executar os processos: \n (0) -> para sair \n ****************************************** \n\n Opcao: ");
scanf("%d",&opcao);
if (opcao == 1 || opcao == 2)
{
printf("\n\n Entre com o nome do processo: " );
scanf("%s",nome);
system("cls");
}
switch (opcao)
{
case 1:
{
Insere(nome);
break;
}
case 2:
{
Deleta(nome);
break;
}
case 3:
{
Lista();
break;
}
case 4:
{
Executa();
break;
}
}
} while (opcao != 0);
}
/* ---------------------------------------------------------------- */
Pergunta
Ervilha
Criei esse programa que simula um taskmanager, apenas para praticar "lista circular duplamente encadeada" então fiz com função.
Opção 1 - Incluir (Ela inclui um valor em string e armazena) [Funciona]
Opção 2 - Deletar (Deleta a string que deseja) [Funciona]
Opção 3 - Listar (Lista todas as strings em ordem alfabetica [Funciona]
Opção 4 - Executa (Essa opção deveria receber um valor em int, e fazer um loop alternando as strings até o final. EX. você entrou com "A-B-C" e ao executar essa opção colocou o numero 4 deveria fazer "A=1 B=1 C=1 A=2 B=2 C=2... etc...
mas ele só faz a primeira certinho A=1 B=1 C=1 eda estouro de memoria.)
Segue o codigo.
// Projeto_Veiculos.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <dos.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <iostream> /* ---------------------------------------------------------------- */ struct _no // define a estrutura do processo { struct _no *anterior; char nome[40]; struct _no *proximo; }; /* ---------------------------------------------------------------- */ typedef struct _no No; No *Raiz=NULL; // define um ponteiro para o numero raiz No *Ultimo=NULL; // define um ponteiro para o ultimo numero /* ---------------------------------------------------------------- */ void Insere(char *nome) { No *Atual; No *NoAnterior; No *NoPosterior; No *NovoNo; // Verifica se o nó na raiz é nulo, que é o caso quando a lista está vazia. // Se for, cria nó na raiz com os dados fornecidos e faz o último nó coincidir com ele. if (Raiz==NULL) { Raiz = new No; strcpy (Raiz->nome,nome); Raiz->proximo = NULL; Raiz->anterior = NULL; Ultimo = Raiz; } else { // se já houver raiz percorre a lista duplamente encadeada, comecando da raiz. // inicialmente, não há nó anterior. NoAnterior = NULL; Atual = Raiz; while (Atual!=NULL) { if (strcmp(Atual->nome,nome)>=0) break; // verifica se o nó atual é igual, se for superior pára else { NoAnterior = Atual; Atual = Atual->proximo; } } if (Atual!=NULL) // só faz a comparação abaixo se existe o nó Atual if (strcmp(Atual->nome,nome)==0) { printf ("\n\n Nome já existente!\n"); printf ("\n\n\n\n "); system("pause"); system("cls"); return; } NoPosterior = Atual; // insere um novo nó entre o nó atual e o nó anterior NovoNo = new No; // aloca memória para o novo nó strcpy (NovoNo->nome,nome); // coloca dados no nó a ser inserido // atualiza ponteiros do novo nó NovoNo->proximo = NoPosterior; NovoNo->anterior = NoAnterior; // atualiza ponteiros dos nós vizinhos if (NoAnterior != NULL) NoAnterior->proximo = NovoNo; if (NoPosterior != NULL) NoPosterior->anterior = NovoNo; // verifica se o novo nó foi inserido no início ou no fim da lista se foi, atualiza referências if (NovoNo->anterior == NULL) Raiz = NovoNo; if (NovoNo->proximo == NULL) Ultimo = NovoNo; } } /* ---------------------------------------------------------------- */ void Lista() { No *Atual; Atual = Raiz; // percorre a lista duplamente encadeada desde a raiz while(Atual!=NULL) { printf ("\n Processo: %s\n",Atual->nome); Atual=Atual->proximo; } printf ("\n\n\n\n "); system("pause"); system("cls"); } /* ---------------------------------------------------------------- */ void Deleta(char *nome) { No *Atual; No *Anterior=NULL; No *Posterior; Atual = Raiz; // primeiro, percorre a lista duplamente encadeada desde a raiz while (Atual!=NULL) { // verifica se já encontrei ou já passei do nome procurado if (strcmp(Atual->nome,nome)>=0) break; else { // se ainda não passou Anterior = Atual; Atual = Atual->proximo; } } if (Atual!=NULL) Posterior = Atual->proximo; // verifica se o nó atual é mesmo o nó procurado if (Atual != NULL) if (strcmp(Atual->nome,nome)==0) { // se for, deleta // faz com que o nó subsequente ao atual seja o subsequente ao nó anterior para manter a integridade da lista if (Atual != Raiz) Anterior->proximo = Atual->proximo; else // se o no atual é a raiz, atualizo a referência para a raiz Raiz = Atual->proximo; // faz com que a referência para o nó anterior do próximo nó seja // o nó anterior ao que será deletado, para manter a integridade if (Atual != Ultimo) Posterior->anterior = Anterior; else // se o nó atual é o último, atualiza a referência para o último Ultimo = Anterior; // agora, o nó atual morreeeee!!!! free(Atual); printf ("\n\n Nome deletado! \n\n"); printf ("\n\n\n\n "); system("pause"); system("cls"); return; } printf("\n\n não achei!\n"); printf ("\n\n\n\n "); system("pause"); system("cls"); } /* ---------------------------------------------------------------- */ void Executa() { int Ciclos, Qtde; No *Atual; Atual = Raiz; Ciclos=1; Qtde=1; if (Raiz!=NULL) { // recebe o valor para executar o loop solicitado printf("\n\n Entre com a quantidade de ciclos desejada: " ); scanf("%i", &Qtde); while(Ciclos<Qtde) // verifica quando o loop é encerrado { if (Atual==Raiz) { Ciclos++; } printf(" Processo: %s | Qtde: %d | Ciclo: %i \n", Atual->nome, Qtde, Ciclos-1); Atual = Atual->proximo; Sleep(500); } } else { printf("\n\n não existem processos na lista!"); } printf("\n\n\n\n "); system("pause"); system("cls"); Qtde=0; Ciclos=1; } /* ---------------------------------------------------------------- */ void main () { int opcao; char nome[40]; do { printf("\n\n ****************** MENU ****************** \n (1) -> para inserir um novo processo:\n (2) -> para excluir um processo:\n (3) -> para listar todos os processos: \n (4) -> para executar os processos: \n (0) -> para sair \n ****************************************** \n\n Opcao: "); scanf("%d",&opcao); if (opcao == 1 || opcao == 2) { printf("\n\n Entre com o nome do processo: " ); scanf("%s",nome); system("cls"); } switch (opcao) { case 1: { Insere(nome); break; } case 2: { Deleta(nome); break; } case 3: { Lista(); break; } case 4: { Executa(); break; } } } while (opcao != 0); } /* ---------------------------------------------------------------- */Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.