| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 817 人关注过本帖
标题:[求助]电话簿管理系统源码有点错误
只看楼主 加入收藏
vatano998
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-16
收藏
 问题点数:0 回复次数:2 
[求助]电话簿管理系统源码有点错误

/*------------------------------宏定义-------------------------------------*/
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
/*-----------------------------函数定义--------------------------------------*/
using namespace std; /*用命名空间std中的定义*/
/*-------------------------------定义类----------------------------------*/
class CData /*定义数据基类*/
{
public:
CData(){};
virtual int Compare(CData &)=0;
virtual void Show()=0;
virtual ~CData(){};
};

class CNode /*定义结点基类*/
{
private:
CData *pData; /*用于指向数据类的指针*/
CNode *pNext; /*用于指向链表的后向指针*/
public:
CNode(){pData=0;pNext=0;};
CNode(CNode &node)
{
pData=node.pData;
pNext=node.pNext;
}
void InputData(CData *pdata){pData=pdata;} /*输入数据*/
void ShowNode(){pData->Show();}
CData *GetData(){return pData;}
friend class CList; /*定义链表类为友元类*/
};

class CList /*定义链表类*/
{
CNode *pHead; /*连表头结点指针*/
public:
CList(){pHead=0;}
~CList(){DeleteList();}
void AddNode(CNode *pnode); /*在首部添加结点*/
CNode *DeleteNode(CNode *); /*删除一个制定的结点,返回该结点的指针*/
CNode *LookUp(CData &); /*查找一个指定的数据,返回该数据所在的结点在链表中的指针,若未找到返回0*/
void ShowList(); /*打印整个链表*/
void DeleteList(); /*删除整个链表*/
CNode *GetListHead(){return pHead;} /*返回链表首结点*/
CNode *GetListNextNode(CNode *pnode); /*返回链表指定结点的下一个结点*/
};

CNode *CList::GetListNextNode(CNode *pnode) /*返回链表指定结点的下一个结点*/
{
CNode *p1=pnode;
return p1->pNext;
};

void CList::AddNode(CNode *pnode) /*在首部添加结点*/
{
if(pHead==0)
{
pHead=pnode;
pnode->pNext=0;
return;
}
else
{
pnode->pNext=pHead;
pHead=pnode;
}
};

CNode *CList::DeleteNode(CNode *pnode) /*删除一个指定的结点,返回该结点的指针*/
{
CNode *p1,*p2;
p1=pHead; /*指向首结点*/
while(p1!=pnode&&p1->pNext!=0) /*寻找要删除的结点*/
(
p2=p1; /*结点指针p2始终在p1的后面*/
p1=p1->pNext;
}
if(p1==pHead) /*如果是要删除的是首结点*/
{
pHead=pHead->pNext; /*将首结点后移*/
return pnode;
}
p2->pNext=p1->pNext; /*p1指向被删除的结点,将p2结点与p1后面的结点连接起来*/
return pnode;
}
CNode *CList::LookUp(CData &data) /*查找一个指定的数据,返回该数据所在的结点在链表中的指针,若未找到返回0*/
{
CNode *p1=pHead;
while(p1) /*从头结点开始查找*/
{
if(p1->pData->Compare(data)==0)
return p1; /*找到后返回结点指针*/
p1=p1->pNext;
}
return 0; /*搜索完整个链表之后,如果找不到,返回空指针0*/
}
void CList::ShowList() /*打印整个链表数据*/
{
CNode *p1=pHead;
while(p1)
{
p1->pData->Show();
p1=p1->pNext;
}
}
void CList::DeleteList() /*删除整个链表结点*/
{
CNode *p1,*p2;
p1=pHead;
while(p1)
{
delete p1->pData
p2=p1;
p1=p1->pNext;
delete p2;
}
}
class CTelRecord:public CData /*电话簿记录,为数据基类的共有派生类*/
{
private:
char szName[20]; /*电话簿记录的数据:姓名和电话号码*/
char szMumber[20];
public:
CTelRecord(){strcpy(szName,"\0");strcpy(szNumber,"\0");} /*构造函数*/
CTelRecord(char *name,char *number) /*构造函数*/
{
strcpy(szName,name);
strcpy(szNumber,number);
}
void SetRecord(char *name,char *number) /*输入数据函数*/
{
strcpy(szName,name);
strcpy(szNumber,number);
}
int Compare(CData &); /*比较函数,比较姓名*/
void Show(); /*打印数据函数*/
};
int CTelRecord::Compare(CData &data) /*比较姓名,供查找用,比较结果为1,0,-1*/
{
CTelRecord &temp=(CTelRecord &)data;
return strcpy(szName,temp,szName);
}
void CTelRecord::Show() /*打印一个结点的数据*/
{
cout<<setw(15)<<szName<<setw(15)<<szNumber<<endl;
}
void AddRecord(CList &TelList) /*将记录添加到链表中*/
{
CNode *pNode;
CTelRecord *pTel;
char szName[20],szNumber[20];
cout<<"输入姓名(输入0结束):";
cin.ignore();
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
cout<<"输入电话号码:";
cin.getline(szNumber,20);
pTel=new CTelRecord;
pTel->SetRecord(szName,szNumber);
pNode=new CNode;
pNode->InputData(pTel);
TelList.AddNode(pNode);
cout<<"输入姓名(输入0结束):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void DisplayRecord(CList &TelList) /*现实全部链表数据*/
{
cout<<setw(15)<<"姓名"<<setw(15)<<"电话号码"<<endl;
TelList.ShowList();
cout<<endl<<endl;
}
void LookupRecord(CList &TelList) /*按照姓名查找电话簿数据*/
{
CNode *PLook;
char szName[20];
cout<<"输入您需要查找的姓名(输入0结束):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
CTelRecord tele(szName,"0"); /*生成结点*/
pLook=TelList.LookUp(tele); /*超找指定结点的数据*/
if(pLook)
{
cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;
pLook->ShowNode();
}
else
cout<<"在电话簿中查找不到"<<szName<<"."<<endl;
cout<<"输入您需要查找的姓名(输入0结束)";
cin.getline()szName,20);
}
cout<<endl<<endl;
system("pause");
}
void DeleteRecord(CList &TelList) /*在链表中删除指定结点的数据*/
{
CNode *pLook;
char szName[20];
cout<<"输入您需要查找的姓名(输入0结束)";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
CTelRecord tele(szName,"0"); /*生成结点*/
pLook=TelList.LookUp(tele); /*查找指定结点的数据*/
if(pLook)
{
cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;
pLook->ShowNode();
}
else
cout<<"在电话簿中茶找不到"<<szName<<"."<<endl;
cout<<"输入您需要查找的姓名(输入0结束)";
cin.getline(szName,20);
}
cout<<endl<<endl;
system("pause");
}
void DeleteRecord(CList &TelList) /*在链表中删除指定的数据*/
{
CNode *pLook;
char szName[20];
cout<<"输入您需要删除的姓名(输入0结束)";
cin.getline(szNamr,20);
while(strcmp(szName,"0"))
{
CTelRecord tele(szName,"0");
pLook=TelList.LookUp(tele);
if(pLook) /*删除时应先查找出结点*/
{
cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;
pLook->ShowNode();
TelList.DeleteNode(pLook);
cout<<szName<<"的资料已删除"<endl;
delete pLook;
}
else
cout<<"在电话簿中茶找不到"<<szName<<"."<<endl;
cout<<"输入您需要查找的姓名(输入0结束)";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void StoreFile(CList &TelList) /*将链表中的苏据保存在文件中*/
{
ofstream outfile("TELEPHONE.DAT",ios::binary);
if(!outfile)
{
cout <<"数据文件打开错误,没有讲数据存入文件!\n";
return;
}
CNode *pnode;
CTelRecord *pTel;
string strName,strNumber;
pnode=TelList.GetListHead(); /*取出链表首结点指针*/
while(pnode)
{
pTel=(CTelRecord *)pnode->GetData(); /*返回结点指向的数据域指针*/
outfile.write((char *)pTel,sizeof(CTelRecord)); /*讲数据域写入文件*/
pnode=TelList.GetListNextNode(pnode); /*取下一结点的指针*/
}
outfile.close();
}
void Operate(string &strChoice,CList &TelList) /*根据主菜单选项进行操作*/
{
if(strChoice=="1")
AddRecord(TelList);
else if(strChoice=="2")
DisplayRecord(TelList);
else if(strChoice=="3")
LookUpRecord(TelList);
else if(strChoice=="0")
StoreFile(TelList);
else
cout<<"输入错误,请重新输入您的选择:";
}

/*-------------------------------文件读入-----------------------------------------*/
void Loadfile(CList &TelList) /*在程序开始首先查找有无数据文件,找到后读取文件数据*/
{
ifstream infile("TELEPHONE.DAT",ios::binary);
if(!infile)
{
cout<<"没有数据文件!\n\n";
return;
}
CNode *pNode;
CTelRecord &pTel;
while(!infile.eof())
{
pTel=new CTelRecord; /*定义数据域对象*/
infile.read((char *)pTel,sizeof(CTelRecord));
pNode=new CNode;
pNode->InputData(pTel); /*数据域对象内容生成结点*/
TelList.AddNode(pNode); /*讲结点加入链表*/
}
TelList.DeleteNode(pNode); /*由于文件的关系,多读一次,所以讲首结点删除*/
infile.close();
}
/*-------------------------------主函数---------------------------------*/
int main(void)
{
CList TelList; /*定义链表类的对象*/
system("cls");
cout<<"\t欢迎进入电话簿管理系统\n";
LoadFile(TelList);
string strChoice;
do
{
cout<<"t1.添加电话簿记录\n";
cout<<"t2.现实电话簿内容\n";
cout<<"t3.根据姓名查询电话簿数据\n";
cout<<"t4.根据姓名查询电话簿数据\n";
cout<<"t0.推出系统\n\n\n";
cout<<"请按键进行选择:";
cin>>strChoice;
cin.ignore();
Operate(strChoice,TelList);
}
while(strChoice!="0");
cout<<"\n\n\t欢迎再次使用电话簿管理系统\n\n";
return 0;
}
}

搜索更多相关主题的帖子: 源码 电话簿 定义 系统 include 
2006-12-04 13:36
vatano998
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-16
收藏
得分:0 

我弄了这个程序 提示
void CList::DeleteList() /*删除整个链表结点*/
{
CNode *p1,*p2;
p1=pHead;
while(p1)
{
delete p1->pData
p2=p1;
p1=p1->pNext;
delete p2;
}
}

红色处有错误 谁能给看看是说明原因

2006-12-04 13:38
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
delete p1-&gt;pData后面加上;,你的程序里类似的错误太多了,好好改改吧

2006-12-04 14:06
快速回复:[求助]电话簿管理系统源码有点错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015960 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved