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); } /* ---------------------------------------------------------------- */



LinkBack URL
About LinkBacks



