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);

} 

/* ---------------------------------------------------------------- */