[提问] [求助]帮我用C语言编个通讯录的程序
[求助]帮我用C语言编个通讯录的程序问题描述:
通过该系统实现对有N个同学的通信信息进行录入、显示、修改、删除等操作的管理。
2、功能要求:
1)本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:姓名、性别、单位、手机号、e-mail。
2)本系统显示这样的菜单:
请选择系统功能项:
e. 基本信息录入
f. 基本信息显示
g. 修改信息
h. 基本信息删除
i. 基本信息查询
(1) 按姓名(2) 查询
(3) 按单位查询
g. 退出系统
3)执行一个具体的功能之后,程序将重新显示菜单。
3、算法提示:
数据结构:结构体类型数组
数据库结构:该系统的基本数据库如下:
姓名 性别 单位 手机号 e-mail
Char char char Char char
4、测试数据:
学生人数N=10 好像蛮多学校课程设计都是这个啊~~~
我上个学期写的,LZ修改一下就可以了~~~ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(struct linker)
typedef struct linker
{ char name[9];
char fnum[21];
char dnum[21];
char mnum[12];
char xnum[11];
struct linker *next;
}link;
main()
{ FILE *fp;
void welcome(); //欢迎界面
void menu(); //菜单界面
link *creat(); //创建一个链表
link *print(link *); //输出全部记录
link *insert(link *); //添加一条新记录
link *change(link *); //改变记录中的信息
void search(link *); //查找记录,支持模糊查找
link *delet(link *); //删除一条记录
void saves(link *); //将记录保存到文件中
char identify;
char fullname[10];
link *head,*p,*p1,*p2,*p3;
int choose;
char absorb;
int i;
head=NULL;
welcome();
do //确定输入是否为y或Y或n或N
{
scanf("%c",&identify);
scanf("%c",&absorb);
if(identify=='y'||identify=='Y')
system("cls");
else
if(identify=='n'||identify=='N')
exit(0);
else
printf(" 请输入(Y/N):");
}while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N');
while(1)
{
menu();
scanf("%d",&choose);
scanf("%c",&absorb);
switch(choose)
{ case 1: head=creat(); //创建链表,并将链表中的信息输入到文件中
saves(head);
system("cls");
break;
case 2: i=0;
if((fp=fopen("tongxunlu","a+"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
} //打开文件,并将文件中内容复制到链表中,若文件中无记录,则链表头指针为空
if(!feof(fp))
{ i++;
p2=p1;
p1=p2=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
head=p1;
}
while(!feof(fp))
{ i++;
p2=p1;
p1=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
}
if(i==1)
head=NULL;
p2->next=NULL;
fclose(fp);
search(head);
system("cls");
break;
case 3: i=0;
if((fp=fopen("tongxunlu","a+"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
}
if(!feof(fp))
{ i++;
p2=p1;
p1=p2=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
head=p1;
}
while(!feof(fp))
{ i++;
p2=p1;
p1=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
}
if(i==1)
head=NULL;
p2->next=NULL;
fclose(fp);
if(head==NULL)
{
printf("\n");
printf(" 通讯录中无记录,请返回~~~");
}
else
change(head);
saves(head);
system("cls");
break;
case 4: i=0;
if((fp=fopen("tongxunlu","a+"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
}
if(!feof(fp))
{ i++;
p2=p1;
p1=p2=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
head=p1;
}
while(!feof(fp))
{ i++;
p2=p1;
p1=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
}
if(i==1)
head=NULL;
p2->next=NULL;
fclose(fp);
if(head==NULL)
{ printf("\n");
printf(" 通讯录中无记录,请创建~~~");
}
else
{ head=insert(head);
saves(head);
}
system("cls");
break;
case 5: i=0;
if((fp=fopen("tongxunlu","a+"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
}
if(!feof(fp))
{ i++;
p2=p1;
p1=p2=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
head=p1;
}
while(!feof(fp))
{ i++;
p2=p1;
p1=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
}
if(i==1)
head=NULL;
p2->next=NULL;
fclose(fp);
if(head==NULL)
{
printf("\n");
printf(" 通讯录中无记录,请返回~~~");
}
else
head=delet(head);
saves(head);
system("cls");
break;
case 6: i=0;
if((fp=fopen("tongxunlu","a+"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
}
if(!feof(fp))
{ i++;
p2=p1;
p1=p2=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
head=p1;
}
while(!feof(fp))
{ i++;
p2=p1;
p1=(link *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
}
if(i==1)
head=NULL;
p2->next=NULL;
fclose(fp);
if(head==NULL)
{
printf("\n");
printf(" 通讯录中无记录,请返回~~~");
}
else
{ print(head);
printf("\n");
printf(" 按任意键返回~~~");
}
getch();
system("cls");
break;
case 7: printf("\n");
printf(" 确认要退出吗?(Y/N):");
do
{
scanf("%c",&identify);
scanf("%c",&absorb);
if(identify=='y'||identify=='Y')
{ p=p3=head;//释放链表占用的内存
while(p!=NULL)
{ p3=p3->next;
p=p3;
free(p3);
}
exit(0);
}
else
if(identify=='n'||identify=='N')
system("cls");
else
printf(" 请输入(Y/N):");
} while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N');
break;
default: printf("\n");
printf("\n");
printf(" 请输入正确数字(1-7)!");
}
}
system("pause");
}
void welcome()
{ printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * 制作人:lovehui *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎使用:通讯录 *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" 请按提示操作:\n");
printf(" 是否进入(Y/N):");
}
void menu()
{ printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" ☆ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ☆\n");
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(" ☆ ☆\n");
printf(" ☆ ☆\n");
printf(" ☆ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ☆\n");
printf(" 请输入数字(1-6):");
}
link *creat()
{ link *head;
link *p1,*p2;
char identify,absorb;
p1=p2=(link *)malloc(LEN);
head=p1;
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" 姓名:");
gets(p1->name);
printf(" 家庭电话号码:");
gets(p1->fnum);
printf(" 单位电话号码:");
gets(p1->dnum);
printf(" 手机号码:");
gets(p1->mnum);
printf(" 小灵通号码:");
gets(p1->xnum);
printf("\n");
printf("\n");
printf(" 内容已保存,是否继续?(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
{ printf(" 请输入(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
}
while(identify=='y'||identify=='Y')
{
p2->next=p1;
p2=p1;
p1=(link*)malloc(LEN);
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" 姓名:");
gets(p1->name);
printf(" 家庭电话号码:");
gets(p1->fnum);
printf(" 单位电话号码:");
gets(p1->dnum);
printf(" 手机号码:");
gets(p1->mnum);
printf(" 小灵通号码:");
gets(p1->xnum);
printf("\n");
printf("\n");
printf(" 内容已保存,是否继续?(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
{ printf(" 请输入(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
}
}
p2->next=p1;
p2=p1;
p2->next=NULL;
return (head);
}
link *print(link *head)
{ link *p1,*p2,*p3;
link *p4;
char _name[9];
char _fnum[21];
char _dnum[21];
char _mnum[12];
char _xnum[21];
p1=head;
p2=head;
int n=0;
while(p2!=NULL) //将链表中记录按姓名顺序排列
{ p1=p2;
while(p1!=NULL)
{ if(strcmp(p2->name,p1->name)>0)
{
strcpy(_name,p2->name);
strcpy(p2->name,p1->name);
strcpy(p1->name,_name);
strcpy(_fnum,p2->fnum);
strcpy(p2->fnum,p1->fnum);
strcpy(p1->fnum,_fnum);
strcpy(_dnum,p2->dnum);
strcpy(p2->dnum,p1->dnum);
strcpy(p1->dnum,_dnum);
strcpy(_mnum,p2->mnum);
strcpy(p2->mnum,p1->mnum);
strcpy(p1->mnum,_mnum);
strcpy(_xnum,p2->xnum);
strcpy(p2->xnum,p1->xnum);
strcpy(p1->xnum,_xnum);
}
p1=p1->next;
}
p2=p2->next;
}
printf("\n");
printf("\n");
printf("序号 姓名 家庭电话号码 单位电话号码 手机号码 小灵通号码\n");
p3=head;
do //输出链表中信息
{
n++;
printf(" %-5d%-10s%-15s%-15s%-15s%-15s\n",n,p3->name,p3->fnum,p3->dnum,p3->mnum,p3->xnum);
p3=p3->next;
}while(p3!=NULL);
return (head);
}
link *insert(link *head)
{ link *pp1=NULL,*pp2=NULL;
char identify,absorb;
do
{
pp1=head;
pp2=(link *)malloc(LEN);
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" 姓名:");
gets(pp2->name);
printf(" 家庭电话号码:");
gets(pp2->fnum);
printf(" 单位电话号码:");
gets(pp2->dnum);
printf(" 手机号码:");
gets(pp2->mnum);
printf(" 小灵通号码:");
gets(pp2->xnum);
while(pp1->next!=NULL)
pp1=pp1->next;
pp1->next=pp2;
pp2->next=NULL;
printf("\n");
printf("\n");
printf(" 内容已保存,是否继续?(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
{ printf(" 请输入(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
}
}while(identify!='n'&&identify!='N');
return (head);
}
link *change(link *head)
{ link *p1,*p2,*p3;
p1=p3=head;
void print(link *);
print(p3);
int choose,i,n=0;
char _choose,absorb,identify;
char input[21];
printf("\n");
printf("\n");
printf(" 请输入需修改内容所在行序列号:");
scanf("%d",&choose);
scanf("%c",&absorb);
while(p1!=NULL) //计算链表中记录数目
{ n++;
p1=p1->next;
}
p1=head;
while(choose<0||choose>n)
{ printf(" 查无此内容,请确认后重新输入:");
scanf("%d",&choose);
scanf("%c",&absorb);
}
printf("\n");
for(i=1;i<choose;i++) //将指针指向指定位置
p1=p1->next;
printf("a.姓名 b.家庭电话号码 c.单位电话号码 d.手机号码 e.小灵通号码\n");
printf(" 请输入修改内容类型:");
scanf("%c",&_choose);
scanf("%c",&absorb);
printf("\n");
printf(" 请输入修改内容:");
gets(input);
printf("\n");
printf(" 确认要替换吗?(Y/N):");
scanf("%c",&identify);
scanf("%c",&absorb);
printf("\n");
while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
{ printf(" 请输入(Y/N):");
scanf("%c",&identify);
}
if(identify=='y'||identify=='Y')
{ switch(_choose)
{ case 'a': strcpy(p1->name,input);
printf(" 内容已修改,按任意键返回。");
break;
case 'b': strcpy(p1->fnum,input);
printf(" 内容已修改,按任意键返回。");
break;
case 'c': strcpy(p1->dnum,input);
printf(" 内容已修改,按任意键返回。");
break;
case 'd': strcpy(p1->mnum,input);
printf(" 内容已修改,按任意键返回。");
break;
case 'e': strcpy(p1->xnum,input);
printf(" 内容已修改,按任意键返回。");
break;
}
}
getch();
return (head);
}
void search(link *head)
{ char fullname[9];
printf("\n");
printf("\n");
printf(" 请输入姓名:");
gets(fullname);
link *p1,*p2;
char _name[9]="";
int n=0;
p1=head;
printf("\n");
printf("序号 姓名 家庭电话号码 单位电话号码 手机号码 小灵通号码\n");
while(p1!=NULL)
{ strncpy(_name,p1->name,strlen(fullname)); //按输入姓名字符数截取每个姓名,和输入姓名比较
if(strcmp(fullname,_name)==0)
{ n++; //计算链表中记录的序号
printf(" %-5d%-10s%-15s%-15s%-15s%-15s\n",n,p1->name,p1->fnum,p1->dnum,p1->mnum,p1->xnum);
p1=p1->next;
}
else
p1=p1->next;
}
printf("\n");
printf(" 共找到%d条信息,按任意键返回。",n);
getchar();
}
link *delet(link *head)
{
print(head);
link *p1,*p2,*pp;
char absorb,identify;
int i,choose,n=0;
p1=p2=pp=head;
printf("\n");
printf(" 请选择要删除的内容所在行的序号:");
scanf("%d",&choose);
scanf("%c",&absorb);
while(p1!=NULL) //计算链表中的记录数目
{ n++;
p1=p1->next;
}
p1=head;
while(choose<0||choose>n)
{ printf(" 查无此内容,请确认后重新输入:");
scanf("%d",&choose);
scanf("%c",&absorb);
}
printf(" 确认要删除吗?(Y/N)");
scanf("%c",&identify);
while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
{ printf(" 请输入(Y/N):");
scanf("%c",&identify);
}
if(identify=='y'||identify=='Y')
{ if(choose==1)
{ p1=p1->next;
head=p1;
free(pp); //释放删除结点所占内存
}
else
{ for(i=1;i<choose;i++)
{
p2=p1;
p1=p1->next;
}
p2->next=p1->next;
free(p1); ////释放删除结点所占内存
}
printf(" 已成功删除,按任意键返回。");
getchar();
}
return (head);
}
void saves(link *p) //将原文件中内容清空,将链表中的内容存入文件
{ FILE *fp;
if((fp=fopen("tongxunlu","w"))==NULL)
{ printf(" 无法打开文件~~~\n");
exit(0);
}
while(p!=NULL)
{ fwrite(p,LEN,1,fp);
p=p->next;
}
fclose(fp);
}
使用DEV编译~~~
页:
[1]
