通讯录管理问题路过的大神帮忙看一下,感激不尽
已知程序要求通讯录的信息为:姓名、电话号码、类别、电子邮件,其中类别的类型有 :同事 类、朋友类、商务类、一般类),设计一程序,完成以下功能:
1) 能从键盘输入通讯录的信息(增加,输入时需要能检查该姓名的通讯录的记录是否已经存
在,如果存在,需要询问是否是覆盖还是增加,需要判断输入的类型是否存在)
2) 能从指定的文件中读入通讯录的信息
3) 能按姓名查询通讯录的信息
4) 能按分类查询通讯录的信息
5) 能删除指定姓名的通讯录的信息
6) 能将通讯录信息保存在指定的文件中
提示:
l 从文件读入学生信息时,需要先设计好文件的格式,从文件中读取数据后,按照预先设计
的格式分析数据,提取学生的信息,读入程序
l 可以使用一个结构体数组保存类别,类别结构体包含的信息为:类别代号,类别名称。(如
001,同事 则表示同事类),在输入通讯录信息时,只需要输入该类别对应的代号则可(查 询
类别数组中是否有该代号的记录),将该代号保存在通讯录信息中。显示时,根据代号在
类别结构体数组中查询其类别名称显示。
下面是我写的代码,程序在将通讯录信息保存在指定的文件中的时候出了点问题,保存的结果部分是乱码,
还有在查询的时候也遇到了问题,但是我检查了几遍都没发现问题出在哪里,求各位路过的大神帮忙修改一下,顺便告诉一下原因
小弟感激不尽!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct address /* 通讯录信息结构 */
{
char name[50];
char tele[30];
char clas[30];
char email[30];
struct address *next;
} ADDR;
ADDR *head;
void displayMenu();
int choiceItem();
void freeRecord(ADDR *head);
ADDR *addRecord(ADDR *head);
ADDR *createRecord(ADDR *head);
ADDR *deleteRecord(ADDR *head);
void searchRecord1(ADDR *head);
void searchRecord2(ADDR *head);
void saveFile(ADDR *head);
ADDR *readFile( );
void display(ADDR *head);
main( )
{
ADDR *head = NULL; /* 表头指针 */
int choice,a;
system("cls");
do {
choice = choiceItem( ); /* 菜单选择 */
switch (choice) {
case 1: head = createRecord(head ); /* 创建通讯录 */
break;
case 2: head = addRecord(head); /* 添加记录 */
break;
case 3: head = deleteRecord(head); /* 删除记录 */
break;
case 4: /* 查找记录 */
{
printf("查找方式:1、按姓名查找;2、按分类查找\n");
printf("请输入你的选择:");
scanf("%d",&a);
switch(a)
{
case 1:{
printf("按姓名查找:\n");
searchRecord1(head);
}
break;
case 2:{
printf("按分类查找:\n");
searchRecord2(head);
}
break;
}
};
break;
case 5: display(head); /* 显示通讯录 */
break;
case 6: saveFile(head); /* 保存到文件 */
break;
case 7: head = readFile( ); /* 从文件读通讯录数据 */
break;
}
} while(choice!=0);
printf( "\n谢谢使用,再见!\n!");
freeRecord(head);
}
void displayMenu(void) /* 显示菜单 */
{
printf("********************************欢迎使用通讯录系统******************************");
printf("\n");
printf("\n");
printf(" 1.创建通讯录 \n");
printf(" 2.添加记录 \n");
printf(" 3.删除记录 \n");
printf(" 4.查询记录 \n");
printf(" 5.显示通讯录 \n");
printf(" 6.保存到文件 \n");
printf(" 7.读入文件 \n");
printf(" 0.退出通讯录 \n");
printf("\n");
printf("\n");
printf("********************************欢迎使用通讯录系统******************************");
printf("\n请在0--7内选择:");
}
int choiceItem(void) /* 菜单选择 */
{
int choice;
char line[80];
do{
displayMenu( );
gets(line);
choice = atoi(line);;
} while(choice<0 || choice>7);
return choice;
}
void freeRecord(ADDR *p) /* 释放链表结点 */
{
ADDR *q;
while (p!=NULL) {
q = p;
p = p->next;
free(q); /* 依次释放各结点 */
}
}
ADDR *addRecord(ADDR *p) /* 输入一组记录,添加到链表中 */
{
ADDR head, *q;
head.next = p;
p = &head;
while (p->next!=NULL) /* 将当前指针移动到链表尾端 */
p = p->next;
while(1) {
char text[80];
q = (ADDR *)malloc(sizeof(ADDR));
if (q==NULL)
return head.next;
q->next = NULL;
printf("\n\n输入姓名 电话 分类 邮件:\n ");
gets(text); /* 读取一行文本 */
if (text[0]=='\0') break; /* 空行为结束标志 */
sscanf(text, "%s%s%s%s", q->name, q->tele,q->clas,q->email);
p->next = q; /* 在链表尾端添加结点 */
p = q; /* 更新当前指针 */
}
return head.next;
}
ADDR *createRecord(ADDR *p) /* 创建新通讯录 */
{
freeRecord(p); /* 释放原链表所占空间 */
return addRecord(NULL); /* 输入一组记录,创建链表 */
}
ADDR *deleteRecord(ADDR *p) /* 根据输入的姓名删除记录 */
{
char name[32];
ADDR *q, head; /* 前驱结点 */
printf("\n输入要删除的记录姓名: ");
gets(name); /* 输入姓名 */
for (head.next=p, q=&head; p!=NULL; p=p->next) {
if (strcmp(p->name, name)!=0) /* 不等于当前结点中的姓名 */
q = p; /* 以当前结点作为前驱结点 */
else {
q->next = p->next; /* 从链表中移出当前结点 */
free(p); /* 释放当前结点 */
printf("\n删除成功.\n", name);
return head.next;
}
}
printf("\n没有%s的记录\n", name);
return head.next;
}
void searchRecord1(ADDR *p) /* 通过输入的姓名查询记录 */
{
char name[32];
if(head->next==NULL)
{
printf("无记录!\n");
return;
}
printf("请输入要查找的姓名:\n");
scanf("%s",&name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{
printf("姓名\t类别\t电话\t邮件\\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->clas,p->tele,p->email);
}
else if(p->next==NULL)
printf("无此信息!\n");
}
}
void searchRecord2(ADDR *p) /* 通过输入的分类查询记录 */
{
char clas[32];
if(head->next==NULL)
{
printf("无记录!\n");
return;
}
printf("请输入要查找的分类:\n");
scanf("%s",&clas);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->clas,clas)==0)
{
printf("姓名\t类别\t电话\t邮件\\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->clas,p->tele,p->email);
}
else if(p->next==NULL)
printf("无此信息!\n");
}
}
void saveFile(ADDR *p) /* 将记录信息写入文件 */
{
FILE *fp;
char fname[32];
printf("\n输入文件名: ");
gets(fname); /* 输入文件名 */
if ((fp = fopen(fname, "wb"))==NULL) { /* 打开文件 */
printf("Cannot open this file!\n");
return;
}
for (; p!=NULL; p=p->next) /* 遍历链表 */
fwrite(p, sizeof(ADDR), 1, fp); /* 写一个记录到文件 */
fclose(fp);
printf("写入成功!\n");
}
ADDR *readFile(void) /* 从文件中读取记录信息 */
{
ADDR *p, *q, head = { "","", NULL };
FILE *fp;
char fname[32];
printf("\n输入文件名: ");
gets(fname); /* 输入文件名*/
if ((fp=fopen(fname, "rb")) == NULL) { /* 打开文件 */
printf("Cannot open this file!\n");
return NULL;
}
q = &head; /* 尾端结点指针 */
while(!feof(fp)) { /* 读结束? */
p = (ADDR *)malloc(sizeof(ADDR));
if (p==NULL)
break;
p->next = NULL;
if (1!=fread(p, sizeof(ADDR), 1, fp))
break; /* 读失败时 */
q->next = p; /* 在链表尾端添加 */
q = p; /* 更新尾端指针 */
}
fclose(fp); /* 关闭文件 */
printf("读取成功!\n");
return head.next;
}
void display(ADDR *p) /* 显示所有记录信息 */
{
for (; p!=NULL; p=p->next)
printf("\n姓名:%s\t电话:%s\t分类:%s\t邮件:%s\n", p->name, p->tele,p->clas,p->email);
printf("\n");
}