通讯录源代码详解
通讯录源代码

#include<stdio.h>#include<string.h> //字符串处理//#include<conio.h>#define MY1 printf("\n姓名地址邮政编码电话\t")#define MY2 printf("\n%s %4s %s %s\n",s[i].name,s[i].address,s[i].code,s[i] .tel)#define MAX 20int i;int sum;/*时间结构体类型*/struct s_message{char name[20];char address[50];char code[15];char tel[15];}s[MAX];/*保存通讯录信息*/void save_message(int sum){int i;FILE *fp; //声明fp是指针,用来指向FILE类型的对象//if((fp=fopen("D:\\s.txt","wb"))==NULL){printf("文件有误!\n");return;}for (i=0;i<sum;i++){if(fwrite(&s[i],sizeof(struct s_message),1,fp)!=1) //fwite写一个数据块//printf("writing file is wrong!\n");}fclose(fp);}/*读取通讯录信息*/int read_message(){FILE *fp;int i=0;if((fp=fopen("D:\\s.txt","rb"))==NULL){printf("\n\n***********暂时无任何库存信息,按回车键进入主菜单选择基本信息的录入!***********\n");return 0;}while(feof(fp)==0) /*feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0。
用c语言编写一个通讯录代码详解

⽤c语⾔编写⼀个通讯录代码详解⽬录实现通讯录的思路如下:总结实现通讯录的思路如下:1.程序运⾏起来时⽤户⾸先要看到菜单栏选项并且对应菜单栏所给出的选项做出选择,这⾥我们简单设计⼀个Menu()函数可以让⽤户看见可选项⽬;2.⽤户可选的范围应该是1~7,为了避免⽤户做出超出范围的选择我们可以⽤switch语句来判断⽤户的选择若⽤户输⼊的数字⾮法还可以让⽤户继续选择,⽽继续选择这个动作需要⽤到while语句,⽤户对通讯录的不断操作也需要⽤到while语句;3.⽤户选择不同的选项,程序就要调⽤对应的函数来实现其功能并且我们对switch语句进⾏优化,如果直接对输⼊的数字进⾏判断的话我们还需要对照直接设计的菜单栏选项对捕捉到的⽤户选择做出判断需要不是参考菜单栏,为了解决这个问题,我们⽤枚举的⽅法来提⾼代码的可读性;enum menu{ADD = 1,SHOW,MODIFIES,FIND,DELETE,SORT,EXITS,};4.接下来我们对通讯录的功能⼀⼀实现,不难想到要对通讯录中的联系⼈信息进⾏操作就必须要有存放联系⼈信息的载体,⽽每个联系⼈信息则⼜包含姓名,年龄,性别,电话号码,地址这些信息,所以我们⾸先⾃定义⼀个message类型,然后创建⼀个message数组来存放联系⼈信息,数组的⼤⼩由我们⾃⾏设定最好⽤#define来设定num的⼤⼩可以做到⼀改全改。
#define num 100typedef struct s{int age;char name[10];char number[20];char sex[5];char adress[20];}message;5.添加联系⼈功能:要想添加联系⼈就得对保存所有联系⼈信息的数组进⾏操作并且还要知道把新建的联系⼈信息存⼊数组的第⼏个元素中,所以这个AddMessage函数应该接收这两个参数,考虑到要统计通讯录中联系⼈的个数并且在添加联系⼈成功后该个数应该++,所以在创建联系⼈数组的同时应该同时定义⼀个变量来告诉⼀些功能函数通讯录中联系⼈的个数并且在addMessage这个函数中还需要对这个变量的值进⾏+1操作所以我们应该向这个函数传⼊该变量的地址达到修改变量值的⽬的。
C语言课程设计——通讯录软件源代码(完美版)

C语言课程设计——通讯录软件源代码(完美版)通讯录完美版操作说明书编译环境:Visual C++ 6.0初始密码为:111111主菜单:选择编号进行相应的操作:选择“1”:输入编号:如“001”。
通讯录数据结构如下,只要输入的数据不超过允许的范围即可:struct callmember //定义数据结构{char code[8]; // 编号char name[20]; // 姓名char callnumber[16]; // 电话号码char address[30]; // 地址};输入完后“Enter”结束。
然后又回到“main menu”。
选择“2”显示通讯录信息,但此时刚输入的信息还没保存,选择“3”就可以将联系人信息保存在“通讯录.txt”文件中了,这个文件是自动生成的不需自己建立。
除此外还有查询、修改、删除功能。
当然功能有限,望有能之士加以修改,完善内容~本软件是一个值得收藏的软件,可以用于管理自己的通讯录~源程序:/***************************C语言课程设计*****************************//******************************************************************* **//******************************************************************* **//******************************************************************* **//***** 项目名称: 通讯录管理系统 *****/ /***** 作者: *****/ /*****专业: ***** *****/ /***** 班级: ***** *****/ /***** 学号: ********* *****//***** 指导老师: *****/ /***** 完成时间: 2010.7.12 *****/ /***** 联系电话: 150*******3 *****/ /***** 初始密码: 111111 *****//*********************************************************************/ /******************************************************************* **//******************************************************************* **//************************预处理***************************************/ #include<string.h> #include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#define N 301 //修改N的值,就可以改变记录个数,实际容纳人数为N-1 struct callmember //定义数据结构{char code[8]; // 编号char name[20]; // 姓名char callnumber[16]; // 电话号码char address[30]; // 地址};/***********************定义全局变量**********************************/FILE * fp; //文件指针struct callmember person[N]; //记录信息,N为通信录容量,有用信息为后N-1条int counter; //统计记录个数(联系人个数)/***********************函数声明*************************************/void creat(); //创建通讯录 OKvoid load(); //加载数据 OKvoid menu(); //界面菜单显示 OKvoid choose_1(int ); //选择功能 OKvoid insert(); //1、通讯信息的录入 OKvoid output(); //2、通讯信息的显示 OKvoid save(); //3、通讯信息的保存 OKvoid del(); //4、记录的删除 OKvoid modify(); //5、记录的修改 OKvoid found(); //6、记录的查找,三种方式 OKvoid choose_2(int ); //选择查询方式 OKvoid found_code(); //6.1、按编号查询 OK void found_name(); //6.2、按姓名查询 OK void found_callnumber(); //6.3、按电话号码查询 OK voidquit(); //7、退出系统 OK /********************** MAIN 函数***********************************/int main(){char m;char mima[10];char jiema[10];/*************密码文件的创建*****************/if((fp=fopen("mi_ma.dat","rb"))==NULL) //rb 只读(打开){fp=fopen("mi_ma.dat","wb");//wb 为读写建立一个新的文件(如果文件不存在,建立新文件)fprintf(fp,"%s","111111");fclose(fp);}/*************密码的读入*********************/fp=fopen("mi_ma.dat","rb");fscanf(fp,"%s",jiema);fclose(fp);/*************界面设置***********************/system("color 2f"); //设置界面颜色system("cls"); //清屏printf("\n\n\n\n\n\n\n\n\n\n\t\t\t请输入您的密码: "); //输入九位以内的密码gets(mima);if(!strcmp(mima,jiema)){printf("\n\n\t\t\t是否想修改您的密码 (Y/N) : "); scanf("%c",&m);if(m=='y'||m=='Y'){fp=fopen("mi_ma.dat","wb");printf("\n\t\t\t请输入您的新密码: ");scanf("%s",jiema);fprintf(fp,"%s",jiema);fclose(fp);printf("\n\t\t\t密码修改成功!");getchar();getchar();}system("cls"); //清屏system("color 2f"); //设置界面颜色creat(); //为程序创建文件(如果文件不存在)fp=fopen("counter.txt","r"); //r 只读(打开文件)fscanf(fp,"%d",&counter); //将磁盘中的数据赋给counter fclose(fp); //关闭打开的文件load(); //数据装载到内存中menu();return 0;}else{printf("\n\n\t\t\t输入密码错误!");getchar();printf("\t\t\t");return 0;}}/************************创建通讯录函数****************************/ void creat(){if((fp=fopen("通讯录.txt","r"))==NULL)//r 只读(打开){fp=fopen("通讯录.txt","w");//w 为读写建立一个新的文件(如果文件不存在,建立新文件)fprintf(fp,"%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址"); //写入基本信息person[0]fclose(fp);}if((fp=fopen("counter.txt","r"))==NULL) //r 只读(打开){fp=fopen("counter.txt","w"); //w 为只写建立一个新的文件fprintf(fp,"%d",0); //写入初值(自有文件新建时才有)fclose(fp);}}void load(){int i;if((fp=fopen("通讯录.txt","r"))!=NULL) //r 只读(打开),打开文件成功for(i=0;i<=counter;i++)fscanf(fp,"%s%s%s%s",person[i].code,person[i].name,person[i].callnum ber,person[i].address);//将文件中的信息加载到内存中,供操作使用elseprintf("打开文件失败!\n");fclose(fp);}/************************界面菜单显示函数**************************/ void menu(){int k;printf("\n");printf("\n");printf("\t ********************************************\n");printf("\t ********** 设计者: ***********\n");printf("\t ********** 设计时间: 2010.7.13 ***********\n");printf("\t ********************************************\n\n");printf("\t ********************************************\n");printf("\t **************** MENU ********************\n");printf("\t ********************************************\n");printf("\t ********* 1、通讯信息的录入: *************\n");printf("\t ********* 2、通讯信息的显示: *************\n");printf("\t ********* 3、通讯信息的保存: *************\n");printf("\t ********* 4、通信记录的删除: *************\n");printf("\t ********* 5、通信记录的修改: *************\n");printf("\t ********* 6、通信记录的查找: *************\n");printf("\t ********* 0、退出系统: *************\n");printf("\t ********************************************\n");printf("\t Now Please Enter your choose(0-6): ");scanf("%d",&k);choose_1(k);}/************************函数功能选择函数************************/ void choose_1(int k){switch(k){case 1 : insert();break;case 2 : output();break;case 3 : save();system("cls");printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t 保存成功!");getchar();getchar();system("cls");menu();break;case 4 : del();break;case 5 : modify();break;case 6 : found();break;case 0 : quit();break;default: ;break;}}/****************************OK***********************************/ /************************通讯信息录入函数*************************/ /***************将数据写入内存中,由person[N]数组保存着***********/ void insert(){struct callmember * p;system("cls");p=(struct callmember *)malloc(sizeof(struct callmember ));//将动态分配的内存首地址赋给pprintf("\n\n\n\n\n\n");printf("\t *********************************\n\n");printf("\t 编号: ");scanf("%s",p->code);strcpy(person[counter+1].code,p->code);printf("\t 姓名: ");scanf("%s",p->name);strcpy(person[counter+1].name,p->name);printf("\t 电话: ");scanf("%s",p->callnumber);strcpy(person[counter+1].callnumber,p->callnumber);printf("\t 地址: ");scanf("%s",p->address);strcpy(person[counter+1].address,p->address);printf("\n\t *********************************");counter++;free(p); //释放空间getchar();getchar();system("cls");menu();}/************************通讯信息显示函数************************/ /************从内存中将数据显示在屏幕上,不用打开文件************/ void output(){int i=1;system("cls");if(counter){for(i=0;i<=counter;i++)printf("\t%-8s%-20s%-16s%-30s",person[i].code,person[i].name,person[i].callnumber,person[i].address);printf("\t");}elseprintf("\n\n\n\n\n\t\t记录为空,请输入联系人信息!");getchar();getchar();system("cls");menu();}/*************保存、修改、删除只针对内存中的数组进行操作*********/ /************************通讯信息保存函数************************/ void save() {int i;system("cls");if((fp=fopen("counter.txt","w"))==NULL) //w 只写覆盖原来的数据{printf("\n\n\n\t\t\t操作失败.");exit(1);}fprintf(fp,"%d",counter); //往磁盘写入现在的值,即保存fclose(fp);if((fp=fopen("通讯录.txt","w"))!=NULL)fprintf(fp,"%s","\0");fclose(fp);if((fp=fopen("通讯录.txt","a"))!=NULL)for(i=0;i<=counter;i++)fprintf(fp,"%-10s%-20s%-20s%-30s\n",person[i].code,person[i].name,person[i].callnumber,p erson[i].address);fclose(fp);system("cls");}/************************信息删除函数****************************/ void del() //根据姓名删除,根据显示选择要删的内容 {int k=1;int c=0;char m;char namekey[20];system("cls");printf("\n\n\n\n\n\n\t\t\t请输入要删除的姓名:");scanf("%s",namekey);while(k<=counter){if(!strcmp(namekey,person[k++].name)){c=k-1;break;}}if(c){printf("\t\t\t已查到,记录为:\n\n\n");printf("\t%-10s%-20s%-20s%-30s\n",person[0].code,person[0].name,person[0].callnumber,p erson[0].address);printf("\t%-10s%-20s%-20s%-30s\n",person[c].code,person[c].name,person[c].callnumber,pe rson[c].address);printf("\n\n\t\t\t确定要删除吗? (Y/N) : ");scanf("%s",&m);if(m=='y'||m=='Y'){if(c==counter){strcpy(person[counter].code,"\0");strcpy(person[counter].name,"\0");strcpy(person[counter].callnumber,"\0");strcpy(person[counter].address,"\0");counter--;}else{for(k=c;k<=counter;k++) //后面的信息将前面的信息覆盖掉{strcpy(person[k].code,person[k+1].code);strcpy(person[k].name,person[k+1].name);strcpy(person[k].callnumber,person[k+1].callnumber); strcpy(person[k].address,person[k+1].address);}strcpy(person[counter].code,"\0"); //最后面的信息为空strcpy(person[counter].name,"\0");strcpy(person[counter].callnumber,"\0");strcpy(person[counter].address,"\0");counter--;}printf("\t\t\t删除成功!");getchar();getchar();system("cls");save(); //用save()函数将删除后的信息从新保存menu();}else{system("cls");menu();}}else{printf("\n\t\t\t对不起,没有此人记录!");getchar();getchar();system("cls");menu();}}/************************信息修改函数****************************/ //可以设定编号唯一,通过查找编号来确定记录位置,进而进行修改 void modify(){int k=1;char m;char codekey[20];system("cls");printf("\n\n\t\t\t 请输入要修改的编号: ");scanf("%s",codekey);while(k<=counter){if(!strcmp(codekey,person[k].code))break;k++;}if(k<=counter){printf("\n\t\t\t 已查到,记录为:\n");printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s\n",person[k].code,person[k].name,person[k].callnumber, person[k].address);printf("\t\t\t 确定要修改吗? (Y/N) : ");scanf("%s",&m);if(m=='y'||m=='Y'){printf("\n\t\t\t 请输入新的信息:\n\n");printf("\t *********************************\n\n");printf("\t 编号: ");scanf("%s",person[k].code);printf("\t 姓名: ");scanf("%s",person[k].name);printf("\t 电话: ");scanf("%s",person[k].callnumber);printf("\t 地址: ");scanf("%s",person[k].address);printf("\n\t *********************************"); printf("\n\n\t\t\t 修改成功!");getchar();getchar();system("cls");save(); //修改完后立马保存menu();}else{system("cls");menu();}}else{printf("\n\n\t\t\t对不起,没有此人记录!");getchar();getchar();system("cls");menu();}}/************************信息查询函数****************************/ void found() //调试合适{int k;system("cls");printf("\n");printf("\n");printf("\n\t\t******************************************\n"); printf("\n\t\t 1、按编号查询:\n");printf("\n\t\t 2、按姓名查询:\n");printf("\n\t\t 3、按电话号码查询:\n");printf("\n\t\t 0、返回:\n");printf("\n\t\t******************************************\n\n"); printf("\t\tPlease Enter Your Choose now: ");scanf("%d",&k);choose_2(k);}void choose_2(int k){switch(k){case 1 : found_code(); break;case 2 : found_name(); break;case 3 : found_callnumber(); break;case 0 : system("cls");menu(); break;default : system("cls");menu();break;}system("cls");menu();}//按编号查询void found_code(){int k=0;char codekey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember)); printf("\n\t\t请输入要查询的编号:");scanf("%s",codekey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address);if(!strcmp(codekey,p->code)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的编号不存在!");fclose(fp);getchar();getchar();system("cls");}//按姓名查询void found_name(){int k=0;char namekey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember));printf("\n\t\t请输入要查询的姓名:");scanf("%s",namekey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1.{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address); if(!strcmp(namekey,p->name)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的姓名不存在!");fclose(fp);getchar();getchar();system("cls");}//按电话号码查询void found_callnumber(){int k=0;char callnumberkey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember));printf("\n\t\t请输入要查询的电话号:");scanf("%s",callnumberkey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1.{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address);if(!strcmp(callnumberkey,p->callnumber)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的号码不存在!");fclose(fp);getchar();getchar();system("cls"); }/************************退出系统函数******************************/void quit() //调试合适 { printf("\t\t");exit(0);}。
手机通讯录源代码

手机通讯录源代码手机通讯录源代码#include#include#include#include#define N 15 //最大容量为15typedef struct //定义一个结构{char name[10];char haoma[15];char leibie[10];char dizhi[20];}ren;//菜单void menu() //目录{system("cls"); //清屏printf(" #########欢迎使用手机通讯录#########\n");printf("\n");printf("================================= ========================================= ====\n");printf("1.~~号码查询~~ \n");printf("2.~~号码添加~~ \n");printf("3.~~号码拨号~~ \n");printf("4.~~号码修改~~ \n");printf("5.~~号码删除~~ \n");printf("0. ~~退出~~ \n");printf("================================= ========================================= ====\n");printf("\n");printf("个人通讯录\n");printf("\n");printf(" ~~请选择相应的功能~~:");}void input() //查询{int help=0; //帮助指令,如果查找所找的类别中没有数据,显示ren ry;FILE *fp;char leibie[10];system("cls");printf("\n 输入要查人员的类别:");scanf("%s",leibie);//要查询的类别查找失败if((fp=fopen("ren.dat","rb"))==NULL){printf("can't open file!\n");exit(0);}fread(&ry,sizeof(ren),1,fp);if(!feof(fp)){ printf(" 人员的信息如下:\n");printf("说明:(A办公类B个人类C商务类)");printf("\n%10s %15s %10s %20s \n","姓名","号码","类别","邮箱");while(!feof(fp)){if(strcmp(ry.leibie,leibie)==0) //若为该类别则输出{ help++;printf("%10s %15s %10s %20s\n",/doc/8f1229847.html,,ry.haoma,ry. leibie,ry.dizhi);}fread(&ry,sizeof(ren),1,fp);}if(help==0){printf(" 查找失败");}。
C语言实现通讯录的详细代码

C语⾔实现通讯录的详细代码⽬录(⼀)实现思路1.通讯录功能2.模块化实现各⽅⾯的功能3.代码实现(⼆)源代码A.test.cB.Contact.hC.Contact.c(⼀)实现思路1.通讯录功能添加好友,删除好友,查找好友,修改好友信息,对好友进⾏排序2.模块化实现各⽅⾯的功能a. test.c测试通讯录功能b. Contact.c实现通讯录功能c. Contact.h包含通讯录实现的头⽂件3.代码实现(⼆)源代码A.test.c#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <string.h>#include "contact.h"void menu(){printf("*******************************\n");printf("*** 1.Add 2.Del ***\n");printf("*** 3.Search 4.Modify ***\n");printf("*** 5.Show 6.Sort ***\n");printf("*** 7.Help 8.About0 ***\n");printf("*** 0.Exit ***\n");printf("*******************************\n");}int main(){int input = 0;//创建通讯录InitContact(&con);//使size的初始值,以及好友信息初始化为0; do{menu();printf("请选择:");scanf("%d", &input);switch (input){//添加好友信息case Add:AddContact(&con);break;//删除好友case Del:DelContact(&con);break;//查找好友信息case Search:SearchContact(&con);break;//修改好友信息case Modify:ModifyContact(&con);break;//显⽰好友信息case Show:ShowContact(&con);break;//好友排序case Sort:SortContact(&con);break;//退出case Exit:printf("退出通讯录!");break;//通讯录的使⽤以及帮助case Help:HelpContact();break;//关于通讯录case About:AboutContact();break;//选择错误default:printf("选择错误!");break;}} while (input);return 0;}B.Contact.h#define _CRT_SECURE_NO_WARNINGS 1#define Max 1000#define Max_name 20#define Max_sex 5#define Max_tele 12#define Max_addr 30enum OptionDel,Search,Modify,Show,Sort,Help,About};//创建⼀个结构体来存放通讯录中要存放的信息struct PeoInfo{char name[Max_name];int age;char sex[Max_sex];char tele[Max_tele];char addr[Max_addr];};//通讯录类型struct Contact{struct PeoInfo data[Max];//存放⼀个信息,包括好友姓名,年龄,性别,电话,地址 int size;//记录当前已经有的元素个数//存⼊⼀个好友,size加1,表⽰通讯录⼈数增加⼀个};//声明函数//1.对通讯录进⾏初始化void InitContact(struct Contact* ps);//增加好友信息void AddContact(struct Contact* ps);//删除好友void DelContact(struct Contact* ps);//查找指定姓名的好友void SearchContact(struct Contact* ps);//显⽰好友信息void ShowContact(const struct Contact* ps);//修改好友信息void ModifyContact( struct Contact* ps);//按名字⾸字母对通讯录的好友进⾏排序void SortContact( struct Contact* ps);//帮助使⽤通讯录void HelpContact();//关于通讯录void AboutContact();C.Contact.c#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"#include <stdio.h>#include <stdlib.h>#include <string.h>//初始化通讯录void InitContact(struct Contact* ps){memset(ps->data, 0, sizeof(ps->data));ps->size = 0;//设置通讯录最初只有0个元素}void HelpContact(){printf("各按键的使⽤:\n");printf("1.添加好友\n");printf("2.删除好友\n");printf("3.查找好友信息\n");printf("4.修改好友信息\n");printf("5.显⽰好友信息\n");printf("6.对好友进⾏排序\n");printf("7.帮助使⽤通讯录\n");printf("8.关于通讯录\n");printf("谢谢使⽤通讯录!\n");}//关于通讯录void AboutContact(){printf("通讯录⼀般指在⽇常⽣活中⽤笔记录,也在⼿机,电脑,电⼦字典等电⼦产品中拥有这个功能。
手机通讯录源代码

手机通讯录源代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#define N 15 //最大容量为15typedef struct //定义一个结构{char name[10];char haoma[15];char leibie[10];char dizhi[20];}ren;//菜单void menu() //目录{system("cls"); //清屏printf(" #########欢迎使用手机通讯录#########\n");printf("\n");printf("================================= ========================================= ====\n");printf("1.~~号码查询~~ \n");printf("2.~~号码添加~~ \n");printf("3.~~号码拨号~~ \n");printf("4.~~号码修改~~ \n");printf("5.~~号码删除~~ \n");printf("0. ~~退出~~ \n");printf("================================= ========================================= ====\n");printf("\n");printf("个人通讯录\n");printf("\n");printf(" ~~请选择相应的功能~~:");}void input() //查询{int help=0; //帮助指令,如果查找所找的类别中没有数据,显示ren ry;FILE *fp;char leibie[10];system("cls");printf("\n 输入要查人员的类别:");scanf("%s",leibie);//要查询的类别查找失败if((fp=fopen("ren.dat","rb"))==NULL){printf("can't open file!\n");exit(0);}fread(&ry,sizeof(ren),1,fp);if(!feof(fp)){ printf(" 人员的信息如下:\n");printf("说明:(A办公类B个人类C商务类)");printf("\n%10s %15s %10s %20s \n","姓名","号码","类别","邮箱");while(!feof(fp)){if(strcmp(ry.leibie,leibie)==0) //若为该类别则输出{ help++;printf("%10s %15s %10s %20s\n",,ry.haoma,ry.leibie,ry.dizhi);}fread(&ry,sizeof(ren),1,fp);}if(help==0){printf(" 查找失败!!!");}}// else printf(" 查找失败!!!");fclose(fp);getch();}//修改:输入人员的姓名,查找该人员,若找到则修改该人员的信息,并显示修改前后的结果;//号码添加void search(){int n;FILE *fp; //定义文件指针ren ry,s; // 定义两个ren结构体的量if((fp=fopen("ren.dat","ab+"))==NULL){printf("can't open file!\n");exit(0);}printf("\n录入格式姓名号码类别邮箱。
手机通讯录开发源代码

手机通讯录开发源代码设计开发源代码1.AddContactsActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;import android.widget.Toast;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*增加记录操作界面*/public class AddContactsActivity extends Activity { private EditText nameEditT ext; //输入框private EditText mobileEditText; //手机输入框private EditText qqEditText; //qqprivate EditText danweiEditText; //单位private EditText addressEditText; //地址Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.edit);setTitle("添加联系人");//从已设置的页面布局查找对应的控件nameEditText=(EditText)findViewById(/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileEditText=(EditText)findViewById(R.id.mobile); danweiEditText=(EditText)findViewById(R.id.danwei); qqEditText=(EditText)findViewById(R.id.qq);addressEditText=(EditText)findViewById(R.id.address); }/*创建菜单 */public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE,1, Menu.NONE, "保存");menu.add(Menu.NONE,2, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件*/public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://保存if(!nameEditText.getText().toString().equals("")){User user=new User();user.setName(nameEditText.getText().toString());user.setMoblie(mobileEditText.getText().toString());user.setDanwei(danweiEditText.getT ext().toString());user.setQq(qqEditT ext.getText().toString());user.setAddress(addressEditText.getText().toString());ContactsTable ct=new ContactsTable(AddContactsActivity.this);if(ct.addData(user)){Toast.makeText(AddContactsActivity.this, "添加成功!",Toast.LENGTH_SHORT).show();finish();}else{Toast.makeText(AddContactsActivity.this, "添加失败!", Toast.LENGTH_SHORT).show();}}else{Toast.makeText(AddContactsActivity.this, "请先输入数据!", Toast.LENGTH_SHORT).show();}break;case 2://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}2. ContactsMessageActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*显示联系人界面 */public class ContactsMessageActivity extends Activity { private TextView nameTextView; //输入框private TextView mobileTextView; //手机输入框private TextView qqTextView; //qqprivate TextView danweiTextView; //单位private TextView addressTextView; //地址private User user; //修改的联系人Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.message);setTitle("联系人信息");//从已设置的页面布局查找对应的控件nameTextView=(TextView)findViewById(http://www.doczj.co m/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileTextView=(T extView)findViewById(R.id.mobile); danweiTextView=(TextView)findViewById(R.id.danwei); qqTextView=(TextView)findViewById(R.id.qq);addressTextView=(TextView)findViewById(R.id.address);//将要修改的联系人数据付值到用户界面显示Bundle localBundle = getIntent().getExtras();int id=localBundle.getInt("user_ID");ContactsTable ct=new ContactsTable(this);user =ct.getUserByID(id);nameTextView.setT ext(":"+user.getName());mobileTextView.setText(":"+user.getMoblie());qqTextView.setText("QQ:"+user.getQq()); danweiTextView.setText("单位:"+user.getDanwei()); addressTextView.setText("地址:"+user.getAddress());}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, 1, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件 */public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}3. MyContactsActivity类package .demo.pr3;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.ContentUris;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html .Uri;import android.os.Bundle;import android.provider.ContactsContract.RawContacts;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.Phone;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.StructuredName; import android.provider.ContactsContract.Contacts.Data;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*主界面*/public class MyContactsActivity extends Activity {private ListView listView; //结果列表private BaseAdapter listViewAdapter; //ListView 列表适配器private User users[];//通讯录用户private int selecteItem=0; //当前选择Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.main);setTitle("通讯录");listView = (ListView) findViewById(R.id.listView);loadContacts();}/*加载联系人列表*/private void loadContacts(){//获取所以通讯录联系人ContactsTable ct=new ContactsTable(this);users=ct.getAllUser();//listView列表现实适配器listViewAdapter=new BaseAdapter() {Overridepublic View getView(int position,View convertView, ViewGroup parent) {if(convertView==null){TextView textView =new TextView(MyContactsActivity.this); textView.setTextSize(22);convertView=textView;}String moblie=users[position].getMoblie()==null?"" :users[position].getMoblie();((TextView)convertView).setText(users[position].getName()+"---"+moblie);if(position==selecteItem){convertView.setBackgroundColor(Color.YELLOW); }else{convertView.setBackgroundColor(0);}return convertView;}Overridepublic long getItemId(int position) {return position;}Overridepublic Object getItem(int position) {return users[position];}Overridepublic int getCount() {return users.length;}};//设置listView控件的适配器listView.setAdapter(listViewAdapter);listView.setOnItemClickListener(new OnItemClickListener() { Overridepublic void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stub//记录点击列selecteItem=arg2;//刷新列表listViewAdapter.notifyDataSetChanged();}});}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE, 1, Menu.NONE, "添加");menu.add(Menu.NONE, 2, Menu.NONE, "编辑");menu.add(Menu.NONE, 3, Menu.NONE, "查看信息");menu.add(Menu.NONE, 4, Menu.NONE, "删除");menu.add(Menu.NONE, 5, Menu.NONE, "查询");menu.add(Menu.NONE, 6, Menu.NONE, "导入到手机薄");menu.add(Menu.NONE, 7, Menu.NONE, "退出");return super.onCreateOptionsMenu(menu);}/*菜单事件*/public boolean onOptionsItemSelected(MenuItem item){// TODO Auto-generated method stubswitch (item.getItemId()) {case 1://添加Intent intent = new Intent(MyContactsActivity.this,AddContactsActivity.class);startActivity(intent);break;case 2://编辑if(users[selecteItem].getId_DB()>0)//根据数据库ID判断当前记录是否可以操作{intent = new Intent(MyContactsActivity.this,UpdateContactsActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 3://查看信息if(users[selecteItem].getId_DB()>0){intent = new Intent(MyContactsActivity.this,ContactsMessageActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 4://删除if(users[selecteItem].getId_DB()>0){delete();}else{Toast.makeText(this, "无结果记录,无法操。
ASP通讯录源代码

通讯录源代码:1、基本通讯录odbc_connection.asp<%dim dbset db=server.createobject("ADODB.CONNECTION")db.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.mappath("address.mdb")%>Index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=20%>姓名</td><td width=30%>电话</td><td width=30%>email</td><td width=20%>详细</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select name,tel,email,id From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><%=rs("name")%></td><td><%=rs("tel")%></td><td><%=rs("email")%></td><td><a href="particular.asp?id=<%=rs("id")%>" target="_blank">详细</a></td></tr><%rs.MoveNextLoop%></table></center></body></html>Particular.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>详细资料</title></head><body><h2 align="center">详细资料</h2><%'利用Request.QueryString获取传过来的ID编号Dim idid=Request.QueryString("id")strSql ="Select * From users where id=" & idSet rs=db.Execute(strSql)%><center><table border="0" width="80%" ><tr><td width=20%>姓名:</td><td><%=rs("name")%></td> </tr><tr><td>电话:</td><td><%=rs("tel")%></td></tr><tr><td>email:</td><td><%=rs("email")%></td></tr><tr><td>简介:</td><td><%=rs("intro")%></td></tr><table><p> <p align=center><a href="javascript:close()">关闭窗口</a></center></body></html>2、通过姓名链接详细页面---index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=40%>姓名</td><td width=30%>电话</td><td width=30%>email</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select name,tel,email,id From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><a href="particular.asp?id=<%=rs("id")%>" target="_blank"><%=rs("name")%></a></td><td><%=rs("tel")%></td><td><%=rs("email")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>3、详细页面在指定大小的窗口中打开—index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=20%>姓名</td><td width=30%>电话</td><td width=30%>email</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select * From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><a href="#"onClick="open('particular.asp?id=<%=rs("id")%>','','resizable=0,scrollbars=1,st atus=no,toolbar=no,menu=no,width=500,height=300,left=150,top=150')"><%=rs ("name")%></a></td><td><%=rs("tel")%></td><td><%=rs("email")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>4、按字段排序源代码:index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=10%><a href="index.asp?sortfield=id">编号</a></td><td width=10%><a href="index.asp?sortfield=name">姓名</a></td><td width=30%><a href="index.asp?sortfield=tel">电话</a></td><td width=30%><a href="index.asp?sortfield=email">email</a></td><td width=20%><a href="index.asp?sortfield=submit_date">提交日期</a></td></tr><%'这一段主要来获取排序字段,第一次打开时默认按提交日期到序排列,客户选择字段后按指定字段倒叙排列Dim sortfield '定义一个排序字段变量If Request.QueryString("sortfield")="" Then'该条件表示是第一次打开,则令排序字段为提交日期,并倒叙排列sortfield="submit_date DESC"Else'如果选择了其它排序字段,则按指定字段倒叙排列sortfield=Request.QueryString("sortfield") & " DESC"End If'建立Recordset对象,并按指定字段排序Dim strSql,rsstrSql ="Select * From users Order By " & sortfield '请注意By后面要有一个空格Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><%=rs("id")%></td><td><%=rs("name")%></td><td><%=rs("tel")%></td><td><%=rs("email")%></td><td><%=rs("submit_date")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>5、分页显示源代码---index.asp p596、分页显示改进源代码---index.asp p61-627、按单个关键字查询源代码---index.asp p638、按多个关键字查询源代码---index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><%'这两个变量用来确定查找关键字和字段Dim keyword,fieldIf Trim(Request.Form("keyword"))<>"" Then'如果条件成立,表示客户输入了关键字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先,对于stdlib.h头文件,你们不需要知道别的,只要了解,它里面高喊有申请动态内存空间的函数malloc() 就可以了。
所以,想要使用该函数,必须加此头文件,就像想要使用printf() 和scanf()必须要加上stdio.h一样。
同样,string.h头文件里也包含有好多函数,在本程序里面用的是strcmp() strcpy(),strlen()等等。
下面讲讲#define。
这就是传说中的宏定义了。
(额外讲一点,之所以称之为“传说中”,是因为我在接触它之前,感觉有多么多么神秘,但真正了解了,其实也没啥神秘可言)。
好了不废话了,举个例子#define MAXQQ11.其中,MAXQQ 是宏名,11 是宏体,用宏名可以代替宏体。
如若有一下语句:#define M 10 int a =M;则a的值就为10了;理解了吧?或许你们会问:为什么要用那么一大串字母代替一个数字呢?不麻烦么?直接a = 10;不更简单么?呵呵,其实这正是为了修改的方便才用的。
比如,一个很大的程序里面多次用到常量10,但后来需要把10改为11,那么只要修改开头部分的#define M 11就可以了,而大可不必在程序中一个一个的闷着头在那里一个劲的傻找。
是吧?下面是结构体,tpyedef struct _person {…}person;至于typedef语句,我想,理论是不能解开困惑的,还是举个例子吧:如有typedef int LIKAI;LIKAI a; 语句就等同于:int a; 两位聪明的三姐四姐,明白了没?总之一句话:typedef就是为数据类型取个别名,(刚刚讲的宏定义是给常量(或表达式)取个别名);所以,我们看到下面的一个结构体里的person per;语句就等同于struct _person per; 还有再下面的addr_book *head =NULL;就等同于struct addr_book *head =NULL啦!这样可以少写一些代码(这里其实也就是少写了一个单词而已)再下面从void add()~void input_person(person *p); 都是函数声明,这一点徐慧丽同学比较了解,有疑问可以问她。
再下面是定义的多个字符串数组,其长度已经隐式的指出,就是下面所以字符个数之和。
再下面就是主函数main()了,对了,关于函数的调用,三位同学还是有必要再了解一下的,但是限于篇幅,老师在这里就不再赘述。
希望掌握欠佳的同学课后自行温习一下。
main()函数开头,调用perint_welcome()函数,我们跳到这个函数里面看一看它的运行机制:外重for 循环内的变量i控制着屏幕的行数,在第四行(i从0~3),开始打印,if里面的三个打印字符串都打印完了呢,就直接跳到第七行,退出外重for循环,打印“回车键进入…”,等用户敲回车时,该函数执行完毕,返回到main()里调用它的地方。
然后进入while循环,循环条件永远为真,因为里面的switch语句里包含很多break语句,所以我们并不怕陷入死循环的泥沼中,嘿嘿,(因为我们不知道用户会输入多少条命令,所以要用while循环),在switch语句里,开关的钥匙是一个函数的返回值,这样可以少定义一个变量,代码也变得精简多了,好了,我们再跳到print_menu()函数里面看看:首先,清屏函数system(“cls”),(我帮你们想好了。
要是老师问你们,你们只需说这是个清屏函数,是你们需要清除Dos窗口内的字符的时候,请教高人才得以知道的,嘿嘿),printf(menu);函数打印主菜单界面,并等待用户选择命令,若不在1~8的命令范围只内,提示有误,并请求再次输入,当输入命令合法的时候,返回该命令数字。
然后我们在跳回主函数的switch 语句里,可以看到,无论用户选择那个命令,都会调用一个函数,这就是面向过程程序设计的一个特点,(徐慧丽同学现在知道了所谓的函数串的概念了吧?)而C++则不同,它所操作的都是由一个个类所定义的对象,而每个对象都有自己的“方法”(“方法”就是成员函数的一种牛叉的叫法,即专业名词,呵呵),体现了C++不同于C的一个特点:封装性。
其实我想我们以开始学C的相对于一开始学C++的同学还是很幸运的,因为我们首先接触的是面向过程程序设计,C++ 我们以后一定会学(会了C还怕不会C++?),而我们有C的基础,可以透过语法结构,从思想上、跟不上区别于二者,对照其异同点,效果会更好,而对于他们一开始就学C++的同学,此生恐怕没有机会接触C了…所以….唉,都是题外话,不说了。
继续讲switch,若print_menu()返回值为1,则调用开关语句里的add(),我们再跳进来看看:addr_book *last;addr_book*_new=(addr_book*)malloc( sizeof(addr_book) );第一句是定义一个结构体指针变量last(这里在强调一下,无论C还是C++,指针是精华,十分、非常、极其、特别、尤为、至关重要,所以,以后以编程为饭碗的同学,必须搞得十分清晰十分熟悉,希望引起三位同学的重视),第二句,定义一个结构体指针变量_new,并指向刚刚用malloc()函数申请的内存块,需要讲一下,malloc()是一个void类型的函数,无返回值,我们想想,啥也不返回,那怎么赋值给_new呢?对吧?所以必须使用强制类型转换,即(addr_book*)malloc()来把它的返回值转换成跟_new一个类型的变量的地址,并赋给_new,对了,sizeof(addr_book) 需要我讲么?这个函数是计算括号内数据类型的字节长度的,我们想呀:要开辟一块空地,应该指出它的尺寸大小吧?(长多少,宽多少)是吧,其实有很多东西,我们都可以把它形象化的,如数组、指针、函数模板、类模板,淡然模板是C++的内容。
不好意思,又跑题了。
然后,把刚刚申请的节点的指针域置空(为了防止它乱指,所以置空,但是其实这句是废话,不置空也行的)。
面我们要做啥呢?呵呵,当然是把这个节点加到链表当中啦!所以首先判断链表是否为空(全局指针head是始终指向链表的头结点的,所以,单链表中,没事别乱懂head,更千万别乱给它赋值,这咱伤不起啊╮(╯3╰)╭,否则整个链表会没有头绪,整个程序会崩溃…然后…然后,我们就完蛋了)如果链表头为空,则说明链表没有建立起来,那么就把刚刚申请的那块内存当作头吧,即把_new的地址赋给head,若head 不为空,说明已经有了节点,有多少个呢?不知道,好吧,那咱们调用find_last()(顾名思义)找找吧,找到链表的尾巴,然后把刚刚申请的内存块加到它的尾巴上就OK啦!那咱再跳到find_last()里看看它是怎么工作的:想找到尾巴,我们从那里开始下手呢?嘿嘿,你答对了,当然先从头开始啦,所以,find_last()函数的实参就是head指针。
需要注意的是,尾巴的一个特点就是:它的指针域是为空的,即:若p为尾节点,则p->next 的值为NULL Find_last()函数里,首先定义了一个结构指针p,将头head赋给他,然后head就可以回家吃饭去啦,哈哈,因为没它啥事了嘛!判断p所指的节点的下一个指向是否为空呢?这节链子下面挂的还有没有下一节呢?当然用眼睛是看不到的,我们上一段说过的,如果为尾巴,则指针域为空(NULL),立即结束find_last()函数,并将尾节点返回给调用它的地方,如果不为空,则把p的指向改为p当前所指的节点的下一个节点,继续判断,直到找到尾巴...找到了尾巴后,立即返回到add(),把尾巴赋值给last指针,并将该节点的指针域的nex指向申请的节点_new。
然后呢?呵呵,当然啦,要往这个节点里装东西啦!(其实就跟火车一样),即调用input_person(),形参就是这个节点的数据域的地址,而数据域就是我们以前讲过的那个小结构的全部成员。
现在,我们再跳到input_person()里看看:其实这个也没啥好讲的,就是简单的赋值嘛。
依次为数据域变量赋值后,返回到add(),然后问是否继续添加,选择“是”,则递归调用(自身调用自身),选择“否”,退出。
需要讲一下的是fflush(stdin) ;这个是清除内存缓冲区的函数,即把内存缓冲区的东西都清除掉,到时候老师要是提问你们的话,你们也说,是请教高人才知道的(目前只有这个理由能应付老师了,当然你们也可以自己想理由)。
好了,add()函数执行完毕,我们回到main()函数里调用add()的地方,呵呵它的下一条语句是break;所以,跳出了switch语句,进入while循环。
执行条件为1(真),所以再次进入了switch语句,然后再次调用print_menu()打印屏幕主菜单,根据其返回值来选择需要使用的功能,第二个是显示函数show(),这个没什么,所以咱们跳过。
第三个是查找函数search(),这里我就跟你们写了一种查找方式,其实可以写很多种的(比如:性别,年龄,手机,还有姓名模糊查找),这些功能就不添加了,否则代码会很长,老师会怀疑的(当然,我这里不是轻视三姐四姐的能力,请不要误会哈!)。
当然,如果你们很自信,并且希望添加这些查找方式的话,各位同学不必客气,直接跟我说,我再帮你们添加就是了。
search()我们也不说了,下面我们将删除函数delet(),首先,清屏、打印删除标题、定义结构变量(看看,head又出来了,这个东西可是个VIP级的关键变量啊),然后提示输入姓名,判断链表是否为空,如果为空,则不执行while循环体,直接跳到下面的if语句,因为一次也没有执行count++;所以,count肯定为0,所以输出没有此人的提示信息,否则,count 肯定不为0,既然不为0,说明必定执行了count++语句。
我们现在再拐回头,看看上面的while语句,它的循环体的if语句的条件里面调用了string.h头文件里的strcmp()函数,这个函数运行原理就是:比较两个字符串实参(这里就是p -> 和sea_name)如果相同,就返回0,所以,如果返回0,则说明找到了,调用printf()函数,打印该联系人的信息(该节点的数据域所有数据),count++;然后break;跳出while循环,进入下面的else语句,如果选择Y,就开始删除该联系人(该节点),首先判断要删除的联系人是否为第一个联系人(头结点),如果是,那可不得了啦!刚刚我们说过的,head可是个很很很重要的结构变量,没了它,链表就没了头绪,程序核心就崩溃,我们就完蛋了…(链式反应),言归正传,如果为头结点(p==head),则把head的指向修改为第二个节点,然后删除头结点(free(p)),如果要删除的联系人不是第一个,则我们不要碰head,(对了,这里先讲一下单链表的节点删除原则:先连后删,举例子把,假设有链表A→B→C,要删除B,则必须找到A,先把A 和C相连之后,在释放掉B,如果直接释放B,则链表会断的,程序一样会崩溃,我们一样会完蛋)所以,我们要用p1来找到前一个节点(当然从头head开始一个一个找啦,看看看看head多重要呀),如果找到(判断条件为p1所指向的节点的指针域所指向的下一个节点为p,p就是我们刚刚需要删除的那个节点),就把这个节点与p所指向的下一个节点相连(即实现A与C相连),然后再释放掉指针p所指向的节点。