c语言大作业 通讯录
BY CJ
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>
struct person{
char name[100];//姓名
char num[100];//电话
char qq[100];//QQ号
char C[20];//是否为常用联系人
struct person *next;//指针
};
struct person *file_load(void);//1.读取原文件内容
void interface(void); //2.界面函数
struct person *file_new_build(struct person *head); //3.新建联系人
struct person *file_search(struct person *head);//4.查询 (返回一个指针) 用于其他功能
struct person* file_modification(struct person *head);//5.修改
struct person* file_delete(struct person *head);//6.删除
void file_printall(struct person*head);//7.打印所有人
void file_print(struct person*head);//8.导出常用联系人
void file_save(struct person*head);//9.在一系列操作后存储数据
void file_sort(struct person*head);//10.排序
struct person *file_search1(struct person *head);//4.5 查询用____main函数中的查询
main (void){
system("color F0");//调节界面,F0 白底黑字
int f;//代表8个功能的号码
FILE *fp,*fp1;
struct person *head=NULL;//创建头指针
if((fp=fopen("通讯录","r"))==NULL){//打开通讯录,没有的话就创建一个
if((fp=fopen("通讯录","w"))==NULL){
printf("无法创建通讯录"); //检验
exit (0);
}
fclose(fp);
}
head=file_load();//load读取通讯录文件中的内容
while(1){
interface();
scanf("%d",&f);
switch(f){
case 1:head=file_new_build(head);break;
case 2:file_search1(head);break;
case 3:head=file_modification(head);break;
case 4:head=file_delete(head);break;
case 5:file_printall(head);break;
case 6:file_print(head);break;
case 7:file_save(head);break;
case 8:exit(0);break;
case 9:file_sort(head);break;
default :printf("Enter error!!");getchar();
}
printf("\n请按ENTER返回菜单");
getchar();
fflush(stdin);
printf("\a");//按键声
system("CLS");
}
}
struct person *file_load(void){//1.载入先前通讯录的数据
FILE *fp;
char c; //读入数据库(通讯录)里的内容,下次开机时仍可用
struct person *head=NULL,*p=NULL,*q=NULL;
int i;
fp=fopen("通讯录","r");
for(i=1;(c=fgetc(fp))!=-1;i++)
{
fseek(fp,-1,SEEK_CUR);
p=(struct person*)malloc(sizeof(struct person));
fscanf(fp,"%s%s%s",p->name,p->num,p->qq);//读入数据
fscanf(fp,"%s\n",p->C);
if(i==1)
{head=p;q=p;}//一边读入一边创造链表
else
{q->next=p;q=p;}
}
if(p==NULL)
{head=NULL;fclose(fp);return(head);}
q->next=NULL;
fclose(fp);
return(head);
}
void interface(void){//2.界面
printf("\t\t\t通讯录( ̄~ ̄)\n");
printf("========================================================");
printf("\n\t\t选择你需要操作的功能:\n\n");
printf("\t\t\t1)新建联系人\n");
printf("\t\t\t2)查询\n");
printf("\t\t\t3)修改\n");
printf("\t\t\t4)删除\n");
printf("\t\t\t5)浏览\n");
printf("\t\t\t6)导出常用联系人\n");
printf("\t\t\t7)存储本次的所有操作\n");
printf("\t\t\t8)不保存直接退出\n");
printf("\t\t\t9)排序");
printf("\n********************************************************");
printf("\n选择你要进行的操作号码:");
}
struct person* file_new_build(struct person *head){//3.新建联系人(在输入时就已经排过序了)
struct person *p,*q,*f;
p=head;
q=head;
f=(struct person*)malloc(sizeof(struct person));
system("CLS");//清屏操作,从主界面到副界面
printf("\t\t你可以在此处新建联系人\n");
printf("=======================================================\n");
getchar();
printf("输入姓名:");
gets(f->name);
printf("输入手机号:");
scanf("%s",f->num);
printf("输入QQ号:");
scanf("%s",f->qq);
printf("是否为常用联系人 是输入CONSTANT 否输入NO:");
while(1){//输入常用联系人
scanf("%s",f->C);
if(strcmp(f->C,"CONSTANT")==0||strcmp(f->C,"NO")==0) break;
else printf("请重输");
}
if(head==NULL){//开头,按首字母排序,添加位置
head=f;f->next=NULL;
}
else{
while(strcmp(p->name,f->name)<=0&&p->next!=NULL){
q=p;
p=p->next;
}
if(strcmp(p->name,f->name)>0){//中间
q->next=f;
f->next=p;
}
else{//结尾
p->next=f;
f->next=NULL;
}
}
printf("添加成功<( ̄︶ ̄)>");
printf("\n********************************************************");
getchar();
return (head);
}
struct person* file_search(struct person *head){//4.查询
char name[100];//姓名
char num[100];//电话
char qq[100];//QQ号
char C[20]; //常用
int i,j;//功能
system("CLS");
struct person *p,*t;
p=head;
while(1){//while(switch)用了goto跳出,否则无法跳出,可以一直循环直到用户输入合法数据
printf("单一条件查询请按1 组合条件查询请按2:_\b");
scanf("%d",&i);
if(i==1)break;
if(i==2)break;
}
if(i==1){
printf("\n单一条件请选择1.姓名 2.电话 3.qq\n");
while(1){
scanf("%d",&i);
switch(i){
case 1:{
printf("\n输入姓名:");
scanf("%s",name);
while(p!=NULL){
if(strcmp(p->name,name)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************\n");
getchar();
return(p);
}
p=p->next;
}
if(j==0) {printf("未找到此联系人");goto add;}
}
case 2:{
printf("\n输入电话:");
scanf("%s",num);
while(p!=NULL){
if(strcmp(p->num,num)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
case 3:{
printf("\n输入QQ:");
scanf("%s",qq);
while(p!=NULL){
if(strcmp(p->qq ,qq)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
default:printf("enter error\n");
}
}
}
if(i==2){
printf("\n输入姓名");scanf("%s",name);
printf("\n输入电话");scanf("%s",num);
while(p!=NULL){
if(strcmp(p->name,name)==0&&strcmp(p->num,num)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
add:printf("\n********************************************************");//结束跳出的goto
getchar();
return (NULL);
}
struct person *file_modification(struct person *head){//5.修改
system("CLS");
struct person *t;
t=file_search(head);
if(t==NULL){
goto add;
}
printf("若要修改重名联系人的信息 ,请使用组合查询\n");
printf("========================================================");
printf("\n请问要修改什么信息 名字 电话 qq 是否常用\n");
printf("\n%s---->",t->name);
scanf("%s",t->name);
printf("\n%s---->",t->num);
scanf("%s",t->num);
printf("\n%s---->",t->qq);
scanf("%s",t->qq);
while(1){//输入常用联系人
printf("\n%s---->",t->C);
scanf("%s",t->C);
if(strcmp(t->C,"CONSTANT")==0||strcmp(t->C,"NO")==0) goto add;
else printf("请重输");}
add:
printf("\n<( ̄︶ ̄)>修改成功********************************************************");
getchar();
return(head);
}
void file_sort(struct person*head){//10.排序
system("CLS");
struct person *p1,*p2,temp;
p2=head;
if(head==NULL){
printf("不需要排序\n");
return;
}
if(p2->next==NULL){
printf("不需要排序\n");
return;
}
while(p2->next!=NULL)//冒泡排序
{
p1=p2->next;
while(p1!=NULL){
if((strcmp(p1->name,p2->name))<0){
temp=*p2;//先换所有内容
*p2=*p1;
*p1=temp;
temp.next=p2->next;//指针不变
p2->next=p1->next;
p1->next=temp.next;
}p1=p1->next;
}p2=p2->next;
}
getchar();
printf("\n<( ̄︶ ̄)>排序成功");
}
struct person* file_delete(struct person *head){//6.删除
system("CLS");
struct person *p,*q;
p=file_search(head);//返回指针
q=head;
if(p==head){head=p->next;free(p);return (head);}
while(1){
if(q->next==p)break;
q=q->next;
}
q->next=p->next;
free(p);
getchar();
return (head);
}
void file_printall(struct person *head){//7.打印全部,浏览
system("CLS");
struct person *p;
p=head;
while(1){
printf("================================================\n");
printf("\t\t姓名:%s\n\t\t电话:%s\n\t\tqq:%s\n\t\t是否常用:%s\n",p->name,p->num,p->qq,p->C);
p=p->next;
if(p==NULL) break;
}
printf("\n<( ̄︶ ̄)>打印成功");
getchar();
}
void file_print(struct person *head){//8.导出部分,创造一个新文件
system("CLS");
FILE *fp;
struct person *p;
p=head;
fp=fopen("常用联系人.txt","w");
fprintf(fp,"=========================常用联系人<( ̄︶ ̄)>===========================");
while(p!=NULL){
if(strcmp(p->C,"CONSTANT")==0){
fprintf(fp,"========================================================\n");
fprintf(fp,"姓名%s\n",p->name);
fprintf(fp,"电话:%s\n",p->num);
fprintf(fp,"qq:%s\n",p->qq);}
p=p->next;
}
printf("\n<( ̄︶ ̄)>导出成功********************************************************");
getchar();
}
void file_save(struct person *head){//9.储存这次的所有操作,可以将链表save进通讯录
system("CLS");
struct person *p;
FILE *fp;
fp=fopen("通讯录","w");
p=head;
while(1)
{
fprintf(fp,"\n%s %s %s %s\n",p->name,p->num,p->qq,p->C);
p=p->next;
if(p==NULL)break;}
fclose(fp);
printf("\n\n存储成功<( ̄︶ ̄)>(当前目录下 通讯录.txt)");
printf("PRESS ANY KEY TO EXIT.\n\n");
getchar();
exit(1);
}
struct person* file_search1(struct person *head){//4.5查询
char name[100];//姓名
char num[100];//电话
char qq[100];//QQ号
char C[20]; //常用
int i,j;//功能
system("CLS");
struct person *p,*t;
p=head;
while(1){
printf("单一条件查询请按1 组合条件查询请按2:_\b");
scanf("%d",&i);
if(i==1)break;
if(i==2)break;
}
if(i==1){
printf("\n单一条件请选择1.姓名 2.电话 3.qq\n");
while(1){
scanf("%d",&i);
switch(i){
case 1:{
printf("\n输入姓名:");
scanf("%s",name);
while(p!=NULL){
if(strcmp(p->name,name)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************\n");
}
p=p->next;
}
if(j==0) {printf("未找到此联系人");goto add;}
getchar();
return(p);
}
case 2:{
printf("\n输入电话:");
scanf("%s",num);
while(p!=NULL){
if(strcmp(p->num,num)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
case 3:{
printf("\n输入QQ:");
scanf("%s",qq);
while(p!=NULL){
if(strcmp(p->qq ,qq)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
default:printf("enter error\n");
}
}
}
if(i==2){
printf("\n输入姓名");scanf("%s",name);
printf("\n输入电话");scanf("%s",num);
while(p!=NULL){
if(strcmp(p->name,name)==0&&strcmp(p->num,num)==0){
printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
printf("\n********************************************************");
getchar();
return(p);
}
p=p->next;
}
if(j==0) printf("未找到此联系人");
goto add;
}
add:printf("\n********************************************************");
getchar();
return (NULL);
}
因为之前看到网上的通讯录功能不是很全,所以大作业写完后就发出来了,如果有什么可改进的东西,欢迎交流@ustc @1235(之前发现了一些小错误,又修改了一下)