| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2908 人关注过本帖
标题:TempFile.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
只看楼主 加入收藏
chencuicui
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-5-1
收藏
 问题点数:0 回复次数:12 
TempFile.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。

大家好:
想请教一个问题哦,我在VC++6.0下调试的一个C++程序,编译成功,但运行是老是出现下面的问题
TempFile.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
和调试环境应该没有关系,因为我调试的其他程序没有问题!
谢谢了:)

搜索更多相关主题的帖子: TempFile exe 
2007-05-01 05:59
chencuicui
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-5-1
收藏
得分:0 
请大家帮忙解决一下哦,急!谢了哦!
2007-05-01 06:08
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 

把代码先贴出来吧
看看什么问题


当你开始怀疑自己时,说明你已经失去了判断力
2007-05-01 09:26
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 

很有可能是指针引起的问题!


try new catch
2007-05-02 20:34
chencuicui
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-5-1
收藏
得分:0 

楼上的几位,谢了哦,这几天在外地忙!现在我把代码贴出来哦
谢谢了哦!
#include "dos.h"
#include "string.h"
#include "iomanip.h"
#include "fstream.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#define Null 0
void DisplayMenu()//主菜
{
char *menu[]={
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$★★★★★★★★★★★★★★★★★★★★★★★★★★$",
"$★★★\t1.增加记录 ★★★$",
"$★★★\t2.删除记录 ★★★$",
"$★★★\t3.显示所有记录 ★★★$",
"$★★★\t4.按姓名查找并显示一个记录 ★★★$",
"$★★★\t5.按姓名查找并修改一个记录 ★★★$",
"$★★★\t6.从正文文件中添加数据到库表中 ★★★$",
"$★★★\t7.将库表中的数据写入正文文件 ★★★$",
"$★★★\t8.排序库表 ★★★$",
"$★★★\t9.退出系统 ★★★$",
"$★★★★★★★★★★★★★★★★★★★★★★★★★★$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S",
NULL};
cout<<"\n\n\t\t★★★★★欢迎使用通讯录管理系统!★★★★★ \n\n";
for(int i=0; menu[i]; i++) cout<<""<<menu[i]<<endl;
cout<<"请输入相应功能的序号:";
}

void ShowModiMenu()
{ char *submenu[]={"(1) 修改姓名",
"(2) 修改学号",
"(3) 修改性别",
"(4) 修改年龄",
"(5) 修改手机号码",
"(6) 修改email地址\n",
"(0) 不修改,返回主菜单",
NULL};
for(int i=0; submenu[i]; i++)
cout<<"★★★★"<<submenu[i]<<endl;
cout<<"请输入选择:";
}
class Node
{
char Name[20];//姓名
char Num[10];//
char ID[30];//身份证
char Sex[5];
int Age;
char MobilePhone[15];//手机号码
char EMail[32];//email地址
Node *Next;//下一结点指针
public:
Node(char *pname=NULL, char *num=NULL, char *sex=Null,int age=Null,char *pmphone=NULL, char *pemail=NULL)
//构造函数,各参数均有缺省值
{ strcpy(Name, pname);
strcpy(Num, num);
strcpy(Sex,sex);
Age=age;
strcpy(MobilePhone, pmphone);
strcpy(EMail, pemail);
}
void Show()//显示结点数据
{
cout<<"姓名:"<<Name<<endl<<"学号:"<<Num<<endl<<"性别:"<<Sex<<endl<<"年龄:"<<Age<<endl<<"电话号码:"<<MobilePhone<<endl<<"E-MAIL:"<<EMail<<endl; }
void SetName(char *s)//修改姓名
{strcpy(Name, s);}
void Setnum(char *num)//修改
{strcpy(Num,num);}
void Setsex(char *sex)
{strcpy(Sex,sex);}
void Setage(int age)
{Age=age;}
void SetMobilePhone(char *s)//修改手机号码
{strcpy(MobilePhone, s);}
void SetEMail(char *s)//修改email地址
{strcpy(EMail, s);}
friend class AddrList;//将AddrList类说明为友元类
friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
class AddrList
{
Node *HeadPtr;//链表首指针
Node *TailPtr;//链表尾指针
int Tag;//排序状态标志,当Tag=1时,按姓名排序
//当Tag=2时,按办公室电话排序
public:
//成员函数
AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)
//构造函数,产生空链表,将tag的值置为1
{
HeadPtr=head;
TailPtr=tail;
Tag=tag;
}
void AddTail(Node *p)//将p指向的结点加入到链表尾部
{
if(HeadPtr==NULL)
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
TailPtr->Next=p;
p->Next=NULL;
TailPtr=p;
}
}
void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中
{
Node *p1, *p2;
if(Tag==1)//按姓名排序
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->Name, p->Name)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->Name, p->Name)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
else//按学号
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->Num, HeadPtr->Num)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->Num, p->Num)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->Num, p->Num)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
}
Node *LookUp(char *name)//按姓名查找结点,返回该结点指针
{
Node *p;
p=HeadPtr;
while(p!=NULL)
{
if(strcmp(p->Name, name)==0)
return p;
p=p->Next;
}
return NULL;
}
void dele(char *name)//删除指定姓名的结点
{
Node *p1, *p2;
if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点
{
p1=HeadPtr;
HeadPtr=HeadPtr->Next;
delete(p1);
cout<<"删除了联系人";
}
else//删除其他结点
{
p1=HeadPtr;
p2=HeadPtr;
while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL)
{
p1=p2;
p2=p2->Next;
}
if(strcmp(p2->Name, name)==0)
{
p1->Next=p2->Next;
delete(p2);
cout<<"删除了一个联系人的信息!";
}
}
}
void Sort(int tag)//按tag指定的关键字重新排序
{
Node *p1, *p2;
Tag=tag;
p2=HeadPtr;
HeadPtr=NULL;
TailPtr=NULL;
while(p2)
{
p1=p2->Next;
AddSort(p2);
p2=p1;
}
TailPtr->Next=NULL;
}
void ShowAll()//显示全部结点,每10个显示一屏
{
int n=0;
Node *p;
if(HeadPtr==NULL)
cout<<"链表为空,没有记录可显示!";
else for(p=HeadPtr; p!=NULL; p=p->Next)
{
p->Show();
n++;
if(n%10==0) cout<<"按任意键显示下一屏:";
}
}
void SetTag(int t)//置Tag值
{Tag=t;}
int GetTag()//取tag值
{return Tag;}
Node *GetHeadPtr()//取首指针
{return HeadPtr;}
~AddrList()//释放链表空间
{
Node *p;
if(HeadPtr==NULL) ;
else
{
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->Next;
delete(p);
}
}

}
void CreateList(char *filename)//从二进制文件中读入数据,
//构造链表
{
ifstream infile(filename, ios::in|ios::binary);

infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag
int n;
infile.read((char *)&n, 4);//读出记录数
cout<<"正在从数据中加载"; Node *p;
for(int i=0;i<n;i++)
{
p=new Node;
infile.read((char *)p, sizeof(Node));
AddTail(p);

}
infile.close();
cout<<"数据从二进制文件加载成功!";
}
void WriteToFile(char *filename)//将链表中数据
//写入指定的二进制文件
{
ofstream outfile;
outfile.open(filename, ios::out|ios::binary);
outfile.write((char *)&Tag, 4);
Node *p, *p1;
int n=0;
for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++;
outfile.write((char *)&n, 4);
p=HeadPtr;
while(p)
{
outfile.write((char *)p, sizeof(Node));
p=p->Next;
}
cout<<"成功导出二进制文件"; outfile.close();
}
};
void add(AddrList &addrlist)//增加记录,按照当前排序标志Tag
//插入结点,插入结点后,链表仍然
//保持有序
{
cout<<"请输入数据(以空格、Tab或回车分隔):"<<endl;
char n[20], N[15],se[5],mp[25], em[29]; int a;
cout<<"姓名:";cin>>n;cout<<endl;cout<<"学号:";cin>>N;cout<<endl;cout<<"性别:";cin>>se;cout<<endl;cout<<"年龄:";cin>>a;cout<<endl;
cout<<"手机号码:";cin>>mp;cout<<endl;cout<<"E-MAIL:";cin>>em; cout<<endl;
Node *p;
p=new Node(n, N,se,a, mp, em);
p->Show();
addrlist.AddSort(p);
cout<<"添加成功!是否继续添加?[y/n]";
char t;
cin>>t;
if(t=='y') add(addrlist);
}
void del(AddrList &addrlist)//删除记录
{ char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有记录可删!";
else
{
cout<<"请输入要删除的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL) cout<<"链表上没有联系人";
else
{p->Show();
cout<<"确认删除?[y/n]";
char t;
cin>>t;
if(t=='y') addrlist.dele(n);
}
}
}
void showall(AddrList &addrlist)//显示所有记录
{
addrlist.ShowAll();

}
void query(AddrList &addrlist)//按姓名查找并显示一条记录
{ char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有联系人可查找!";
else
{
cout<<"请输入要查找的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL)
cout<<"没有该联系人";
else
{
cout<<"该联系人的记录为:"; p->Show();
}

} }
void modify(AddrList &addrlist)//按姓名修改一条记录
//当修改姓名后,如果当前排序关键字
//为姓名,需重新排序。当修改学号
//后,如果当前排序关键字为学号,需重新排序。
{char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有记录可修改!";
else
{cout<<"请输入要修改的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL)
cout<<"没有找到";
else
{ cout<<"该联系人的记录为:"; p->Show();
ShowModiMenu();
int m, state;
cin>>m;
state=cin.rdstate();
while(state||((m<0||m>6)&&m!=0))
{
cout<<"请重新输入选择:";
if(state) {char str[80]; cin.clear(); cin.getline(str, 80);}
cin>>m;
state=cin.rdstate();
}
if(m==1)//修改姓名
{
cout<<"请输入修改后的姓名:"; char n[10];
cin>>n; p->SetName(n); cout<<"修改成功!新的记录为:"; p->Show();
if(addrlist.GetTag()==1) addrlist.Sort(1);//判断是否需要重新排序

}
else if(m==2)//修改学号
{
cout<<"请输入修改后的学号:"; char num[15];
cin>>num; p->Setnum(num); cout<<"修改成功!新的记录为:"<<endl; p->Show();
if(addrlist.GetTag()==2) addrlist.Sort(2);//判断是否需要重新排序

}
else if(m==3)
{cout<<"请输入修改后的性别:"; char sex[15];
cin>>sex; p->Setsex(sex); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==4)
{cout<<"请输入修改后的年龄:"; int a;
cin>>a; p->Setage(a); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==5)//修改手机号码
{
cout<<"请输入修改后的手机号码:"; char mp[15];
cin>>mp; p->SetMobilePhone(mp); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==6)//修改email地址
{
cout<<"请输入修改后的email地址:"; char em[20];
cin>>em; p->SetEMail(em); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==0)//不修改,返回主菜单
;
}
}
}
void addfromtxtfile(AddrList &addrlist)//从正文文件中添加数据到库表中
{
cout<<"请输入源文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ifstream in;
in.open(filename, ios::in|ios::nocreate);
if(!in)
{
cout<<"无法打开源文件";
return;
}
int n;
in>>n; cout<<"正在添加";
char name[20], N[15],se[5], mp[25], em[30]; int a;
Node *p;
while(in>>name>>N>>se>>a>>mp>>em)
{
p=new Node(name, N,se,a, mp, em);
addrlist.AddSort(p);
}
in.close();
cout<<"记录从正文文件添加成功!";
system("pause");
}
void writetotxtfile(AddrList &addrlist)//将库表中的数据导出到正文文件
{
cout<<"请输入目标文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ofstream out;
out.open(filename, ios::out|ios::noreplace);
if(!out) {cout<<"创建文件失败!";}
else
{
Node *p;
p=addrlist.GetHeadPtr();
while(p)
{
cout<<p->Name<<" "<<p->Num<<" "<<p->Sex<<" "<<p->Age<<" "<<p->MobilePhone<<" "<<p->EMail<<" ";
p=p->Next;
}
out.close();
cout<<"成功导出正文文件!"; }
}
void sort(AddrList &addrlist)//排序库表
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表中没有记录可排序!";}
if(addrlist.GetTag()==1)
{
cout<<"当前排序关键字为姓名,是否将其改为学号?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(2); addrlist.Sort(2);}
else return;
}
else
{
cout<<"当前排序关键字为学号,是否将其改为姓名?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(1); addrlist.Sort(1);}
else return;
}
cout<<"排序完成!";
}
void quit(AddrList &addrlist)//退出系统,内部做结尾工作
{addrlist.WriteToFile("addrlist.dat"); exit(0);}
void main()//主函数
{
int choice=0, state;
AddrList addrlist;
addrlist.CreateList("addrlist.dat");//从二进制文件中读入数据,
//构建链表
while(choice!=9)//循环菜单处理
{
system("cls");
DisplayMenu();//显示主菜单
cin>>choice;
state=cin.rdstate();
while(state||choice<=0||choice>9)// 处理非法输入,如输入一个字符
{
cout<<"请重新输入选择:";
if(state)
{ char str[80]; cin.clear(); cin.getline(str,80); }
cin>>choice;
state=cin.rdstate();
}
switch(choice)
{
case 1: add(addrlist); break;
case 2: del(addrlist); break;
case 3: showall(addrlist); break;
case 4: query(addrlist); break;
case 5: modify(addrlist); break;
case 6: addfromtxtfile(addrlist); break;
case 7: writetotxtfile(addrlist); break;
case 8: sort(addrlist); break;
case 9: quit(addrlist); break;
default: ;
}
}
}

2007-05-05 21:41
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 
你的那些函数都是addrlist类的成员函数吗
能说明一下吗

当你开始怀疑自己时,说明你已经失去了判断力
2007-05-05 22:50
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 

能把AddrList类的成员函数以声明的方式写出来吗?
将其实现即定义写在外面
这样出现了错误容易找出错误


当你开始怀疑自己时,说明你已经失去了判断力
2007-05-05 22:59
chencuicui
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-5-1
收藏
得分:0 

好的,我先修改一下哦,再贴出来

2007-05-06 08:32
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 
你先说明一下你的那个类的成员函数都有哪些
你贴出来的代码好像类的定义不太完整

当你开始怀疑自己时,说明你已经失去了判断力
2007-05-06 09:37
chencuicui
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-5-1
收藏
得分:0 

我修改之后,编译出现一些错误
#include "dos.h"
#include "string.h"
#include "iomanip.h"
#include "fstream.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#define Null 0
void DisplayMenu()//主菜单
{
char *menu[]={
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$★★★★★★★★★★★★★★★★★★★★★★★★★★$",
"$★★★\t1.增加记录 ★★★$",
"$★★★\t2.删除记录 ★★★$",
"$★★★\t3.显示所有记录 ★★★$",
"$★★★\t4.按姓名查找并显示一个记录 ★★★$",
"$★★★\t5.按姓名查找并修改一个记录 ★★★$",
"$★★★\t6.从正文文件中添加数据到库表中 ★★★$",
"$★★★\t7.将库表中的数据写入正文文件 ★★★$",
"$★★★\t8.排序库表 ★★★$",
"$★★★\t9.退出系统 ★★★$",
"$★★★★★★★★★★★★★★★★★★★★★★★★★★$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S",
NULL};
cout<<"\n\n\t\t★★★★★欢迎使用通讯录管理系统!★★★★★ \n\n";
for(int i=0; menu[i]; i++) cout<<""<<menu[i]<<endl;
cout<<"请输入相应功能的序号:";
}

void ShowModiMenu()
{ char *submenu[]={"(1) 修改姓名",
"(2) 修改学号",
"(3) 修改性别",
"(4) 修改年龄",
"(5) 修改手机号码",
"(6) 修改email地址\n",
"(0) 不修改,返回主菜单",
NULL};
for(int i=0; submenu[i]; i++)
cout<<"★★★★"<<submenu[i]<<endl;
cout<<"请输入选择:";
}
class Node
{
char Name[20];//姓名
char Num[10];//
char ID[30];//身份证
char Sex[5];
int Age;
char MobilePhone[15];//手机号码
char EMail[32];//email地址
Node *Next;//下一结点指针
public:
Node(char *pname=NULL, char *num=NULL, char *sex=Null,int age=Null,char *pmphone=NULL, char *pemail=NULL)
//构造函数,各参数均有缺省值
{ strcpy(Name, pname);
strcpy(Num, num);
strcpy(Sex,sex);
Age=age;
strcpy(MobilePhone, pmphone);
strcpy(EMail, pemail);
}
void Show()//显示结点数据
{
cout<<"姓名:"<<Name<<endl<<"学号:"<<Num<<endl<<"性别:"<<Sex<<endl<<"年龄:"<<Age<<endl<<"电话号码:"<<MobilePhone<<endl<<"E-MAIL:"<<EMail<<endl; }
void SetName(char *s)//修改姓名
{strcpy(Name, s);}
void Setnum(char *num)//修改
{strcpy(Num,num);}
void Setsex(char *sex)
{strcpy(Sex,sex);}
void Setage(int age)
{Age=age;}
void SetMobilePhone(char *s)//修改手机号码
{strcpy(MobilePhone, s);}
void SetEMail(char *s)//修改email地址
{strcpy(EMail, s);}
friend class AddrList;//将AddrList类说明为友元类
friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
class AddrList
{
Node *HeadPtr;//链表首指针
Node *TailPtr;//链表尾指针
int Tag;//排序状态标志,当Tag=1时,按姓名排序
//当Tag=2时,按办公室电话排序
public:
//成员函数
AddrList(Node *head=NULL, Node *tail=NULL, int tag=1); //构造函数,产生空链表,将tag的值置为1
void AddTail(Node *p);//将p指向的结点加入到链表尾部
void AddSort(Node *p);//将p指向的结点按Tag指定的顺序插入到链表中
Node *LookUp(char *name);//按姓名查找结点,返回该结点指针
void dele(char *name);//删除指定姓名的结点
void Sort(int tag);//按tag指定的关键字重新排序
void ShowAll();//显示全部结点,每10个显示一屏
void SetTag(int t);//置Tag值
int GetTag();//取tag值
Node *GetHeadPtr();//取首指针
~AddrList();//释放链表空间
void CreateList(char *filename);//从二进制文件中读入数据,
//构造链表
void WriteToFile(char *filename);//将链表中数据
//写入指定的二进制文件
};
AddrList::AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)
//构造函数,产生空链表,将tag的值置为1
{
HeadPtr=head;
TailPtr=tail;
Tag=tag;
}
void AddrList::AddTail(Node *p)//将p指向的结点加入到链表尾部
{
if(HeadPtr==NULL)
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
TailPtr->Next=p;
p->Next=NULL;
TailPtr=p;
}
}
void AddrList::AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中
{
Node *p1, *p2;
if(Tag==1)//按姓名排序
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->Name, p->Name)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->Name, p->Name)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
else//按学号
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->Num, HeadPtr->Num)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->Num, p->Num)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->Num, p->Num)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
}
Node AddrList::*LookUp(char *name)//按姓名查找结点,返回该结点指针
{
Node *p;
p=HeadPtr;
while(p!=NULL)
{
if(strcmp(p->Name, name)==0)
return p;
p=p->Next;
}
return NULL;
}
void AddrList::dele(char *name)//删除指定姓名的结点
{
Node *p1, *p2;
if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点
{
p1=HeadPtr;
HeadPtr=HeadPtr->Next;
delete(p1);
cout<<"删除了联系人";
}
else//删除其他结点
{
p1=HeadPtr;
p2=HeadPtr;
while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL)
{
p1=p2;
p2=p2->Next;
}
if(strcmp(p2->Name, name)==0)
{
p1->Next=p2->Next;
delete(p2);
cout<<"删除了一个联系人的信息!";
}
}
}
void AddrList::Sort(int tag)//按tag指定的关键字重新排序
{
Node *p1, *p2;
Tag=tag;
p2=HeadPtr;
HeadPtr=NULL;
TailPtr=NULL;
while(p2)
{
p1=p2->Next;
AddSort(p2);
p2=p1;
}
TailPtr->Next=NULL;
}
void AddrList::ShowAll()//显示全部结点,每10个显示一屏
{
int n=0;
Node *p;
if(HeadPtr==NULL)
cout<<"链表为空,没有记录可显示!";
else for(p=HeadPtr; p!=NULL; p=p->Next)
{
p->Show();
n++;
if(n%10==0) cout<<"按任意键显示下一屏:";
}
}
void AddrList::SetTag(int t)//置Tag值
{Tag=t;}
int AddrList::GetTag()//取tag值
{return Tag;}
Node AddrList::*GetHeadPtr()//取首指针
{return HeadPtr;}
AddrList::~AddrList()//释放链表空间
{
Node *p;
if(HeadPtr==NULL) ;
else
{
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->Next;
delete(p);
}
}

}
void AddrList::CreateList(char *filename)//从二进制文件中读入数据,
//构造链表
{
ifstream infile(filename, ios::in|ios::binary);

infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag
int n;
infile.read((char *)&n, 4);//读出记录数
cout<<"正在从数据中加载"; Node *p;
for(int i=0;i<n;i++)
{
p=new Node;
infile.read((char *)p, sizeof(Node));
AddTail(p);

}
infile.close();
cout<<"数据从二进制文件加载成功!";
}
void AddrList::WriteToFile(char *filename)//将链表中数据
//写入指定的二进制文件
{
ofstream outfile;
outfile.open(filename, ios::out|ios::binary);
outfile.write((char *)&Tag, 4);
Node *p, *p1;
int n=0;
for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++;
outfile.write((char *)&n, 4);
p=HeadPtr;
while(p)
{
outfile.write((char *)p, sizeof(Node));
p=p->Next;
}
cout<<"成功导出二进制文件"; outfile.close();
}
////普通函数
void add(AddrList &addrlist)//增加记录,按照当前排序标志Tag
//插入结点,插入结点后,链表仍然
//保持有序
{
cout<<"请输入数据(以空格、Tab或回车分隔):"<<endl;
char n[20], N[15],se[5],mp[25], em[29]; int a;
cout<<"姓名:";cin>>n;cout<<endl;cout<<"学号:";cin>>N;cout<<endl;cout<<"性别:";cin>>se;cout<<endl;cout<<"年龄:";cin>>a;cout<<endl;
cout<<"手机号码:";cin>>mp;cout<<endl;cout<<"E-MAIL:";cin>>em; cout<<endl;
Node *p;
p=new Node(n, N,se,a, mp, em);
p->Show();
addrlist.AddSort(p);
cout<<"添加成功!是否继续添加?[y/n]";
char t;
cin>>t;
if(t=='y') add(addrlist);
}
void del(AddrList &addrlist)//删除记录
{ char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有记录可删!";
else
{
cout<<"请输入要删除的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL) cout<<"链表上没有联系人";
else
{p->Show();
cout<<"确认删除?[y/n]";
char t;
cin>>t;
if(t=='y') addrlist.dele(n);
}
}
}
void showall(AddrList &addrlist)//显示所有记录
{
addrlist.ShowAll();

}
void query(AddrList &addrlist)//按姓名查找并显示一条记录
{ char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有联系人可查找!";
else
{
cout<<"请输入要查找的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL)
cout<<"没有该联系人";
else
{
cout<<"该联系人的记录为:"; p->Show();
}

} }
void modify(AddrList &addrlist)//按姓名修改一条记录
//当修改姓名后,如果当前排序关键字
//为姓名,需重新排序。当修改学号
//后,如果当前排序关键字为学号,需重新排序。
{char n[10];Node *p;
if(addrlist.GetHeadPtr()==NULL)
cout<<"链表为空,没有记录可修改!";
else
{cout<<"请输入要修改的联系人的姓名:";
cin>>n;
p=addrlist.LookUp(n);
if(p==NULL)
cout<<"没有找到";
else
{ cout<<"该联系人的记录为:"; p->Show();
ShowModiMenu();
int m, state;
cin>>m;
state=cin.rdstate();
while(state||((m<0||m>6)&&m!=0))
{
cout<<"请重新输入选择:";
if(state) {char str[80]; cin.clear(); cin.getline(str, 80);}
cin>>m;
state=cin.rdstate();
}
if(m==1)//修改姓名
{
cout<<"请输入修改后的姓名:"; char n[10];
cin>>n; p->SetName(n); cout<<"修改成功!新的记录为:"; p->Show();
if(addrlist.GetTag()==1) addrlist.Sort(1);//判断是否需要重新排序

}
else if(m==2)//修改学号
{
cout<<"请输入修改后的学号:"; char num[15];
cin>>num; p->Setnum(num); cout<<"修改成功!新的记录为:"<<endl; p->Show();
if(addrlist.GetTag()==2) addrlist.Sort(2);//判断是否需要重新排序

}
else if(m==3)
{cout<<"请输入修改后的性别:"; char sex[15];
cin>>sex; p->Setsex(sex); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==4)
{cout<<"请输入修改后的年龄:"; int a;
cin>>a; p->Setage(a); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==5)//修改手机号码
{
cout<<"请输入修改后的手机号码:"; char mp[15];
cin>>mp; p->SetMobilePhone(mp); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==6)//修改email地址
{
cout<<"请输入修改后的email地址:"; char em[20];
cin>>em; p->SetEMail(em); cout<<"修改成功!新的记录为:"; p->Show();

}
else if(m==0)//不修改,返回主菜单
;
}
}
}
void addfromtxtfile(AddrList &addrlist)//从正文文件中添加数据到库表中
{
cout<<"请输入源文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ifstream in;
in.open(filename, ios::in|ios::nocreate);
if(!in)
{
cout<<"无法打开源文件";
return;
}
int n;
in>>n; cout<<"正在添加";
char name[20], N[15],se[5], mp[25], em[30]; int a;
Node *p;
while(in>>name>>N>>se>>a>>mp>>em)
{
p=new Node(name, N,se,a, mp, em);
addrlist.AddSort(p);
}
in.close();
cout<<"记录从正文文件添加成功!";
system("pause");
}
void writetotxtfile(AddrList &addrlist)//将库表中的数据导出到正文文件
{
cout<<"请输入目标文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ofstream out;
out.open(filename, ios::out|ios::noreplace);
if(!out) {cout<<"创建文件失败!";}
else
{
Node *p;
p=addrlist.GetHeadPtr();
while(p)
{
cout<<p->Name<<" "<<p->Num<<" "<<p->Sex<<" "<<p->Age<<" "<<p->MobilePhone<<" "<<p->EMail<<" ";
p=p->Next;
}
out.close();
cout<<"成功导出正文文件!"; }
}
void sort(AddrList &addrlist)//排序库表
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表中没有记录可排序!";}
if(addrlist.GetTag()==1)
{
cout<<"当前排序关键字为姓名,是否将其改为学号?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(2); addrlist.Sort(2);}
else return;
}
else
{
cout<<"当前排序关键字为学号,是否将其改为姓名?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(1); addrlist.Sort(1);}
else return;
}
cout<<"排序完成!";
}
void quit(AddrList &addrlist)//退出系统,内部做结尾工作
{addrlist.WriteToFile("addrlist.dat"); exit(0);}
void main()//主函数
{
int choice=0, state;
AddrList addrlist;
addrlist.CreateList("addrlist.dat");//从二进制文件中读入数据,
//构建链表
while(choice!=9)//循环菜单处理
{
system("cls");
DisplayMenu();//显示主菜单
cin>>choice;
state=cin.rdstate();
while(state||choice<=0||choice>9)// 处理非法输入,如输入一个字符
{
cout<<"请重新输入选择:";
if(state)
{ char str[80]; cin.clear(); cin.getline(str,80); }
cin>>choice;
state=cin.rdstate();
}
switch(choice)
{
case 1: add(addrlist); break;
case 2: del(addrlist); break;
case 3: showall(addrlist); break;
case 4: query(addrlist); break;
case 5: modify(addrlist); break;
case 6: addfromtxtfile(addrlist); break;
case 7: writetotxtfile(addrlist); break;
case 8: sort(addrlist); break;
case 9: quit(addrlist); break;
default: ;
}
}
}

2007-05-06 20:17
快速回复:TempFile.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
数据加载中...
 
   



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

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