
数据结构课程设计-通讯录的制作.doc
37页数据结构课程设计 ——————通讯录的制作 班级: 信计081 组员: 王 琪 0809290106杨赫桐 0809290108隋欣桐0809290103 一、摘要:运用〈〈数据结构〉〉中的算法思想作数据结构,结合C语言基本知识,编写一个通讯录管理系统以把所学数据结构知识应用到实际软件开发中去二、问题的重述: 制作通讯录,要求每条信息至包含姓名(name )城市(city)(tel)号(),完成如下功能:输入信息;显示信息; 查找以姓名作为关键字;删除信息;修改信息;存盘(将数据保存在文件中,此功能选做);清除信息; 三、问题的分析:结合数据结构和C语言的知识运用链表和文件本系统应完成一下几方面的功能:①输入信息(enter()): 调用此函数用以输入数据到内存中,此过程包括建立相应的链表或相应的数组,便于读取;②显示信息(display()):用以显示输入的数据;③查找(search()):以姓名作为关键字查找要找的信息;④删除信息(delete_name ()):用以删除选定的输入信息(姓名作为关键字);⑤修改信息(change()): 用以修改选定的输入信息(姓名作为关键字);⑥打开通讯录(load()):存储从文件中读取的字符;⑦添加信息(inster()):用尾插法以添加信息;⑧保存(save()):调用此函数将内存中的数据保存至磁盘中;⑨清屏(system("cls")):执行cls命令。
四、程序的建立与运行结果检验1、定义主函数:void main(){ list *head=NULL;//头指针初始化 FILE *fp;//定义文件指针 int m;//功能代号吗 do{ printf("\n #############################请选择################################\n"); printf(" # 1、信息输入 "); printf(" 2、显示信息 #\n"); printf(" # 3、查找姓名 "); printf(" 4、删除信息 #\n"); printf(" # 5、修改信息 "); printf(" 6、打开通讯录 #\n"); printf(" # 7、添加信息 "); printf(" 8、 保存 #\n"); printf(" # 9、清屏 "); printf(" 0、退出 #"); printf("\n ###################################################################\n"); printf(" 提示:信息输入和添加信息时最好存入字符,否则,在打开存储文件时,可能会出现乱码!\n"); printf("==输入要执行的功能代号:_"); scanf("%d",&m); switch(m) { case 1:enter(head);break; case 2:display(head); break; case 3:search(head); break; case 4:delete_name(head);break; case 5:change(head);break; case 6:load(head);break; case 7:insert(head);break; case 8:save(head,fp);printf("==保存成功==\n");break; case 9:system("cls");break; } } while(m!=0);}2、信息输入:void enter(list *&head){ list *p0,*p1,*p2;//定义指针 int m;//作为判断是否继续新建的条件 FILE *fp; p0=(list *)malloc(LEN); //开辟一个新单元 p0->next=NULL;//结点指针域为空 head=p0;//第一个结点,即为头结点 printf("请输入信息建立通讯录:\n"); getchar(); scanfdata(p0);//输入数据 p2=p0; printf("是否继续按1输入,按0结束_"); scanf("%d",&m); while(m) { getchar(); p1=(list *)malloc(LEN); //开辟一个新单元 p1->next=NULL; p2->next=p1; scanfdata(p1);//输入数据 p2=p1; head->n = head->n+1;//表长 printf("是否继续按1输入,按0结束_"); scanf("%d",&m); } if(m==0) { save(head,fp);//把信息存到相应文件 }}3、显示信息void display(list *head){ list *p; //定义移动指针 int i; char *menu[]={"姓名","城市","", ""}; p=head; printf("--------------------------------------------------------------------\n"); for(i=0;i<4;i++) printf("%-20s",menu[i]); printf("\n"); if (head!=NULL) while(p) { printf("%-20s",p->name); printf("%-20s",p->city); printf("%-20s",p->phone); printf("%-20s",p->); printf("\n"); p=p->next; } else printf("不好意思,列表为空\n"); printf("--------------------------------------------------------------------\n");}4、查找信息:void search(list *head ){ list *p1,*p2;//定义临时指针变量 char check_name[20]; //定义存储查找人的姓名 printf("请输入要查找的姓名\n"); scanf("%s",check_name); //输入要查找的人的姓名 if(head==NULL) { printf("\n不好意思,列表为空\n"); } p1=head; while(p1!=NULL&&strcmp(check_name,p1->name)!=0) //p1指向的不是所要找的结点,后面还有 { p2=p1; p1=p1->next; } //p1后移一个结点 if(p1!=NULL&&strcmp(check_name,p1->name)==0) //找到了用strcmp比较两个字符串 { printf(" 姓名: %s ",p1->name); printf(" 城市: %s ",p1->city); printf(" : %s ",p1->phone); printf(" : %s ",p1->); printf("\n"); }//输出结点数据 else printf("\n没有%s的通讯信息\n",check_name);//否则提示没有此人的通讯信息}5、删除信息:void del(list *&head){ list *p1,*p2;//定义临时指针 char delname[20];//保存要删除人的姓名 FILE *fp;//文件指针 int i; printf("请输入要删除人的姓名:"); scanf("%s",delname);//输入要删除人的姓名 if(head==NULL)//如果头指针为空,则输出提示语:通讯录为空 { printf("\n ====通讯录为空====\n"); } p1=head; //通讯录不为空时,把头指针赋值给p1 while(p1&&(i=strcmp(delname,p1->name))) //p1指向的不是所要找的结点,且p1不是最后一个结点 { p2=p1; //保存前驱结点地址 p1=p1->next; //p1后移一个结点 } if(i==0) //找到了用strcmp比较两个字符串 { printf("删除人为:%s\n",p1->name); if(p1==head) { head=p1->next; //若p1指向的是首结点,指第二个结点的地址给P1 } else { p2->next=p1->next;//修改指针域 } head->n=head->n-1; //书P302 printf("刚刚删除的是:%s\n",delname); //提示刚才删除的人的姓名 free(p1); //把此人的信息所占内存释放 datawrite(head,fp); //重新写入文件保存 } else if(p1==NULL) printf("\n姓名为%s的通讯信息没有被找到!\n",delname);//否则没有找到此人}6、修改信息:void change(list *head ){ list *p1,*p2; //定义临时指针变量 char change_name[20]; //定义存储修改人的姓名数组 FILE *fp; //文件指针 printf("请输入要修改的姓名\n"); scanf("%s",&change_name); //输入要修改的人的姓名 getchar(); if(head==NULL) { printf("\n不好意思,列表为空\n"); } p1=head; while(p1!=NULL &&strcmp(chan。