Помогите найти косяк в коде.
Задание
Определить структуру CStudent c полями имя,средний балл,номер группы.Определить класс CStudentList,работающий со списками студентов и реализовать в нем следующие функции : добавление элемента в начало списка,в конец списка,подсчет кол-ва элементов, добавление элемента в произвольную позицию списка, удаление элемента по позиции элемента,получение элемента заданной позиции.Отдельно реализовать функцию ввода одного элемента с клавиатуры и функцию вывода на экран одного элемента.
Мой код падает после любой команды введенной в консоли,падает на методе ремув (выделил жирным). Ну а так же с удовольствием выслушаю критику,относительно других кусков)
// KT_Lab_2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
struct CStudent
{
char src_Name[30];
int src_AvBall, src_NumGroup;
CStudent *src_Link;
CStudent ();
};
class CStudentList
{
private:
CStudent *CStdList_Head;
CStudent CStdList_NULL;
public:
CStudentList ();
~CStudentList ();
void AddTail (const CStudent &src);
void AddHead (const CStudent &src);
int GetCount () const;
int InsertAt (int nIndex, const CStudent &src);
int Remove (int nIndex);
CStudent GetAt (int nIndex);
};
CStudent::CStudent ()
{
src_Link = NULL;
}
CStudentList::CStudentList ()
{
CStdList_Head = NULL;
memcpy(CStdList_NULL.src_Name, "empty", 6);
CStdList_NULL.src_AvBall = -1;
CStdList_NULL.src_NumGroup = -1;
CStdList_NULL.src_Link = NULL;
};
CStudentList::~CStudentList ()
{
CStudent *CStdList_Temp = CStdList_Head;
while (CStdList_Head != NULL)
{
CStdList_Head = CStdList_Head->src_Link;
delete CStdList_Temp;
CStdList_Temp = CStdList_Head;
}
};
void CStudentList::AddTail (const CStudent &src)
{
CStudent *CStdList_Temp = CStdList_Head;
if (! CStdList_Temp)
{
CStudent *CStdList_Head = new CStudent;
*CStdList_Head = src;
} else
{
while (CStdList_Temp->src_Link != NULL)
CStdList_Temp = CStdList_Temp->src_Link;
CStudent *CStdList_New = new (CStudent);
*CStdList_New = src;
CStdList_Temp->src_Link = CStdList_New;
}
};
void CStudentList::AddHead (const CStudent &src)
{
CStudent *CStdList_Temp = CStdList_Head;
CStudent *CStdList_New = new (CStudent);
*CStdList_New = src;
CStdList_New->src_Link = CStdList_Temp;
CStdList_Head = CStdList_New;
};
int CStudentList::GetCount() const
{
int CStdList_Count = 0;
CStudent *CStdList_Temp = CStdList_Head;
while (CStdList_Temp != NULL)
{
CStdList_Temp = CStdList_Temp->src_Link;
CStdList_Count++;
};
return (CStdList_Count);
};
int CStudentList::InsertAt (int nIndex, const CStudent &src)
{
int i=0;
CStudent *CStdList_Temp = CStdList_Head;
CStudent *CStdList_Temp2;
if (CStdList_Temp->src_Link == NULL) return -1;
else
{
while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
{
i++;
CStdList_Temp2 = CStdList_Temp;
CStdList_Temp = CStdList_Temp->src_Link;
}
}
if (i == nIndex)
{
CStudent *CStdList_New = new (CStudent);
*CStdList_New = src;
CStdList_Temp2->src_Link = CStdList_New;
CStdList_New->src_Link = CStdList_Temp;
return 0;
}
else
{
return -1;
}
};
int CStudentList::Remove (int nIndex)
{
int i=0;
CStudent *CStdList_Temp = CStdList_Head;
CStudent *CStdList_Temp2;
if (CStdList_Temp->src_Link == NULL) return -1;
else
{
while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
{
i++;
CStdList_Temp2 = CStdList_Temp;
CStdList_Temp = CStdList_Temp->src_Link;
}
}
if (i == nIndex)
{
CStdList_Temp2->src_Link = CStdList_Temp->src_Link;
delete (CStdList_Temp);
return 0;
}
else
{
return -1;
}
};
CStudent CStudentList::GetAt (int nIndex)
{
int i=0;
CStudent *CStdList_Temp = CStdList_Head;
while ((i != nIndex) && (CStdList_Temp->src_Link != NULL))
{
i++;
CStdList_Temp = CStdList_Temp->src_Link;
}
if (i == nIndex)
{
return *CStdList_Temp;
}
else
{
return CStdList_NULL;
}
};
void Insert (CStudent &src)
{
printf ("Creating new record.\n");
printf ("Insert a name: ");
scanf ("%s", src.src_Name);
printf ("Insert an average ball: ");
scanf ("%d", &src.src_AvBall);
printf ("Insert a number of group: ");
scanf ("%d", &src.src_NumGroup);
printf ("Creating completed.\n");
};
void View (const CStudent &src)
{
printf ("Student %s.\n",src.src_Name );
printf ("Average ball: %d.\n",src.src_AvBall);
printf ("Number of group: %d.\n",src.src_NumGroup);
};
void Help()
{
printf("addt — добавление к конец списка\n");
printf("addh — добавление в начало списка\n");
printf("getc — получить число студентов в списке\n");
printf("insertat — добавление в указанное место списка\n");
printf("insert — добавление в список\n");
printf("remove — удаление одного студента из списка\n");
printf("getstd — получить информацию о студенте\n");
}
int _tmain (int argc, _TCHAR* argv[])
{
int Count;
int nIndex=0;
string cmd;
CStudent Stud;
CStudentList List;
printf("Чтобы увидеть список команд введите Help .\n");
do
{
printf ("Input command: ");
cin >> cmd;
if (cmd == string("help"))
Help();
if (cmd == string("insert"))
Insert (Stud);
View (Stud);
if (cmd == string("addh"))
{
List.AddHead (Stud);
Insert (Stud);
View (Stud);
}
if (cmd == string("addt"))
{
List.AddTail (Stud);
Insert (Stud);
View (Stud);
}
if (cmd == string("insertat"))
{
printf("Введите номер позиции:");
scanf ("%d. \n",nIndex);
List.InsertAt (nIndex,Stud);
Insert(Stud);
}
if (cmd == string("getc"))
{
Count = List.GetCount();
printf ("%d. \n",Count);
}
if (cmd == string("getstd"))
{
Stud = List.GetAt (2);
View (Stud);
}
if (cmd == string("remove"))
{
printf("Введите номер студента для удаления:");
scanf("%d. \n",nIndex)
List.Remove (nIndex);
}
}
while (cmd == string("exit"));
/*Count = List.GetCount();
printf ("%d",Count,"\n");
scanf ("%d", &Count);*/
}