问题描述
- C++用指针实现读取,load()方法一直不行,麻烦看下
- C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下
解决方案
// 通讯录管理系统,主要用动态链表实现
include //I/O函数
include //字符串函数,提供字符串处理的原函数
include //标准库函数,提供mallocsystemexit等函数
define N 50 //定义常数表示记录数
typedef struct contact//定义数据结构
{
char name[10]; //姓名
char age[3]; //年龄
char tele[11]; //电话号码
char postcode[6]; //邮编号码
char addr[50]; //单位地址
char email[30]; //邮箱
struct contact * pnext;
}contact *pcontact;
//函数的声明
int menu(); //主菜单函数
pcontact creat();
bool insert (pcontact phead int pos); //创建并添加联系人
void traverse(pcontact phead); // 显示联系人
int length(pcontact phead); //保存记录长度
void sort(pcontact phead); //按姓名拼音首字母排序联系人
void search(pcontact phead); //查找联系人
void updata(pcontact phead); //修改联系人
void delete_name(pcontact phead); //删除联系人
void delete_list(pcontact phead int pos);
void save(pcontact phead); //存储联系人
void load(pcontact phead); //从文件中读联系人
int exit(); //退出系统
//主函数
int main()
{
pcontact phead = NULL;
system (""cls""); // 清屏需要头文件stdlib.h
phead = creat();
while (1)
{
int i = 0;
switch (menu())
{
case 0: insert (phead ++i); break;
case 1: updata (phead); break;
case 2: delete_name (phead); break;
case 3: search(phead); break;
case 4: save (phead); break;
case 5: load (phead); break;
case 6: exit (0); break;
default: printf (""请输入数字0到6:n"");
}
printf (""ttt请按enter键返回主菜单n"");
getchar ();
system (""CLS"");
}
return 0;
}
//主菜单函数,函数返回值为整数,代表所选的菜单项
int menu()
{
char s[20];
int num;
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""-----------------------------------主菜单-------------------------------------nn"");
printf (""tttt0.添加信息n"");
printf (""tttt1.修改信息n"");
printf (""tttt2.删除信息n"");
printf (""tttt3.查找信息n"");
printf (""tttt4.存储信息n"");
printf (""tttt5.读入信息n"");
printf (""tttt6.退出系统n"");
printf (""n**********************************感谢使用************************************n"");
do
{
printf (""请输入您的选项(0-6):"");
gets (s);
num = atoi(s); //将字符串转换成一个整型数值
}while (num < 0 || num > 6);
return num;
}
//创建一个动态空链表
pcontact creat()
{
//分配一个不存放有效数据的头结点
pcontact phead = (pcontact)malloc( sizeof(contact) );
if (NULL == phead)
{
exit (-1); //分配内存失败,终止程序
}
phead->pnext = NULL;
return phead;
}
//创建并添加联系人信息
//在phead所指向链表的第pos个节点的前面插入一个新的结点
bool insert (pcontact phead int pos)
{
int i = 0;
pcontact p = phead;
while(NULL != p && i < pos-1)
{
p = p->pnext;
++i;
}
if (i > pos-1 || NULL == p)
return false;
//如果程序能执行到这一行说明p已经指向了第pos-1个结点但第pos-1个节点是否存在无所谓
//分配新的结点
pcontact pnew = (pcontact)malloc(sizeof(contact));
if (NULL == pnew)
{
exit(-1);//动态分配内存失败
}
system (""CLS"");
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""------------------------此目录下可创建并添加联系人信息------------------------nn"");
printf (""请输入联系人姓名:"");
gets (pnew->name);
printf (""请输入联系人年龄:"");
gets (pnew->age);
printf(""请输入联系人电话号码:"");
gets (pnew->tele);
printf(""请输入联系人邮编号码:"");
gets (pnew->postcode);
printf (""请输入联系人单位地址:"");
gets (pnew->addr);
printf (""请输入联系人邮箱:"");
gets (pnew->email);
printf (""添加联系人信息成功!"");
printf (""n**********************************感谢使用************************************n"");
//将新的结点存入p节点的后面
pcontact q = p->pnext;
p->pnext = pnew;
pnew->pnext = q;
return true;
}
//修改信息
void updata(pcontact phead)
{
char name[10];
sort(phead);
int len = length(phead);
pcontact p=phead->pnext;
int i;
system (""CLS"");
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""--------------------------此目录下可修改联系人信息----------------------------nn"");
printf(""请输入您要修改的联系人姓名:n"");
gets(name);
printf(""此联系人的所有信息如下:n"");
printf (""联系人年龄:%sn"" p->age);
printf (""联系人电话号码:%sn"" p->tele);
printf (""联系人邮编号码:%sn"" p->postcode);
printf (""联系人单位地址:%sn"" p->addr);
printf (""联系人邮箱:%sn"" p->email);
if (NULL != p)
{
for (i = 0; i < len; ++i p = p->pnext)
{
printf(""n请输入您要修改的联系人信息n"");
printf(""姓名:"");
scanf(""%s""&p->name);
printf(""年龄:"");
scanf(""%s""&p->age);
printf(""电话号码:"");
scanf(""%s""&p->tele);
printf(""邮编号码:"");
scanf(""%s""&p->postcode);
printf(""单位地址:"");
scanf(""%s""&p->addr);
printf(""邮箱:"");
scanf(""%s""&p->email);
printf(""此联系人信息修改成功!n"");
printf (""n**********************************感谢使用************************************n"");
if (i + 1 < len)
{
system (""pause"");
}
}
}
else
{
printf (""对不起通讯录系统没有此联系人信息!nn"");
printf (""n**********************************感谢使用************************************n"");
}
return;
}
//显示联系人信息
//遍历通讯录的信息,先排序,再输出
void traverse(pcontact phead)
{
sort(phead);
int len = length(phead);
pcontact p = phead->pnext;
int i;
system (""CLS"");
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""----------------------------------联系人信息表--------------------------------nn"");
if (NULL != p)
{
for (i = 0; i < len; ++i p = p->pnext)
{
printf (""联系人姓名:%sn"" p->name);
printf (""联系人年龄:%sn"" p->age);
printf (""联系人电话号码:%sn"" p->tele);
printf (""联系人邮编号码:%sn"" p->postcode);
printf (""联系人单位地址:%sn"" p->addr);
printf (""联系人邮箱:%sn"" p->email);
printf (""n**********************************感谢使用************************************n"");
if (i + 1 < len)
{
system (""pause"");
}
}
}
else
{
printf (""对不起通讯录系统没有任何联系人信息!nn"");
printf (""n**********************************感谢使用************************************n"");
}
return;
}
//有效结点的个数
int length(pcontact phead)
{
pcontact p = phead->pnext;
int len = 0;
while (NULL != p)
{
++len;
p = p->pnext;
}
return len;
}
//对通讯录进行排序,按姓名的拼音首字母顺序
void sort(pcontact phead)
{
int i j;
int len = length(phead);
char name[10];
char age[3];
char tele[11];
char postcode[6];
char email[30];
char addr[50];
pcontact p q;
//冒泡排序
for (i = 0 p = phead->pnext; i < len - 1; ++i p = p->pnext)
for (j = i + 1 q = p->pnext; j < len; ++j q = q->pnext)
if (strcmp (p->name q->name) > 0)
{
//交换姓名
strcpy (name p->name);
strcpy (p->name q->name);
strcpy (q->name name);
//交换年龄
strcpy (age p->age);
strcpy (p->age q->age);
strcpy (q->age age);
//交换电话号码
strcpy (tele p->tele);
strcpy (p->tele q->tele);
strcpy (q->tele tele);
//交换邮编号码
strcpy (postcode p->postcode);
strcpy (p->postcode q->postcode);
strcpy (q->postcode postcode);
//交换单位地址
strcpy (addr p->addr);
strcpy (p->addr q->addr);
strcpy (q->addr addr);
//交换邮箱
strcpy (email p->email);
strcpy (p->email q->email);
strcpy (q->email email);
}
return;
}
//查询联系人信息
void search(pcontact phead)
{
pcontact p = phead->pnext;
char name[20];
int len = length (phead); //记录容量的最大值
int i;
int mark = 0;
int a = 0;
system (""CLS"");
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""----------------------------联系人信息查询功能操作----------------------------nn"");
printf (""请输入您要查找的联系人姓名:"");
gets (name);
if (NULL != p)
{
for (i = a; i < len; ++i p = p->pnext)
{
if (strcmp (name p->name) == 0)
{
printf (""nttt以下是您查找的联系人信息n"");
printf (""联系人姓名:%sn"" p->name);
printf (""联系人年龄:%sn"" p->age);
printf (""联系人电话号码:%sn"" p->tele);
printf (""联系人邮编号码:%sn"" p->postcode);
printf (""联系人单位地址:%sn"" p->addr);
printf (""联系人邮箱:%sn"" p->email);
printf (""n**********************************感谢使用************************************n"");
++mark;
if (i + 1 < len)
{
system (""pause"");
}
}
}
if (0 == mark)
{
printf (""对不起通讯录系统没有此联系人信息!nn"");
printf (""n**********************************感谢使用************************************n"");
}
}
else
{
printf (""对不起,通讯录系统没有任何联系人信息!nn"");
printf (""n**********************************感谢使用************************************n"");
}
return;
}
//删除联系人信息
void delete_name(pcontact phead)
{
int i pos;
int mark = 0;
int val;
int len = length (phead);
char name[20];
pcontact p = phead->pnext;
system (""CLS"");
printf(""*************************欢迎进入X-X-X通讯录管理系统*************************n"");
printf(""-----------------------------联系人信息删除功能操作---------------------------nn"");
printf (""请输入您要删除的联系人姓名:"");
gets (name);
if (NULL != p)
{
for (i = 1; i <= len; ++i p = p->pnext)
{
if (strcmp (name p->name) == 0)
{
printf (""nttt以下是您要删除的联系人信息n"");
printf (""num:%dn"" mark+1);
printf (""联系人姓名:%sn"" p->name);
printf (""联系人年龄:%sn"" p->age);
printf (""联系人电话号码:%sn"" p->tele);
printf (""联系人邮编号码:%sn"" p->postcode);
printf (""联系人单位地址:%sn"" p->addr);
printf (""联系人邮箱:%sn"" p->email);
printf (""n**********************************感谢使用************************************n"");
pos = i;
++mark;
}
} if (1 == mark ) { printf (""ntt是否确定删除此联系人信息?(y/n)""); if (getchar () =='y' || getchar () =='Y') { delete_list(phead pos); printf (""ntt删除联系人信息成功!n""); system (""pause""); } else { printf (""""); getchar (); return; } } else if (mark > 1) { printf (""这里有%d个相同的联系人!n"" mark); printf (""您想删除第几个联系人的信息?n""); printf (""num:""); scanf (""%d"" &val); pos = pos - mark + val; delete_list(phead pos); printf (""ntt此联系人信息删除成功!n""); system (""pause""); } else { printf (""对不起,通讯录系统没有此联系人信息!nn""); printf (""n**********************************感谢使用************************************n""); }}else{ printf (""对不起,通讯录系统没有任何联系人信息!nn""); printf (""n**********************************感谢使用************************************n"");}return;
}
//删除在phead所指向链表的第pos个结点
void delete_list (pcontact phead int pos)
{
int i = 0;
pcontact p = phead;
if (NULL == p->pnext)
{
printf (""对不起,通讯录系统没有任何联系人信息!n"");
printf (""n**********************************感谢使用************************************n"");
return;
}
while (NULL != p->pnext && i < pos - 1)
{
p = p->pnext;
++i;
}
//如果程序能执行到这一行说明p已经指向了第pos个结点,并且第pos个结点是存在的
pcontact q = p->pnext; //q指向待删除的结点
p->pnext = p->pnext->pnext; //删除p节点后面的结点
free (q); //释放q所指向的节点所占的内存
q = NULL;
return;
}
//通讯录的记录存盘操作,使用文件指针;
void save(pcontact phead)
{
FILE * fp;
pcontact p =phead->pnext;
fp = fopen (""contact.txt""w"");
fprintf(fp***************所有联系人信息表***************nn"");
while (NULL != p)
{
fprintf(fp===============================================n"");
fprintf (fptt姓名:%sn"" p->name);
fprintf (fptt年龄:%sn"" p->age);
fprintf (fptt电话号码:%sn"" p->tele);
fprintf (fptt邮编号码:%sn"" p->postcode);
fprintf (fptt单位地址:%sn"" p->addr);
fprintf (fptt邮箱:%snn"" p->email);
p = p->pnext;
}
fprintf(fp===============================================n"");
fprintf (fp********来自X-X-X通讯录系统,欢迎使用!*******n"");
fclose (fp);
printf (""ntt联系人信息存储成功存储在contact.txt文档中!n"");
return;
}
void load(pcontact phead)//读入联系人信息
{
int in;
FILE *fp; //指向文件的指针
pcontact p =phead->pnext;
if((fp=fopen(""contact.txt""rb""))==NULL)
{
printf(""对不起,打开文件失败!n"");
exit(1);
}
fscanf(fp%d""&n);
for(i=0;i fscanf(fp%s%s%s%s%s%s%s""p->namep->agep->telep->postcodep->addrp->email); //按格式读入记录
fclose(fp);
printf(""您已成功读入contact.txt文档中联系人信息!n"");
return ;
}
解决方案二:
for循环是不是有问题????还是粘贴的时候没有粘贴全???
解决方案三:
你代码好长,把load方法中for(i=0;i fscanf(fp%s%s%s%s%s%s%s""p->namep->agep->telep->postcodep->addrp->email); //按格式读入记录这一行修改成下面的
for(i=0;i < n;i++) fscanf(fp%s%s%s%s%s%s%s""p->namep->agep->telep->postcodep->addrp->email); //按格式读入记录