用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
(一) 功能要求
(1) 查看功能:选择此功能时,列出下列三类选择。
A 办公类 B 个人类 C 商务类 ,当选中某类时,显示出此类所有数据中的姓名和电话号码)
(2) 增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。例如
杨春 13589664454 商务类 chuny@126.com
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(3) 拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拔号声音。
(4) 修改功能:选中某个人的姓名时,可对此人的相应数据进行修改
(5) 删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
(二)其它要求:
(1) 只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3) 建议使用结构和链表等数据结构
(4) 学生可自动增加新功能模块(视情况可另外加分)
(5)写出课程设计报告,具体要求见相关说明文档
这是我写的:#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <process.h>
#define LEN sizeof(struct addbook)
#define MAX 100
void InitDialBook(void);
void UserInterface(void);
void Load(void);
void Add(void);
void Find(void);
void Modify(void);
void Delete(void);
void ShowAll(void);
void Save(void);
struct addbook{
int record;
char name[15];
char sex[4];
char age[4];
char addr[20];
char phone[15];
char qq[15];
char meg[40]; /*个性签名*/
struct addbook *link;
};
FILE *fp;
struct addbook *p,*p1,*head,*s,*t;
main()
{
int flag;
int choice;
if((fp = fopen("D:\\zzxx.txt","rb"))==NULL)
{ system("cls");
printf("\n\n\t\t\t文件不存在!\n");
if((fp = fopen("D:\\zzxx.txt","wb"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
}
if(fgetc(fp)==-1)
{
printf("\n\t\t通讯录里没有信息,现在您必须添加信息.\n");
InitDialBook();
printf("\n\t\t\t添加成功!\n");
printf("\n\t\t您若想添加更多人的信息需请重新打开程序\n");
getchar();
exit(0);
}
rewind(fp); /* 重建文件指针 */
Load();
fclose(fp);
/* printf("\n这是文件里第%d位成员.\n",p->record); */
flag = 1;
while(flag)
{
UserInterface();
printf("请输入您的选择:(0-5):");
scanf("%d",&choice);
getchar();
if(choice>=0&&choice<6)
{
switch(choice)
{
case 1:
Add();break;
case 2:
Find();break;
case 3:
ShowAll();break;
case 4:
Delete();break;
case 5:
Modify();break;
case 0:
flag = 0;
system("cls");
printf("\n\n\n\t\t\t谢谢使用本通讯录系统!!!");
getchar();
break;
}
}
else{
printf("输入错误,请重新选择!\n");
}
}
fp = fopen("zzxx.txt","wb");
Save();
fclose(fp); system("cls");
printf("\n\n\n\t\t\t按任意键退出!\n");
getchar();
return 0;
}
void InitDialBook(void)/*初始化文件函数*/
{
p->record = 1;
printf("\n\n\t\t请输入姓名:");
gets(p->name);
printf("\n\t\t请输入性别:");
gets(p->sex);
printf("\n\t\t请输入年龄:");
gets(p->age);
printf("\n\t\t请输入地址:");
gets(p->addr);
printf("\n\t\t请输入电话:");
gets(p->phone);
printf("\n\t\t请输入QQ号码:");
gets(p->qq);
printf("\n\t\t请输入个性签名:");
gets(p->meg);
p->link = NULL;
head = p;
fwrite(p,LEN,1,fp);
fclose(fp);
}
void UserInterface(void)/*菜单*/
{ system("cls");
printf("\n\t\t********************************************\n");
printf("\t\t\t欢迎使用通讯录管理系统");
printf("\n\t\t********************************************\n");
printf("\n\n\t\t\t******请选择你的操作******\n");
printf("\t\t\t +-------------------------------+");
printf("\t\t\t\t\t\t | 1 增加个人信息 |\n");
printf("\t\t\t | 2 查找信息(包含删除 修改信息) |\n");
printf("\t\t\t | 3 显示所有信息 |\n");
printf("\t\t\t | 4 删除信息 |\n");
printf("\t\t\t | 5 修改信息 |\n");
printf("\t\t\t | 0 退出和保存 |\n");
printf("\t\t\t +-------------------------------+\n");
printf("\n\n\t注意!!输入数字(电话号码或QQ)要在英文状态下,中文状态无法输入!!\n\n");
}
void Load(void)/*读文件*/
{
fread(head,LEN,1,fp);
p = head;
while(p->link!=NULL){
p1 = (struct addbook*)malloc(LEN);
p1 = p->link;
fread(p1,LEN,1,fp);
p = p->link;
} }
void Add(void)/*输入函数*/
{ p1 = (struct addbook*)malloc(LEN);
p1->record = p->record + 1; system("cls");
printf("\n\n\t\t\t-------------------------------------------\n");
printf("\t\t\t\t\t请输入信息\n");
printf("\t\t\t-------------------------------------------\n");
printf("\n\t\t\t这是第%d位成员",p->record+1);
printf("\n\t\t\t请输入姓名:");
gets(p1->name);
printf("\n\t\t\t请输入性别:");
gets(p1->sex);
printf("\n\t\t\t请输入年龄:");
gets(p1->age);
printf("\n\t\t\t请输入地址:");
gets(p1->addr);
printf("\n\t\t\t请输入电话:");
gets(p1->phone);
printf("\n\t\t\t请输入QQ号码:");
gets(p1->qq);
printf("\n\t\t\t请输入个性签名:");
gets(p1->meg);
p1->link = NULL;
p->link = p1;
p = p1; }
void ShowAll(void)/*显示所有函数*/
{ s = head;
system("cls");
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" \t序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
do{
printf("\t %-6d%-10s%-8s%-7s%-10s%-10s%-s%-s\n",s->record,s->name,s->sex,
s->age,s->addr,s->phone,s->qq,s->meg);
s = s->link;
}while(s!=NULL);
printf("\n\n\n\t\t\t按任意键退出!");
getchar();
return;
}
void Find(void)/*查找函数*/
{ char c;
struct addbook who;
s = head;
system("cls");
printf("\n\t\t请输入要查找人的姓名:");
gets(who.name);
while((s->link!=NULL)&&(strcmp(s->name,who.name)))
{
s = s->link;
}
if((s->link==NULL)&&(strcmp(s->name,who.name)))
{
printf("\"%s\" 不存在!\n",who.name);
printf("请查对一下姓名再查找.\n");
getchar();
return;
}
system("cls");
printf("\n\t\t\t要查找的资料如下所示:\n");
printf("\n******************************************************\n");
printf("\t 序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n******************************************************\n");
printf("\t %-6d%-10s%-8s%-7s%-8s%-10s%-s%-s\n",s->record,s->name,s->sex,s->age,s->age,
s->addr,s->phone,s->qq,s->meg);
printf("\n\t\t删除(d) 修改(m) 浏览一下(s)\n");
printf("\n\t请输入您的选择(d/m/s):");
scanf("%c",&c);
switch(c)
{
case 'D':
case 'd':Delete();break;
case 'M':
case 'm':Modify();break;
}
}
void Modify(void)
{ getchar();
printf("\n\t\t请输入新的姓名:");
gets(s->name);
printf("\n\t\t请输入新的性别:");
gets(s->sex);
printf("\n\t\t请输入新的年龄:");
gets(s->age);
printf("\n\t\t请输入新的地址:");
gets(s->addr);
printf("\n\t\t请输入新的电话:");
gets(s->phone);
printf("\n\t\t请输入新的QQ号码:");
gets(s->qq);
printf("\n\t\t请输入新的个性签名:");
gets(s->meg);
printf("\n\t\t修改成功!\n");
getchar();
}
void Delete(void)/*删除函数*/
{
int find_prev;
int find_record;
char del;
char del_member_name[15];
struct addbook *p_del_prev;
strcpy(del_member_name,s->name);
getchar();
printf("确定要删除%s吗(Y/N)?",del_member_name);
scanf("%c",&del);
if(del=='n'||del=='N')
{
return;
}
find_prev = s->record - 1;
find_record = 1;
p_del_prev = head;
while((p_del_prev->link!=NULL)&&(find_record<find_prev))
{
p_del_prev = p_del_prev->link;
find_record++;
} /* 如果删除第一位成员 */
if(s->record==1)
{
if(s->link!=NULL)
{
head = head->link;
s = head;
while(s!=NULL)
{
s->record = s->record - 1;
s = s->link;
}
printf("%d,%s",p->record,p->name);
}
else if(s->link==NULL){ /* 如果第一位成员是最后一位 */
p = NULL;
head = p;
if(remove("zzxx.txt")==0)
{
printf("您已经删除了最后一位成员,通讯录已经清空!\n");
printf("所以,您必须重新建立通讯录!\n");
printf("重新打开程序去建立.\n");
}
printf("\n\n\t\t按任意键退出.\n");
getchar();
exit(0);
}
} /* 如果删除最后一位成员 */
else if(s->record==p->record){
p_del_prev->link = NULL;
s->link = NULL;
p = p_del_prev;
}
else
{
p_del_prev->link = s->link;
s->link = NULL;
while(p_del_prev->link!=NULL)
{
p_del_prev = p_del_prev->link;
p_del_prev->record = p_del_prev->record -1;
}
printf("%d\n%d\n",p->record,p->link);
}
printf("成员 \"%s\" 已经被删除.\n ",del_member_name);
getchar();
}
void Save(void)/*保存文件*/
{
s = head;
do{
fwrite(s,LEN,1,fp);
s = s->link;
}while(s!=NULL);
}
用的是MS VC++6.0求大神帮看错误,程序只要运行就会出现
通讯录里没有信息,现在您必须添加信息.
Process returned -1073741819 (0xC0000005) execution time : 2.547 s
Press any key to continue.
真心求大神帮改。。。。。。。。。跪求跪求!!!!!
6 个解决方案
#1
//初始化下结构体就OK了,可以根据你的逻辑来初始化
p = new addbook();
p1 = new addbook();
head = new addbook();
s = new addbook();
t = new addbook();
#2
不会调试吗?
#3
s建议编译一下看有什么错,没有的话就执行下看有什么BUG。要学会自己调试改错
#4
#include <stdio.h>大概帮你改了一下.
#include <string.h>
#include <stdlib.h>
#include <process.h>
#define LEN sizeof(struct addbook)
#define MAX 100
void InitDialBook(void);
void UserInterface(void);
void Load(void);
void Add(void);
void Find(void);
void Modify(void);
void Delete(void);
void ShowAll(void);
void Save(void);
void FreeAllMemory();
struct addbook{
int record;
char name[15];
char sex[4];
char age[4];
char addr[20];
char phone[15];
char qq[15];
char meg[40]; /*个性签名*/
struct addbook *link;
};
FILE *fp;
struct addbook *p,*p1,*head,*s,*t;
int main() {
int flag;
int choice;
fp = fopen("D:\\zzxx.txt","rb");
if ( fp == NULL ) {
system("cls");
printf("\n\n\t\t\t文件不存在!\n");
fp = fopen("D:\\zzxx.txt","wb");
if ( fp == NULL ) {
printf("文件打开错误!\n");
return 0;
}
}
if ( fgetc(fp)==-1 ) {
printf("\n\t\t通讯录里没有信息,现在您必须添加信息.\n");
InitDialBook();
printf("\n\t\t\t添加成功!\n");
printf("\n\t\t您若想添加更多人的信息需请重新打开程序\n");
getchar();
FreeAllMemory();
return 0;
}
rewind(fp); /* 重建文件指针 */
Load();
fclose(fp);
/* printf("\n这是文件里第%d位成员.\n",p->record); */
flag = 1;
while(flag)
{
UserInterface();
printf("请输入您的选择:(0-3):");
scanf("%d",&choice);
getchar();
if(choice>=0&&choice<6)
{
switch(choice)
{
case 1:
Add();break;
case 2:
Find();break;
case 3:
ShowAll();break;
// case 4:
// Delete();break;
// case 5:
// Modify();break;
case 0:
flag = 0;
system("cls");
printf("\n\n\n\t\t\t谢谢使用本通讯录系统!!!");
getchar();
break;
}
}
else{
printf("输入错误,请重新选择!\n");
}
}
fp = fopen("zzxx.txt","wb");
Save();
fclose(fp);
FreeAllMemory();
system("cls");
printf("\n\n\n\t\t\t按任意键退出!\n");
getchar();
return 0;
}
/*初始化文件函数*/
void InitDialBook(void) {
p = (struct addbook*)malloc(LEN);
p->record = 1;
printf("\n\n\t\t请输入姓名:");
gets(p->name);
printf("\n\t\t请输入性别:");
gets(p->sex);
printf("\n\t\t请输入年龄:");
gets(p->age);
printf("\n\t\t请输入地址:");
gets(p->addr);
printf("\n\t\t请输入电话:");
gets(p->phone);
printf("\n\t\t请输入QQ号码:");
gets(p->qq);
printf("\n\t\t请输入个性签名:");
gets(p->meg);
p->link = NULL;
head = p;
fwrite(p,LEN,1,fp);
fclose(fp);
}
/*菜单*/
void UserInterface(void) {
system("cls");
printf("\n\t\t********************************************\n");
printf("\t\t\t欢迎使用通讯录管理系统");
printf("\n\t\t********************************************\n");
printf("\n\n\t\t\t******请选择你的操作******\n");
printf("\t\t\t +-------------------------------+\n");
printf("\t\t\t | 1 增加个人信息 |\n");
printf("\t\t\t | 2 查找信息(包含删除 修改信息) |\n");
printf("\t\t\t | 3 显示所有信息 |\n");
// printf("\t\t\t | 4 删除信息 |\n");
// printf("\t\t\t | 5 修改信息 |\n");
printf("\t\t\t | 0 退出和保存 |\n");
printf("\t\t\t +-------------------------------+\n");
printf("\n\n\t注意!!输入数字(电话号码或QQ)要在英文状态下,中文状态无法输入!!\n\n");
}
/*读文件*/
void Load(void) {
head = (struct addbook*)malloc(LEN);
fread(head,LEN,1,fp);
p = head;
while(p->link!=NULL){
p1 = (struct addbook*)malloc(LEN);
fread(p1,LEN,1,fp);
p->link = p1;
p = p->link;
}
}
/*输入函数*/
void Add(void) {
p1 = (struct addbook*)malloc(LEN);
p1->record = p->record + 1; system("cls");
printf("\n\n\t\t\t-------------------------------------------\n");
printf("\t\t\t\t\t请输入信息\n");
printf("\t\t\t-------------------------------------------\n");
printf("\n\t\t\t这是第%d位成员",p->record+1);
printf("\n\t\t\t请输入姓名:");
gets(p1->name);
printf("\n\t\t\t请输入性别:");
gets(p1->sex);
printf("\n\t\t\t请输入年龄:");
gets(p1->age);
printf("\n\t\t\t请输入地址:");
gets(p1->addr);
printf("\n\t\t\t请输入电话:");
gets(p1->phone);
printf("\n\t\t\t请输入QQ号码:");
gets(p1->qq);
printf("\n\t\t\t请输入个性签名:");
gets(p1->meg);
p1->link = NULL;
p->link = p1;
p = p1;
}
/*显示所有函数*/
void ShowAll(void) {
s = head;
system("cls");
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" \t序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
do{
printf("\t %-6d%-10s%-8s%-7s%-10s%-10s%-s%-s\n",s->record,s->name,s->sex,
s->age,s->addr,s->phone,s->qq,s->meg);
s = s->link;
}while(s!=NULL);
printf("\n\n\n\t\t\t按任意键退出!");
getchar();
return;
}
/*查找函数*/
void Find(void) {
char c;
struct addbook who;
s = head;
system("cls");
printf("\n\t\t请输入要查找人的姓名:");
gets(who.name);
while((s->link!=NULL)&&(strcmp(s->name,who.name)))
{
s = s->link;
}
if((s->link==NULL)&&(strcmp(s->name,who.name)))
{
printf("\"%s\" 不存在!\n",who.name);
printf("请查对一下姓名再查找.\n");
getchar();
return;
}
system("cls");
printf("\n\t\t\t要查找的资料如下所示:\n");
printf("\n******************************************************\n");
printf("\t 序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n******************************************************\n");
printf("\t %-6d%-10s%-8s%-7s%-8s%-10s%-s%-s\n",s->record,s->name,s->sex,s->age,s->age,
s->addr,s->phone,s->qq,s->meg);
printf("\n\t\t删除(d) 修改(m) 浏览一下(s)\n");
printf("\n\t请输入您的选择(d/m/s):");
scanf("%c",&c);
switch(c)
{
case 'D':
case 'd':Delete();break;
case 'M':
case 'm':Modify();break;
}
}
void Modify(void) {
getchar();
printf("\n\t\t请输入新的姓名:");
gets(s->name);
printf("\n\t\t请输入新的性别:");
gets(s->sex);
printf("\n\t\t请输入新的年龄:");
gets(s->age);
printf("\n\t\t请输入新的地址:");
gets(s->addr);
printf("\n\t\t请输入新的电话:");
gets(s->phone);
printf("\n\t\t请输入新的QQ号码:");
gets(s->qq);
printf("\n\t\t请输入新的个性签名:");
gets(s->meg);
printf("\n\t\t修改成功!\n");
getchar();
}
/*删除函数*/
void Delete(void) {
int find_prev;
int find_record;
char del;
char del_member_name[15];
struct addbook *p_del_prev;
strcpy(del_member_name,s->name);
getchar();
printf("确定要删除%s吗(Y/N)?",del_member_name);
scanf("%c",&del);
if(del=='n'||del=='N')
{
return;
}
find_prev = s->record - 1;
find_record = 1;
p_del_prev = head;
while((p_del_prev->link!=NULL)&&(find_record<find_prev))
{
p_del_prev = p_del_prev->link;
find_record++;
} /* 如果删除第一位成员 */
if(s->record==1)
{
if(s->link!=NULL)
{
head = head->link;
s = head;
while(s!=NULL)
{
s->record = s->record - 1;
s = s->link;
}
printf("%d,%s",p->record,p->name);
}
else if(s->link==NULL){ /* 如果第一位成员是最后一位 */
p = NULL;
head = p;
if(remove("zzxx.txt")==0)
{
printf("您已经删除了最后一位成员,通讯录已经清空!\n");
printf("所以,您必须重新建立通讯录!\n");
printf("重新打开程序去建立.\n");
}
printf("\n\n\t\t按任意键退出.\n");
getchar();
exit(0);
}
} /* 如果删除最后一位成员 */
else if(s->record==p->record){
p_del_prev->link = NULL;
s->link = NULL;
p = p_del_prev;
}
else
{
p_del_prev->link = s->link;
s->link = NULL;
while(p_del_prev->link!=NULL)
{
p_del_prev = p_del_prev->link;
p_del_prev->record = p_del_prev->record -1;
}
printf("%d\n%d\n",p->record,p->link);
}
printf("成员 \"%s\" 已经被删除.\n ",del_member_name);
getchar();
}
/*保存文件*/
void Save(void) {
s = head;
do {
fwrite(s,LEN,1,fp);
s = s->link;
} while(s!=NULL);
}
void FreeAllMemory() {
s = head;
do {
p1 = s;
s = s->link;
free( p1 );
} while(s!=NULL);
}
首先,你的内存没有初始化就直接进行操作.肯定会出问题.
其次,每次分配的内存,地址不一定一样,你的Load函数逻辑有问题.用上一次保存的地址..这样是不对的.
再次,你的删除,修改逻辑是和查找有前后关联的,放在主菜单不对.因为这个时候,s并不一定指向有用的对象.就算指向了,也不是你想要操作的对象.所以我帮你注释掉了这几行代码.
还有,你的程序没有内存释放的逻辑.我帮你加了一个.
最后,你这里,只有head指向链表头,p指向结尾应该是全局变量,其它的都应该使用局部变量.还有,变量的使用比较混乱.就没有帮你改了.你仔细想一下吧.
#5
lz要自己调试,刚调了一下,停止工作得错误很明显,lz要不在看看? 要不认真看下楼上的,很详细了
#6
嗯 自己运行下 看看那里有错 很清楚的
#1
//初始化下结构体就OK了,可以根据你的逻辑来初始化
p = new addbook();
p1 = new addbook();
head = new addbook();
s = new addbook();
t = new addbook();
#2
不会调试吗?
#3
s建议编译一下看有什么错,没有的话就执行下看有什么BUG。要学会自己调试改错
#4
#include <stdio.h>大概帮你改了一下.
#include <string.h>
#include <stdlib.h>
#include <process.h>
#define LEN sizeof(struct addbook)
#define MAX 100
void InitDialBook(void);
void UserInterface(void);
void Load(void);
void Add(void);
void Find(void);
void Modify(void);
void Delete(void);
void ShowAll(void);
void Save(void);
void FreeAllMemory();
struct addbook{
int record;
char name[15];
char sex[4];
char age[4];
char addr[20];
char phone[15];
char qq[15];
char meg[40]; /*个性签名*/
struct addbook *link;
};
FILE *fp;
struct addbook *p,*p1,*head,*s,*t;
int main() {
int flag;
int choice;
fp = fopen("D:\\zzxx.txt","rb");
if ( fp == NULL ) {
system("cls");
printf("\n\n\t\t\t文件不存在!\n");
fp = fopen("D:\\zzxx.txt","wb");
if ( fp == NULL ) {
printf("文件打开错误!\n");
return 0;
}
}
if ( fgetc(fp)==-1 ) {
printf("\n\t\t通讯录里没有信息,现在您必须添加信息.\n");
InitDialBook();
printf("\n\t\t\t添加成功!\n");
printf("\n\t\t您若想添加更多人的信息需请重新打开程序\n");
getchar();
FreeAllMemory();
return 0;
}
rewind(fp); /* 重建文件指针 */
Load();
fclose(fp);
/* printf("\n这是文件里第%d位成员.\n",p->record); */
flag = 1;
while(flag)
{
UserInterface();
printf("请输入您的选择:(0-3):");
scanf("%d",&choice);
getchar();
if(choice>=0&&choice<6)
{
switch(choice)
{
case 1:
Add();break;
case 2:
Find();break;
case 3:
ShowAll();break;
// case 4:
// Delete();break;
// case 5:
// Modify();break;
case 0:
flag = 0;
system("cls");
printf("\n\n\n\t\t\t谢谢使用本通讯录系统!!!");
getchar();
break;
}
}
else{
printf("输入错误,请重新选择!\n");
}
}
fp = fopen("zzxx.txt","wb");
Save();
fclose(fp);
FreeAllMemory();
system("cls");
printf("\n\n\n\t\t\t按任意键退出!\n");
getchar();
return 0;
}
/*初始化文件函数*/
void InitDialBook(void) {
p = (struct addbook*)malloc(LEN);
p->record = 1;
printf("\n\n\t\t请输入姓名:");
gets(p->name);
printf("\n\t\t请输入性别:");
gets(p->sex);
printf("\n\t\t请输入年龄:");
gets(p->age);
printf("\n\t\t请输入地址:");
gets(p->addr);
printf("\n\t\t请输入电话:");
gets(p->phone);
printf("\n\t\t请输入QQ号码:");
gets(p->qq);
printf("\n\t\t请输入个性签名:");
gets(p->meg);
p->link = NULL;
head = p;
fwrite(p,LEN,1,fp);
fclose(fp);
}
/*菜单*/
void UserInterface(void) {
system("cls");
printf("\n\t\t********************************************\n");
printf("\t\t\t欢迎使用通讯录管理系统");
printf("\n\t\t********************************************\n");
printf("\n\n\t\t\t******请选择你的操作******\n");
printf("\t\t\t +-------------------------------+\n");
printf("\t\t\t | 1 增加个人信息 |\n");
printf("\t\t\t | 2 查找信息(包含删除 修改信息) |\n");
printf("\t\t\t | 3 显示所有信息 |\n");
// printf("\t\t\t | 4 删除信息 |\n");
// printf("\t\t\t | 5 修改信息 |\n");
printf("\t\t\t | 0 退出和保存 |\n");
printf("\t\t\t +-------------------------------+\n");
printf("\n\n\t注意!!输入数字(电话号码或QQ)要在英文状态下,中文状态无法输入!!\n\n");
}
/*读文件*/
void Load(void) {
head = (struct addbook*)malloc(LEN);
fread(head,LEN,1,fp);
p = head;
while(p->link!=NULL){
p1 = (struct addbook*)malloc(LEN);
fread(p1,LEN,1,fp);
p->link = p1;
p = p->link;
}
}
/*输入函数*/
void Add(void) {
p1 = (struct addbook*)malloc(LEN);
p1->record = p->record + 1; system("cls");
printf("\n\n\t\t\t-------------------------------------------\n");
printf("\t\t\t\t\t请输入信息\n");
printf("\t\t\t-------------------------------------------\n");
printf("\n\t\t\t这是第%d位成员",p->record+1);
printf("\n\t\t\t请输入姓名:");
gets(p1->name);
printf("\n\t\t\t请输入性别:");
gets(p1->sex);
printf("\n\t\t\t请输入年龄:");
gets(p1->age);
printf("\n\t\t\t请输入地址:");
gets(p1->addr);
printf("\n\t\t\t请输入电话:");
gets(p1->phone);
printf("\n\t\t\t请输入QQ号码:");
gets(p1->qq);
printf("\n\t\t\t请输入个性签名:");
gets(p1->meg);
p1->link = NULL;
p->link = p1;
p = p1;
}
/*显示所有函数*/
void ShowAll(void) {
s = head;
system("cls");
printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" \t序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
do{
printf("\t %-6d%-10s%-8s%-7s%-10s%-10s%-s%-s\n",s->record,s->name,s->sex,
s->age,s->addr,s->phone,s->qq,s->meg);
s = s->link;
}while(s!=NULL);
printf("\n\n\n\t\t\t按任意键退出!");
getchar();
return;
}
/*查找函数*/
void Find(void) {
char c;
struct addbook who;
s = head;
system("cls");
printf("\n\t\t请输入要查找人的姓名:");
gets(who.name);
while((s->link!=NULL)&&(strcmp(s->name,who.name)))
{
s = s->link;
}
if((s->link==NULL)&&(strcmp(s->name,who.name)))
{
printf("\"%s\" 不存在!\n",who.name);
printf("请查对一下姓名再查找.\n");
getchar();
return;
}
system("cls");
printf("\n\t\t\t要查找的资料如下所示:\n");
printf("\n******************************************************\n");
printf("\t 序号 姓名 性别 年龄 地址 电话 QQ号码 个性签名");
printf("\n******************************************************\n");
printf("\t %-6d%-10s%-8s%-7s%-8s%-10s%-s%-s\n",s->record,s->name,s->sex,s->age,s->age,
s->addr,s->phone,s->qq,s->meg);
printf("\n\t\t删除(d) 修改(m) 浏览一下(s)\n");
printf("\n\t请输入您的选择(d/m/s):");
scanf("%c",&c);
switch(c)
{
case 'D':
case 'd':Delete();break;
case 'M':
case 'm':Modify();break;
}
}
void Modify(void) {
getchar();
printf("\n\t\t请输入新的姓名:");
gets(s->name);
printf("\n\t\t请输入新的性别:");
gets(s->sex);
printf("\n\t\t请输入新的年龄:");
gets(s->age);
printf("\n\t\t请输入新的地址:");
gets(s->addr);
printf("\n\t\t请输入新的电话:");
gets(s->phone);
printf("\n\t\t请输入新的QQ号码:");
gets(s->qq);
printf("\n\t\t请输入新的个性签名:");
gets(s->meg);
printf("\n\t\t修改成功!\n");
getchar();
}
/*删除函数*/
void Delete(void) {
int find_prev;
int find_record;
char del;
char del_member_name[15];
struct addbook *p_del_prev;
strcpy(del_member_name,s->name);
getchar();
printf("确定要删除%s吗(Y/N)?",del_member_name);
scanf("%c",&del);
if(del=='n'||del=='N')
{
return;
}
find_prev = s->record - 1;
find_record = 1;
p_del_prev = head;
while((p_del_prev->link!=NULL)&&(find_record<find_prev))
{
p_del_prev = p_del_prev->link;
find_record++;
} /* 如果删除第一位成员 */
if(s->record==1)
{
if(s->link!=NULL)
{
head = head->link;
s = head;
while(s!=NULL)
{
s->record = s->record - 1;
s = s->link;
}
printf("%d,%s",p->record,p->name);
}
else if(s->link==NULL){ /* 如果第一位成员是最后一位 */
p = NULL;
head = p;
if(remove("zzxx.txt")==0)
{
printf("您已经删除了最后一位成员,通讯录已经清空!\n");
printf("所以,您必须重新建立通讯录!\n");
printf("重新打开程序去建立.\n");
}
printf("\n\n\t\t按任意键退出.\n");
getchar();
exit(0);
}
} /* 如果删除最后一位成员 */
else if(s->record==p->record){
p_del_prev->link = NULL;
s->link = NULL;
p = p_del_prev;
}
else
{
p_del_prev->link = s->link;
s->link = NULL;
while(p_del_prev->link!=NULL)
{
p_del_prev = p_del_prev->link;
p_del_prev->record = p_del_prev->record -1;
}
printf("%d\n%d\n",p->record,p->link);
}
printf("成员 \"%s\" 已经被删除.\n ",del_member_name);
getchar();
}
/*保存文件*/
void Save(void) {
s = head;
do {
fwrite(s,LEN,1,fp);
s = s->link;
} while(s!=NULL);
}
void FreeAllMemory() {
s = head;
do {
p1 = s;
s = s->link;
free( p1 );
} while(s!=NULL);
}
首先,你的内存没有初始化就直接进行操作.肯定会出问题.
其次,每次分配的内存,地址不一定一样,你的Load函数逻辑有问题.用上一次保存的地址..这样是不对的.
再次,你的删除,修改逻辑是和查找有前后关联的,放在主菜单不对.因为这个时候,s并不一定指向有用的对象.就算指向了,也不是你想要操作的对象.所以我帮你注释掉了这几行代码.
还有,你的程序没有内存释放的逻辑.我帮你加了一个.
最后,你这里,只有head指向链表头,p指向结尾应该是全局变量,其它的都应该使用局部变量.还有,变量的使用比较混乱.就没有帮你改了.你仔细想一下吧.
#5
lz要自己调试,刚调了一下,停止工作得错误很明显,lz要不在看看? 要不认真看下楼上的,很详细了
#6
嗯 自己运行下 看看那里有错 很清楚的