新微赢技术网
标题:
面对这个问题已经很多天就是解决不料 请指教一下
[打印本页]
作者:
冷冷DI草
时间:
2009-11-3 03:28
标题:
面对这个问题已经很多天就是解决不料 请指教一下
//list.h
//定义数据基类
class Data
{
public :
Data(){}
virtual int Compare(Data&)=0;
virtual void Show()=0;
virtual ~Data(){};
};
//定义结点类
class Node
{
private:
Data *pdata; //指向数据类的指针
Node *pnext; //指向链表的后继指针
public:
//结点构造函数
Node(){pdata=0;pnext=0;}
//用于拷贝的构造函数
Node(Node &node)
{
pdata=node.pdata;
pnext=node.pnext;
}
//输入数据
void InputData(Data *p){ pdata=p;}
void ShowNode(){pdata->Show();}
Data *GetData(){return pdata;}
friend class List;
friend class ListSuper;
};
//定义链表类
class List
{
protected:
Node *phead;
public:
List(){phead=0;}
~List(){DeleteList();}
//在首部添加结点
void AddNode(Node *p);
//删除一个指定的结点,返回该结点的指针
Node* DeleteNode(Node*);
//查找一个指定的数据,返回该数据所在结点在链表中的指针,如未找到返回0
Node *LookUp(Data&);
//打印整个链表
void ShowList();
//删除整个链表
void DeleteList();
//返回链表头接点
Node *GetListHead(){return phead;}
//返回链表指定结点的下一个结点
Node *GetListNextNode(Node*);
};
/***********************************************
*返回:链表指定结点的下一个结点
************************************************/
Node*List::GetListNextNode(Node*p)
{
Node *p1=p;
return p1->pnext;
}
//在首部添加结点
void List::AddNode(Node *p)
{
//如果是空表,插入的结点是唯一的结点
if(phead==0)
{
phead=p;
p->pnext=0;
return;
}
else
{p->pnext=phead;
phead=p;
}
}
/**********************************************
*功能:删除一个指定的结点
*返回:该结点的指针
***********************************************/
Node *List::DeleteNode(Node *p)
{
Node *p1,*p2;
p1=phead; //指向头结点
//寻找要删除的结点
while(p1!=p&&p1->pnext!=0)
{
p2=p1;
p1=p1->pnext;
}
if(p1==phead)
{
phead=phead->pnext; //将头结点后移
return p;
}
p2->pnext=p1->pnext;//p1指向被删除的结点,将p2结点与p1后面的结点连接起来
return p;
}
/***********************************************************
*功能:查找一个指定的数据
*返回:该数据所在结点在链表中的指针,若未找到返回0
************************************************************/
Node*List::LookUp(Data&data)
{
Node *p1=phead;
//从头接点开始查找
while(p1)
{
if(p1->pdata->Compare(data)==0)
return p1; //返回结点指针
p1=p1->pnext;
}
return 0;//搜索完整个链表后,如果找不到,则返回空指针0
}
//打印整个链表数据
void List::ShowList()
{
Node *p1=phead;
while(p1)
{
p1->pdata->Show();
p1=p1->pnext;
}
}
//删除整个链表结点
void List::DeleteList()
{
Node *p1,*p2;
p1=phead;
while(p1)
{
delete p1->pdata;
p2=p1;
p1=p1->pnext;
delete p2;
}
}//end_List.h
作者:
水清苓
时间:
2009-11-3 03:28
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
#include "List.h"
//char password[10];//用户密码
class Salary:public Data
{public:
char Num[10];//职工号
char Name[20]; //职工姓名
double BaseSalary; //职务工资
double Bonus; //职工奖金
Salary(){ strcpy(Name,"\0");BaseSalary=0.0;Bonus=0.0;strcpy(Num,"\0");}
Salary(char *,double ,double,char*);
void SetSalary(char*,double,double,char*);
int Compare(Data&);
void Show();
};
Salary::Salary(char * name,double base,double bonus,char* num)
{
strcpy(Name,name);
BaseSalary=base;
Bonus=bonus;
strcpy(Num,num);
}
void Salary::SetSalary(char* name,double base,double bonus,char* num)
{
strcpy(Name,name);
BaseSalary=base;
Bonus=bonus;
strcpy(Num,num);
}
/***********************************************************
*功能:比较姓名,查找 *返回:1,0
***********************************************************/
int Salary::Compare(Data& data)
{
Salary&temp=(Salary&)data;
return strcmp(Name,temp.Name);
}
//打印一个结点的数据
void Salary::Show()
{
cout<<setw(10)<<Num<<setw(10)<<Name<<setw(12)<<BaseSalary<<setw(8)<<Bonus<<setw(12)<<(BaseSalary+Bonus)<<endl;
}
/********************************************************
*功能:将记录添加到链表中
*********************************************************/
void AddRecord(List &SalaryList)
{
Node *pnode;
Salary *psal;
char Num[10];
char Name[20];
double BaseSalary,Bonus;
cout<<"请输入职工号(输入q结束):";
// cin.ignore();
cin.getline(Num,10);
while(strcmp(Num,"q"))
{
cout<<"请输入职工姓名:";
cin.ignore();
cin.getline(Name,20);
cout<<"请输入职务工资:";
cin>>BaseSalary;
cout<<"请输入奖金:";
cin>>Bonus;
cin.ignore();
psal=new Salary;//生成新的数据类对象
psal->SetSalary(Name,BaseSalary,Bonus,Num);//数据类对象初始化
pnode=new Node;//生成新结点
pnode->InputData(psal);//结点初始化
SalaryList.AddNode(pnode);//把结点加入链表
cout<<"输入职工号(输入q结束):";
cin.ignore();
cin.getline(Num,10);
}
cout<<endl<<endl;
}
/****************************************************
*功能:显示职工的工资信息
****************************************************/
void DisplayRecord(List &SalaryList)
{
cout<<setw(10)<<"职工号"<<setw(10)<<"姓名"<<setw(12)<<"职务工资"<<setw(12)<<" 职工奖金"<<setw(12)<<"工资总额"<<endl;
SalaryList.ShowList();
cout<<endl<<endl;
}
/***************************************************
*功能:按照姓名查找工资表数据
***************************************************/
void LookUpRecord(List &SalaryList)
{
Node *p;
char Name[20];
cout<<"输入您需要查找的姓名(输入0结束)";
cin.getline(Name,20);
while(strcmp(Name,"0"))
{
Salary salary(Name,0,0,"\0");//生成结点
p=SalaryList.LookUp(salary);//查找数据
if(p)
{
cout<<"在工资表中找到"<<Name<<",内容是:"<<endl;
p->ShowNode();
}
else
cout<<"\n在工资表中查找不到"<<Name<<"."<<endl<<endl;
cout<<"输入你需要查找的姓名(输入0结束)";
cin.getline(Name,20);
}
cout<<endl<<endl;
system("pause");
}
/************************************************************
*功能:删除指定的数据
*************************************************************/
void DeleteRecord(List &SalaryList)
{
Node *p;
char Name[20];
cout<<"输入你需要删除的职工姓名(输入0结束):";
cin.getline(Name,20);
while(strcmp(Name,"0"))
{
Salary salary(Name,0,0,"\0");
p=SalaryList.LookUp(salary);
//删除时先查找
if(p)
{cout<<"在工资表中找到"<<Name<<",内容是:"<<endl;
p->ShowNode();
SalaryList.DeleteNode(p);
cout<<"的资料已删除."<<endl;
delete p;
}
else
cout<<"\n在工资表中查找不到"<<Name<<"."<<endl<<endl;
cout<<"输入您需要删除的职工姓名(输入0结束):";
cin.getline(Name,20);
}
cout<<endl<<endl;
}
//保存数据到文件中
void SaveRecord(List&SalaryList)
{
char name[20];
cout<<"请输入要保存的文件名:";
cin>>name;
ofstream in;
in.open(name,ios::out);
if(!in)
{
cout<<"数据文件打开错误,不能将数据保存到文件中!\n";
return;
}
Node *pnode;
Salary *psal;
pnode=SalaryList.GetListHead(); //取链表头指针
while(pnode)
{
//返回结点指向的数据指针
psal=(Salary*)pnode->GetData();
//写入数据
// in.write((char*)psal,sizeof(Salary));
in<<psal->Num<<psal->Name<<psal->BaseSalary<<' '<<psal->Bonus<<endl;
//取下一结点指针
pnode=SalaryList.GetListNextNode(pnode);
}
in.close();
}
/*******************************************************
*功能:主菜单选项操作
********************************************************/
void Menu(string& choice,List &SalaryList)
{
if(choice=="1")
AddRecord(SalaryList);
else if(choice=="2")
DisplayRecord(SalaryList);
else if(choice=="3")
LookUpRecord(SalaryList);
else if(choice=="4")
DeleteRecord(SalaryList);
else if(choice=="0")
SaveRecord(SalaryList);
else
cout<<"输入错误,请重新选择\n\n";
}
/***********************************************
*功能:读取文件。
***********************************************/
void LoadFile(List &SalaryList)
{
ifstream infile;
infile.open("SALARY.in",ios::in);
if(!infile)
{
cout<<"没有数据文件!\n\n";
return;
}
Node *pnode;
Salary *psal;
cout<<setw(10)<<"职工号"<<setw(10)<<"姓名"<<setw(12)<<"职务工资"<<setw(12)<<" 职工奖金"<<setw(12)<<"工资总额"<<endl;
while(!infile.eof())
{
//定义新的数据对象
psal=new Salary;
infile.read((char*)psal,sizeof(Salary));
pnode=new Node;
//将数据加入
pnode->InputData(psal);
SalaryList.AddNode(pnode);
cout<<setw(10)<<psal->Num<<setw(10)<<psal->Name<<setw(12)<<psal->BaseSalary<<setw(8)<<psal->Bonus<<setw(12)<<(psal->BaseSalary+psal->Bonus)<<endl;
}//删除头结点
SalaryList.DeleteNode(pnode);
infile.close();
}
int main(void)
{
List SalaryList;//定义一个对象
system("cls");
cout<<"\t^^^^^^欢迎进入工资管理系统^^^^^^^^\n";
LoadFile(SalaryList);
string choice;
do
{
cout<<"\t1.添加工资记录\n";
cout<<"\t2.显示工资记录\n";
cout<<"\t3.根据姓名查找工资数据\n";
cout<<"\t4.根据姓名删除工资数据\n";
cout<<"\t0.退出系统\n\n\n";
cout<<"请输入您的选择:";
cin>>choice;
cin.ignore();
Menu(choice,SalaryList);
}while(choice!="0");
cout<<"\n\n\t欢迎再次使用工资管理系统\n\n";
return 0;
}
作者:
love戒情人
时间:
2009-11-3 03:28
文件这个里的保存和读取总是出现问题
希望有人帮我一下
不胜感激~~~
这是我的作业
作者:
生活的成功者
时间:
2009-11-3 03:28
真的很想知道为什么
作者:
忘记∽所有
时间:
2009-11-3 03:28
不是说这是 教室吗?
怎么没有老师可以指点啊?
作者:
勇敢的心
时间:
2009-11-3 03:28
mm不要急么,总要等我们看到你的问题啊,我们也有事嘛,不可能每隔几分钟就看一下有没有问题
从代码可以看出你犯的错误是写入和读出不一致,以前有人和你犯了一样的错误,你看看下面这个帖子
http://www.bc-cn.net/bbs/dispbbs.asp?BoardID=56&ID=73807&replyID=&skin=0
看完还有问题可以继续问
作者:
半个灵魂
时间:
2009-11-3 03:28
我面对这个问题已经快
3天了
不知道为什么
作者:
灬☆爱你
时间:
2009-11-3 03:28
我看过了
作者:
紫色&飘蓝ぁ
时间:
2009-11-3 03:28
我的这个程序 好像只可以运行一次
就是不能读出文件内容
作者:
!今生无缘!
时间:
2009-11-3 03:28
我还是不明白 我把输入输出改了
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2