为什么这个程序的退出不能正常退出啊,而且查找不存在的名字会报错。。郁闷中。。。
#include<stdlib.h>#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdio.h>
#include<conio.h>
/********************************************************************************************************/
class CSalary
{
private:
char szName[20]; //姓名
double dlSalary; //工资
public:
CSalary(){ strcpy(szName,"\0");dlSalary=0.0;}
CSalary(char *,double);
void SetSalary(char *,double); //置工资与姓名
double GetSal(){return dlSalary; } //返回工资
int Compare(CSalary &); //比较姓名,供查找用,比较结果为1,0
void Show();//显示工资
char *GetName(){return szName;}
};
////////////////////////////////////////////////////////
void CSalary::SetSalary(char * name,double salary)
{ for(int i=0;i<20;i++)
{
if(*(name+i)=='\0')
break;
else
*(szName+i)=*(name+i);
}
*(szName+i)='\0';
dlSalary=salary;
}
int CSalary::Compare(CSalary &m) //比较本数据类中的szName与m中的szName是否相同,相同返回1,不同返回0
{
if(strcmp(szName,m.szName)==0)
return 1;
else
return 0;
}
void CSalary::Show()
{
cout<<"姓名:"<<szName<<"\t\t工资:"<<dlSalary<<endl;
}
/********************************************************************************************************/
class CNode //定义结点类
{
private:
CSalary *pData; //用于指向数据类的指针,这是每个数据的不同部分
CNode *pNext; //指向链表的指针
public:
CNode(){pData=0;pNext=0;} //结点构造函数
CNode(CNode & node) //用于拷贝的构造函数
{
pData=node.pData;
pNext=node.pNext;
}
void InputData(CSalary *pSal){pData=pSal;} //输入数据
void ShowNode(){pData->Show();}
CSalary *GetData(){return pData;}
friend class CList; //定义链表类为友元类
};
/*************************************************************************************************************/
class CList //定义链表类
{
protected:
CNode *pHead; //链表头结点指针
public:
CList(){pHead=0;}
~CList(){DeleteList();}
void AddNode(CNode *pnode); //在尾部添加结点
void DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针
CNode * LookUp(CSalary &); //查找一个指定的数据,返回该数据所在节点在链表中的指针,若未找到返回0
void ShowList(); //打印整个链表
void DeleteList(); //删除整个链表
CNode *GetListHead(){ return pHead;} //返回链表首结点
CNode *GetListNextNode(CNode *); //返回链表指定结点的下一个结点
void Insert(CNode *); //按工资的顺序插入一个结点
};
////////////////////////////////////
void CList::AddNode(CNode * pnode) //在尾部添加结点
{ CNode * p;
if(pHead==0)
{
pHead=pnode;
pnode->pNext=0;
}
else
{ p=pHead;
while(p->pNext!=NULL)
{
p=p->pNext;
}
p->pNext=pnode;
pnode->pNext=0;
}
}
void CList::DeleteNode(CNode *pnode)
{
if(pnode==pHead&&pHead->pNext==0)
{
delete pHead->pData;
delete pHead;
pHead=0;
}
else if(pnode==pHead)
{
CNode *p=pnode->pNext;
delete pHead->pData;
delete pHead;
pHead=p;
}
else
{
CNode *p,*q;
p=pHead;
while(p != NULL && p->pNext != pnode)
{
p=p->pNext;
}
q=p->pNext;
p->pNext=pnode->pNext;
delete pnode->pData;
delete pnode;
}
}
CNode * CList::LookUp(CSalary &salary)
{
CNode *p=pHead;
if (pHead == NULL)
{
return NULL;
}
else {
while(p->pData->Compare(salary)==0 && p!=NULL)
{
p=p->pNext;
}
if (p==NULL)
return 0;
return p;
}
}
void CList::ShowList()
{ if(pHead == NULL)
cout<<"链表为空!"<<endl;
CNode *p=pHead;
while (p!= NULL)
{
p->ShowNode();
p=p->pNext;
}
}
void CList::DeleteList()
{
if(pHead == NULL)
return;
CNode *p,*q;
while(p!=NULL)
{
delete p->pData;
q=p;
p=p->pNext;
delete q;
}
}
CNode * CList::GetListNextNode(CNode * pnode)
{
return pnode->pNext;
}
void CList::Insert(CNode * pnode)
{
if(pHead==NULL)
{ pHead=pnode;
pnode->pNext=NULL;
}
CNode *p,*q;
p=pHead;
if(pHead->pData->GetSal() > pnode->pData->GetSal())
{
pnode->pNext=pHead;
pHead=pnode;
return;
}
while(pnode->pData->GetSal() > p->pData->GetSal() && p->pNext!=NULL)
{
q=p;
p=p->pNext;
}
if(p->pNext!=NULL){
pnode->pNext=p;
q->pNext=pnode;
}
else{
pnode->pNext=NULL;
p->pNext=pnode;
}
}
/**********************************************************************************************************************/
CList SalaryList;
/*********************************************************************************************************************/
void Initial()
{ cout<<"*******************************************************************************"<<endl;
cout<<"** **"<<endl;
cout<<"** 欢迎使用工资管理系统 **"<<endl;
cout<<"** **"<<endl;
cout<<"*******************************************************************************"<<endl;
cout<<"** **"<<endl;
cout<<"** **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->请选择以下功能: **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->1.添加工资记录 **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->2.显示工资记录 **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->3.根据姓名查询工资数据 **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->4.根据姓名删除工资数据 **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->5.根据姓名修改工资数据 **"<<endl;
cout<<"** **"<<endl;
cout<<"**---------->6.保存并退出 **"<<endl;
cout<<"** **"<<endl;
cout<<"*******************************************************************************"<<endl;
cout<<"请输入你的选择:"<<endl;
}
void AddRecord(CList &SalaryList) //将记录添加到链表中,链表是唯一的
{
CNode *pNode;
CSalary *pSal;
char szName[20];
double dlPlaceSalary;
cout<<"输入姓名(输入0 结束): ";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
cout<<"请输入工资:\t";
cin>>dlPlaceSalary;
cin.ignore();
pSal=new CSalary; //生成新的数据类对象
pSal->SetSalary(szName,dlPlaceSalary); //数据类对象赋值
pNode=new CNode; //生成新的结点
pNode->InputData(pSal); //结点赋值
SalaryList.Insert(pNode); //结点加入链表
cout<<"输入姓名(输入0 结束):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void Open()
{
ifstream infile("EMP.txt");
char name[20];
double salary;
while(infile>>name>>salary)
{
CSalary *psalary=new CSalary;
psalary->SetSalary(name,salary);
CNode *pnode=new CNode;
pnode->InputData(psalary);
SalaryList.AddNode(pnode);
}
}
void Save()
{
ofstream outfile("EMP.txt");
char name[20];
double salary;
CNode *p;
p=SalaryList.GetListHead();
while(p!=NULL)
{
strcpy(name,p->GetData()->GetName());
salary=p->GetData()->GetSal();
outfile<<name<<" "<<salary<<endl;
p=SalaryList.GetListNextNode(p);
}
}
void ShowRecord()
{
SalaryList.ShowList();
}
void SearchShow()
{
CNode *pnode;
CSalary *pSal;
char name[20];
system("cls");
cout<<"请输入要查找的姓名"<<endl;
cin.getline(name,20);
pSal=new CSalary;
pSal->SetSalary(name,0);
pnode=new CNode;
pnode=SalaryList.LookUp(*pSal);
if(pnode==0)
cout<<"未找到相关数据"<<endl;
else
pnode->ShowNode();
}
void Delete()
{
CNode *pnode;
CSalary *pSal;
char name[20];
system("cls");
cout<<"请输入要删除的姓名"<<endl;
cin.getline(name,20);
pSal=new CSalary;
pSal->SetSalary(name,0);
pnode=new CNode;
pnode=SalaryList.LookUp(*pSal);
if(pnode==0)
cout<<"删除失败,未找到相关数据"<<endl;
}
/***********************************************************************************************************************/
void main()
{
int nChoice;
char str[30];
Open();
while(1){
Initial();
cin.getline(str,30);
nChoice=atoi(str);
switch(nChoice){
case 1:
system("cls");
AddRecord(SalaryList);
break;
case 2:
system("cls");
ShowRecord();
getch();
break;
case 3:
system("cls");
SearchShow();
getch();
break;
case 4:
Delete();
break;
case 6:
Save();
break;
default:
cout<<"输入非法,请重新输入!"<<endl;
getch();
break;
}
if(nChoice==6)
break;
}
}