通讯录——c语言程序
luyued 发布于 2011-05-25 08:16 浏览 N 次/************************************************* ************************/
/*************************** 通讯录 ************************************/
/************************************************* ************************/
//头文件
#include
#include
#include
#include
//定义结构体
typedef struct student
{ char phonenum[15],name[20],add[35];} elemtype;
//定义结点
struct node
{elemtype data; node * next;};
//定义整体变量
char PRINT='0',MOD='0',DESE='0',SEARCH='0',C;
//PRINT=='Y'表示显示所有时的标志,作为控制空格之用
//MOD=='J'表示用卷页模式
//MOD=='G'表示用滚条模式
//SEARCH=='N'表示在通讯录中没找到相应的信息
//DESE=='D'表示使用删除功能时要输出的提示语
//DESE=='S'表示使用查询功能时要输出的提示语
//子函数
void beginmenu();//开始菜单
void modmenu();//模式选择
void importmenu();//菜单--导入文件
void readfromfile();//文件导入
void createsl();//产生一个单链表
void mainmenu();//主菜单选择
void showall();//输出单链表
void searchmemu();//查询菜单
node* searchnum();//按序号查询
node* searchbynpa();//按名字、电话号码、地址查询
void deletemenu();//删除菜单
void deletebynpan();//按名字、电话号码、地址、序号删除
void deleteall();//删除所有信息
void insertmenu();//插入菜单----插入一条信息(按序号插入)
void listmenu();//排序菜单
void savemenu();//菜单--保存到文件
void writetofile();//写入文件
void exitmenu();//退出菜单选择
//输入数据元素
void pread(elemtype *x)
{ printf("\t请输入学生的 姓名 电话号码 地址: ");
scanf("%s%s%s",x->name,x->phonenum,x->add);
fflush(stdin);
};
//输出数据元素
void pwrite(elemtype *x)
{if(PRINT!='Y')printf("\t\t");
printf("%-15s%-20s%-35s\n",x->name,x->phonenum,x->add );}
//计算通讯录中的信息条数
int count(node *h)
{int i=0; node *p=h;
while(p->next!=NULL){ p=p->next; i++; }
return(i);
}
//实现在卷页模式的第一行都输出"卷页模式"
void write()
{ if(MOD=='J')
{system("cls"); printf("*******************************");
printf("**** 卷页模式 *********************************\n\n");
}
}
//错误提示
void error()
{printf("\n\n\t\t ----------");getch();}
//获取输入字符,并输出非回车字符,与getch()类似,这样定义之后在函数中就无需定义字符
void get_C()
{C=getch(); if(C!=13)putchar(C);}
/**************************创建与输出******************************/
//单链表的产生
void createsl(node **h)
{node *p,*s;
elemtype x;
*h=(node*)malloc(sizeof(node));
(*h)->next=NULL;
system("cls");
printf("\t********************< 现在开始创建通讯录 >********************\n\n");
C='Y';
while(C=='y'||C=='Y')
{ pread(&x);
s=(node*)malloc(sizeof(node));
s->data=x;
if((*h)->next==NULL) (*h)->next=s;
else p->next=s;
p=s;
while(1)
{printf("\n\t是否继续 Y/N : "); get_C();
if(C=='Y'||C=='y'||C=='N'||C=='n') {printf("\n\n");break;}
else {error();printf("\n");continue;}
}
}
p->next=NULL;
printf("\t按任意键进入模式选择");getch();
}
//单链表的输出
void showall(node **h)
{node *p;int i=0;p=*h;
if(p->next==NULL||p==NULL) {printf("\t该通讯录为空!!!\n");return;}
printf("\n\t*************************** 通讯录 **************************\n\n");
printf("\t序号 姓名 电话号码 地址\n\n");
while(p->next!=NULL)
{PRINT='Y';printf("%10d\t",i+1);pwrite(&p->next->dat a);i++;p=p->next;}
printf("\t**************************************** ***********************");
printf("\n\n\t共%d条信息\n",i);
PRINT='N';
}
/*************************** 文件的导入与输出 **************************/
//从文件导入
void readfromfile(node **h)
{ FILE *fp;int i=0;
if((fp=fopen("TXL.txt","r"))==NULL)
{ printf("\n\n\t\t通讯录文件不存在");
if((fp=fopen("TXL.txt","w"))==NULL)
{printf("\n\n\t\t建立失败");exit(0);}
else
{printf("\n\n\t\t通讯录文件已建立");
printf("\n\n\t\t按任意键开始创建通讯录");
getch();
*h=NULL;
return;
}
}
fseek(fp,0,2);/*文件位置指针移动到文件末尾*/
if (ftell(fp)>0) /*文件不为空*/
{ node *p,*k; elemtype x;
rewind(fp);
fscanf(fp,"%s%s%s\n",x.name,x.phonenum,x.add);
*h=(node*)malloc(sizeof(node));
k=(node*)malloc(sizeof(node));
*h=k;
while(!feof(fp))
{p=(node*)malloc(sizeof(node));
fscanf(fp,"%s%s%s\n",p->data.name,p->data.phonenum,p ->data.add);
k->next=p;
k=p;
p->next=NULL;
p=p->next;
}
printf("\n\n\t\t文件导入成功");
printf("\n\n\t\t按任意键进入模式选择");
getch();
return;
}
printf("\n\n\t\t文件导入成功");
printf("\n\n\t\t通讯录文件中无任何纪录");
printf("\n\n\t\t按任意键开始创建通讯录");
*h=NULL;
fclose(fp);
getch();
return;
}
//保存到文件
void writetofile(node*h)
{ node *p=h->next;
FILE *fp=fopen("TXL.txt","w");
if(fp==NULL) printf("\n\t\t文件打开失败");
fprintf(fp,"姓名\t\t 电话号码\t\t地址\n\n");
while (p!=NULL)
{fprintf(fp,"%-20s%-20s%-20s\n",p->data.name,p->data .phonenum,p->data.add);
p=p->next;}
fclose(fp);
printf("\n\n\t\t通讯录文件已保存\n");
}
//菜单--从文件导入
void importmenu(node**h)
{ system("cls");
printf("\n\n\n\n\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★");
printf("\n\n\t\t是否导入已有文件 TXL.txt --Y/N -- ");
printf("\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★\n\n\t\t\t\t ");
get_C();
if(C=='y'||C=='Y'){readfromfile(h);if(*h==NULL)cre atesl(h);}
else if(C=='n'||C=='N') createsl(h);
else {error();importmenu(h);}
}
//菜单--保存到文件
void savemenu(node *h)
{printf("\n\t\t是否保存到文件TXL.txt --Y/N -- "); get_C();
if(C=='y'||C=='Y') writetofile(h);
else if(C=='n'||C=='N') printf("\n\n\t\t文件未保存!!!\n");
else {error();printf("\n");savemenu(h);}
}
/******************************退出菜单**************************/
void exitmenu(node *h)
{printf("\n\n\t\t确定退出!!! --Y/N-- "); get_C();
if(C=='y'||C=='Y') {printf("\n\t\t");savemenu(h);printf("\n\t\t");exi t(0);}
else if(C=='n'||C=='N') printf("\n");
else {error();exitmenu(h);}
}
/************************************** 修改 ****************************************/
void modify(node *p)
{SIGN1:printf("\n\t是否修改信息内容 --Y/N-- "); get_C();
if(C=='n'||C=='N') {putch('\n');return;}
else if(C=='y'||C=='Y')
{if(MOD=='J') system("cls");
printf("\n\n\t\t******************* 修改 *********************");
printf("\n\t\t********* 1--修改名字 2--修改电话号码 ******");
printf("\n\t\t********* 3--修改地址 4--退出修改 ******");
printf("\n\t\t************************************ ************\n\t请选择:");
get_C();printf("\n\n\t请输入:");
switch(C)
{case '1':scanf("%s",p->data.name);break;
case '2':scanf("%s",p->data.phonenum);break;
case '3':scanf("%s",p->data.add);break;
case '4':printf("\n\t\t");return;
default:{error();modify(p);break;}
}
}
else {error();putch('\n\n');goto SIGN1;}
}
/****************************查询功能*****************************/
//单链表的查找与输出(按序号)
node * searchbynum(node *h)
{ node *p; int i,j;
while(1)
{p=h;
printf("\n\t请输入信息序号(只允许输入数字) i :");
scanf("%d",&i);
for(j=1;jnext!=NULL;j++) p=p->next;
if(p->next!=NULL&&i>0) break;
else
{ while(1)
{printf("\n\t输入的位置 i 不合理,是否继续选择位置 --Y/N-- ");get_C();
if(C=='y'||C=='Y') {printf("\n");break;}
else if(C=='n'||C=='N') {SEARCH='N';printf("\n");return(NULL);}
else {error();printf("\n");}
}
}
}
if(DESE=='D') return(p);
printf("\n\t你要查找的学生信息为:\n");
printf("\n\t\t姓名 电话号码 地址\n\n");
pwrite(&p->next->data);
modify(p->next);
}
//单链表的查找与输出(按名字、电话号码、地址)
node* searchbynpa(node *h,char c)
{ node *p=h;// p 指向查到信息的前一条信息
char data[35]; int i=1;
printf("\n\t请输入: ");
scanf("%s",data);fflush(stdin);
while(p->next!=NULL&&i!=0)
{ switch(c)
{case '1':i=strcmp(data,p->next->data.name);break;
case '2':i=strcmp(data,p->next->data.phonenum);break;
case '3':i=strcmp(data,p->next->data.add);break;
}
if(i!=0) p=p->next;
}
if(p->next==NULL){printf("\n\t在通讯录中查无此信息!!!\n");SEARCH='N';return(p);}
switch(DESE)
{case 'S': printf("\n\t你要查找的学生信息为:\n");
printf("\n\t\t姓名 电话号码 地址\n\n");
pwrite(&p->next->data);modify(p->next);
return(NULL);break;
case 'D': return(p);
}
}
//查询菜单
void searchmenu(node *h)
{DESE='S';
if(h->next==NULL)
{printf("\n\n\n\t\t通讯录为空!!!");getch();printf("\n\t\t");return;}
printf("\n\n\t\t******************* 查询 *********************");
printf("\n\t\t******* 1-- 按名字查询 2-- 按电话号码查询 *****");
printf("\n\t\t******* 3-- 按地址查询 4-- 按序号查询 *****");
printf("\n\t\t******* 5-- 退出查询 *****");
printf("\n\t\t************************************ ************\n\t请选择:");
get_C();printf("\n");
switch(C)
{case '1':
case '2':
case '3':searchbynpa(h,C);break;
case '4':searchbynum(h);break;
case '5':printf("\n\t\t");return;
default :error();write();searchmenu(h);break;
}
DESE='0';
}
/************************** 删除功能 ********************************/
//按名字、电话号码、地址、序号删除
void deletebynpan(node *h,char c)
{ node *s,*p;
if(c=='4') p=searchbynum(h);
else p=searchbynpa(h,C);
if(p->next!=NULL) {s=p->next;p->next=s->next;free(s);}
}
//删除全部
void deleteall(node *h)
{node *p=h, *q;
printf("\n\n\t要全部删除吗:--Y/N-- "); get_C();
if(C=='y'||C=='Y')
{while (p->next!=NULL){q=p->next;p->next=q->next;free(q);}
printf("\n\n\t通讯录中的信息已全部删除!!!\n");
}
else if(C=='n'||C=='N') {putchar('\n');return;}
else {error();deleteall(h);}
}
//删除菜单
void deletemenu(node *h)
{DESE='D';SEARCH='0';
if(h->next==NULL) {printf("\n\n\n\t通讯录为空!!!");getch();printf("\n\t\t");return;}
printf("\n\n\t\t******************* 删除 *********************");
printf("\n\t\t********* 1--按名字删除 2--按电话号码删除 *****");
printf("\n\t\t********* 3--按地址删除 4--按序号删除 *****");
printf("\n\t\t********* 5--全部删除 6--退出删除 *****");
printf("\n\t\t************************************ ************\n\t请选择:");
get_C();
if(MOD=='J'&&(C=='1'||C=='2'||C=='3'||C=='4'))
{printf("\n\n\t按任意键进入");getch();
system("cls");printf("\n\t删除前的通讯录为:\n");showall(&h);}
switch(C)
{case '1':
case '2':
case '3':
case '4':deletebynpan(h,C);break;
case '5':deleteall(h);break;
case '6':printf("\n\t\t");return;
default:{error();write();deletemenu(h);break;}
}DESE='0';
if(SEARCH!='N'&&(C=='1'||C=='2'||C=='3'||C=='4'))
{if(h==NULL||h->next==NULL) {printf("\n\t删除后的通讯录为空\n");return;}
else {if(MOD=='J') system("cls");
printf("\n\t删除后的通讯录为:\n");
showall(&h);
}
}
}
/************************* 插入功能(按顺序) ***************************/
void insertmenu(node *h)
{elemtype x; node *p,*t;
if(C=='4')printf("\t※※※※※※※※※※※※※※※ 插入 ※※※※※※※※※※※※※※\n\n\n");
printf("\n\t输入你要添加的信息的内容:\n\n");
pread(&x);
DESE='D';
p=searchbynum(h);
if(p==NULL)return;
t=(node*)malloc(sizeof (node));
t->data=x;
t->next=p->next;
p->next=t;
while(1)
{ printf("\n\t是否继续添加--Y/N-- "); get_C();
if(C=='n'||C=='N')
{write();printf("\n\n\t修改后的通讯录为:\n");showall(&h);return;}
else if(C=='y'||C=='Y') {printf("\n");insertmenu(h);}
else {error();printf("\n");}
}
}
/****************************** 排序功能 *******************************/
void listmenu(node *h)
{node *p,*t,*s;int n;int k;
printf("\t\t******************* 排序 *********************");
printf("\n\t\t********* 1--按名字排序 2--按电话号码排序 *****");
printf("\n\t\t********* 3--按地址排序 4--退出排序 *****");
printf("\n\t\t************************************ ************\n\t请选择:");
get_C();
if(C=='1'||C=='2'||C=='3')
{if(MOD=='J') {MOD='0';system("cls");}//改下模式这样才能显示排序前的通讯录
printf("\n\n\t排序前的通讯录为:\n");showall(&h);
n=count(h);
for(int i=1;i {p=h; for(int j=1;j<=n-i;j++) {s=p->next; t=p->next->next; switch(C) {case '1':k=strcmp(s->data.name,t->data.name);break; case '2':k=strcmp(s->data.phonenum,t->data.phonenum);brea k; case '3':k=strcmp(s->data.add,t->data.add);break; } if(k==1){s->next=t->next;p->next=t;t->next=s;} p=p->next; } } printf("\n\n\t排序后的通讯录为:\n");showall(&h); if(MOD=='0') MOD='J';//将模式改正过来 } else if(C=='4'){printf("\n\t\t");return;} else{error();listmenu(h);} } /******************************** 模式选择 ************************/ void modmenu() { system("cls"); printf("\n\n\n\n\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★"); printf("\n\n\t\t选择浏览模式: G--滚条 J--卷页 "); printf("\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★\n\n\t\t\t\t "); get_C(); if(C=='G'||C=='g') {MOD='G';system("cls");} else if(C=='j'||C=='J') MOD='J'; else{error();modmenu();} } /********************************主菜单***********************************/ void mainmenu(node *h) { while(1) {write(); printf("\n\n\t\t******************* 主菜单 *******************"); printf("\n\t\t********** 1-- 显示 2-- 查询 **********"); printf("\n\t\t********** 3-- 删除 4-- 插入 **********"); printf("\n\t\t********** 5-- 排序 6-- 保存 **********"); printf("\n\t\t********** 7-- 返回 8-- 退出 **********"); printf("\n\t\t************************************ ************"); printf("\n\t请选择:"); get_C(); char c=C; if(MOD=='J') printf("\n"); if(h->next==NULL&&(C=='1'||C=='2'||C=='3'||C=='5')) {printf("\n\n\n\n\t\t该通讯录为空,只有'插入'功能能用,按任意键返回!!!"); getch(); mainmenu(h); } printf("\n"); if(C>='1'&&C<='5')write(); switch(C) {case '1': showall(&h);break; case '2': searchmenu(h);break; case '3': deletemenu(h);break; case '4': insertmenu(h);break; case '5': listmenu(h);break; case '6': savemenu(h);break; case '7': modmenu();break; case '8': exitmenu(h);break; default : printf("\n\t输入错误!!!\n");break; } if(c!='7'){printf("\n\t按任意键进入主菜单: --- ");getch();} } } /***************************** 开始界面 ****************************/ void beginmenu() { printf("\n\n\n\n\n\n\t\t★☆●◎★☆●◎★☆●◎★☆●◎★☆●◎★☆\n\n\t\t\t "); printf("欢迎使用 HNN 版通讯录"); printf("\n\n\t\t★☆●◎★☆●◎★☆●◎★☆●◎★☆●◎★☆\n\n\n\n\t\t\t\t"); getch();//按任意键进入 } /*****************************主函数*********************************/ void main() { node *h; beginmenu();//开始菜单 importmenu(&h);//菜单--导入文件 modmenu();//模式选择菜单 mainmenu(h);//主菜单 } /******************************结束*********************************/
- 06-13· 2如何做大音响改装可以看
- 06-13· 汽车音响改装"航母"非常城
- 06-13· 见证历史 非常城市一路辉
- 06-13· 汽车非常城市音响
- 06-05· ECOPIA环保卡车驶向武汉普
- 06-05· 普利司通轮胎店
- 06-05· 潍坊普利司通电动车自行
- 06-05· 绿歌伴节油轮胎----普利司
- 06-05· 普利司通将在印建轮胎生
- 06-05· [转载]普利司通轮胎一个月
- 06-05· 【汽车殿堂】普利司通、
- 06-03· 撒拉尔乌鲁赫苏兹
- 06-02· ATOS常规阀-ATOS意大利阿托
- 06-01· 供应意大利阿托斯ATOS压力
- 05-30· 净霸-鲜水机的六大特点
- 05-30· 广东太阳神/美国艾欧史密
- 05-30· 太阳神净霸鲜水机上市 抢
- 05-30· 净霸-鲜水机Ⅱ型即将隆重
- 05-30· 喜讯:净霸—鲜水机Ⅱ型即
- 05-30· 喜讯:净霸—鲜水机Ⅱ型今