My program receives strings, then i enter a value to execute a repetition,
I wanted the exit be "A" "B" "C" in loop.
But ever time in the second loop i gets a erros o memory in visual studio 2008.
Code:
// 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>
/* ---------------------------------------------------------------- */
// define a estrutura do processo
struct _no
{
struct _no *anterior;
char nome[40];
struct _no *proximo;
};
/* ---------------------------------------------------------------- */
typedef struct _no No;
// define um ponteiro para o numero raiz
No *Raiz=NULL;
// define um ponteiro para o ultimo numero
No *Ultimo=NULL;
/* ---------------------------------------------------------------- */
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ó raiz com os dados fornecidos e faz o último nó
// coincidir com ele
if (Raiz==NULL)
{
Raiz = (No *)malloc(sizeof(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; // se o nó atual é igual
// se 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 ja existente!\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
return;
}
// agora, iremos inserir o novo nó entre o nó atual e o nó anterior
NoPosterior = Atual;
// aloca memória para o novo nó
NovoNo = (No *)malloc(sizeof(No));
// coloca dados no nó a ser inserido
strcpy (NovoNo->nome,nome);
// 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;
printf ("\n");
// percorre a lista duplamente encadeada desde a raiz
Atual = 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;
//char *nomeatual;
// primeiro, percorre a lista duplamente encadeada desde a raiz
Atual = 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 MÓÓÓRRÉU
free(Atual);
printf ("\n\n Nome deletado! \n\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
return;
}
printf("\n\n Nao achei!\n");
printf ("\n\n\n\n ");
system("pause");
system("cls");
}
/* ---------------------------------------------------------------- */
void Executa(char *nome)
{
int Ciclos, Qtde;
Ciclos=1;
Qtde=1;
if (Raiz!=NULL)
{
No *Atual;
Atual = Raiz;
printf("\n\n Entre com a quantidade de ciclos desejada: " ); //EXECUTA A QUANTIDADE DE REGISTRO DESEJADA
scanf("%i", &Qtde);
while(Ciclos<Qtde) //VERIFICA QUANDO ECERRA O LAÇO
{
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 Nao existem processos na lista!");
}
printf("\n\n\n\n ");
system("pause");
system("cls");
Qtde=0;
Ciclos=1;
}
/* ---------------------------------------------------------------- */
int 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(nome);
break;
}
}
} while (opcao != 0);
}
/* ---------------------------------------------------------------- */