版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中北大学数据结构与算法课程设计说明书学院、系:软件学院专业:软件工程班级:13140A01学生姓名:景贝贝学 号: 1314011438设计题目:通讯录的制作起迄日期:2015年1月12日-2015年1月29日指导教师:杨顺民2015年1月29日1 需求分析1) 每条信息至包含: 姓名 ( NAME) 街道 ( STREET) 城市 ( CITY) 邮编 ( EIP) 国家 ( STATE)几项2) 作为一个完整的系统,应具有友好的界面和较强的容错能力3) 上机能正常运行,并写出课程设计报告通讯录的基本活动包括:对一个人的采编、删除、查找和显示等等。由于上述四项基本活动都是通过人名(即关键字)
2、进行的。作为通讯录,就需要一个模块来完成对别人的登记和记录情况,本程序使用文件来完成上述操作。2 设计内容本系统应完成一下几方面的功能:1) 输入信息 enter();2) 显示信息display( );3) 查找以姓名作为关键字 search( );4) 删除信息delete( );5) 存盘save ( );6) 装入load( ) ;3 设计目的用数据结构中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。因此,为了表示每个数据元素与其后继元素之间的逻辑关系,
3、对于数据元素来说,除了存储数据本身信息之外,还需要存储一个指示其后继的信息。这两部分组成数据的存储映像,称为结点。4 .系统流程图85.详细设计及(1)结构体:(构造一个结构体来存储和使用数据)struct address/*char name30;/姓名char street100;/街道char city30;/城市char state30;/国家定义结构*/邮政编码/*后继指针*/*前导指针*/首结点*/尾结点*/声明查找函数*/char zip11;/struct address *next;struct address *prior;struct address *start;/*s
4、truct address *last;/*struct address *find(char *);/*2)包含被调用函数功能void enter();/输入信息/*函数声明*/void search();/查找信息void save();/存盘void load();/装入void list();/显示信息删除信息void mldelete(struct address *,struct address *);/void dls_store(struct address *i,struct address *start, struct address *last);void inputs(
5、char *,char *,int);void display(struct address *);int menu_select(void);( 3)实现主程序与各模块的调用关系:主函数通过调用各个函数来连接各个函数,从而实现程序功能的实现。int main(void)start = last = NULL;for(;)switch(menu_select()case 1:enter();continue;case 2:mldelete(&start,&last);continue;case 3:list();continue;case 4:search();continue
6、;case 5:save();continue;case 6:load();continue;case 7:exit(0);6 .部分调试界面3欢迎使用迷你通讯录系名MX舞MJf注舞舞KM减12 3 4 5 6 7人除示找盘入出输删显查存量息息&三号受=i,人想要查找的姓名:a证名Qi城1i陈国家请选择: 3姓名 a街道 a城市 a邮编a国家a姓名街道城市邮编国冢dsfasdfasdFasasdf洋名 甥贝道道 孥院路鹦市邮编蠡姓名街道邮编李四西街00600中国请选择:2要删除的姓名,糖禽啜迎使用迷你通讯录系统定义结构*/后继指针*/前导指针*/首结点*/尾结点*/声明查找函数*/7
7、.程序源码#include<stdio.h>#include<stdlib.h>#include<string.h>struct address/*char name30;/姓名char street100;街道char city30;/城市char state30;/ 国家char zip11;/ 邮编struct address *next;/*struct address *prior;/*;struct address *start;/*struct address *last;/*struct address *find(char *);/*voi
8、d enter();/*函数声明*/void search();void save();void load();void list();void mldelete(struct address *,struct address *);void dls_store(struct address *i,struct address *start,struct address *last);void inputs(char *,char *,int);void display(struct address *);int menu_select(void);int main(void)start =
9、last = NULL;for(;)switch(menu_select()case 1:enter();continue;删除case 2:mldelete(&start,&last);/continue;case 3:list();/显示continue;case 4:search();/查找continue;case 5:save();/保存continue;case 6:load();/装入continue;case 7:exit(0);/退出int menu_select(void)/*主目录 */9char s80;int c;n");printf(&qu
10、ot; 欢迎使用迷你通讯录系统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");doprintf("n 请选择 :n");gets(s);c = at
11、oi(s);/是把字符串转换成长整型数的一个函数while(c<0|c>7);/*超出选项范围时,提示重新输入*/return c;/*返回输入值*/void enter()/*输入函数, 本函数循环输入资料,当输入姓名10为空时退出*/struct address *info;/*定义当前结点*/for(;)为当前结点分info=(struct address *)malloc(sizeof(struct address); /*配空间 */if(!info)printf("n 分配空间失败");exit(0);/*如果分配空间失败,退出程序*/printf(
12、"输入空姓名结束:n");inputs("姓名:",info->name,30);如果输入姓名为空,结束循环*/if(!info->name0)dls_store(info,&start,&last);/*调用结点插入函数*/inputs("街道:",info->street,100);inputs("城市:",info->city,30);inputs("国家:",info->state,30);inputs("邮编:",inf
13、o->zip,11);break;/*输入函数,有越界检测功能*/void inputs(char *prompt,char *s,int count) /*char p255;doprintf(prompt);fgets(p,254,stdin);if(strlen(p)>count)printf("n 太长 n");while(strlen(p)>count);pstrlen(p)-1=0;strcpy(s,p);数据插入函数,也是本例的关键函数*/接受传入的当前输入结点地址*/接受传入的首结点地址*/接受传入的尾结点地址*/如果尾结点为空, 意味着当
14、前链表为空*/void dls_store(/*struct address *i,/*struct address *start, /* struct address *last/*)struct address *old,*p;if(*last=NULL)/*i->next=NULL;i->prior=NULL;*last=i;*start=i;return;12/*如果链表不为空*/p=*start;/*pold=NULL;/*oldwhile(p)/*结点应该插入的位置*/if(strcmp(p->name,i->name)<0) /*大时(实现以name
15、域升序排序)*/old=p;p=p->next;else/*时,把数据插入结点p 之前 */if(p->prior)/*p->prior->next=i;i->next=p;i->prior=p->prior;p->prior=i;return;i->next=p;/*为首结点, 并令当前结点的后驱为p*/i->prior=NULL;p->prior=i;*start=i;取入口地址( 也就是首结点地址)*/赋空 */如果 p 不为空时, 执行特循环体,查找比当前如果当前结点的name域比p(首结点)如果当前输入数据中的name
16、域比p小如果 p 的前驱不为空时*/如果 p 的前驱为空时, 把当前结点作return;21/*循环体结束*/old->next=i;/*据的name域大的结点,*i->next=NULL;i->prior=old;*last=i;/*如果在整个链表都找不到 name域比当前数把当前数据放在作为尾结点放在最后*/尾结点取i 地址 */void mldelete(struct address *start,struct address *last) /*删除函数*/struct address *info;char s80;inputs(" 要删除的姓名:"
17、,s,30);/*info=find(s);if(info)printf(" 删除 ingn");if(*start=info)/*驱作为新的首结点(入口)*/*start=info->next;if(*start)(*start)->prior=NULL; /*/else *last=NULL;/*输入欲删除结点的name域内容*/如果新入口不为空,把入口的前驱置空如果该结点为首结点, 把该结点的下如果新入口为空,把尾结点置空,链表为空*/else/*如果欲删除的结点不是首结点*/info->prior->next=info->next;如果
18、该结点是尾结点,则令该结点if(info!=*last)/*的前驱为尾结点*/info->next->prior=info->prior;else*last=info->prior;free(info);printf(" 删除成功!n");struct address *find(char *name) /*查找函数, 形参为欲查找结点的name 域 */struct address *info;info=start;while(info)if(!strcmp(name,info->name)return info;info=info->
19、next;printf(" 没有找到这个名字!n");return NULL;/*输出整个链表*/void list(void)struct address *info;info=start;if(info=NULL)printf(" 没有信息");while(info)display(info);info=info->next;printf("nn");void display(struct address *info) /*输出传入结点函数*/printf("n");printf(" %-18s
20、%-18s%-18s%-15s%sn"," 姓名 "," 街道 "," 城市 "," 邮编 "," 国家 ");/ 格 式控制输出printf(" %-18s%-18s%-18s%-15s%sn",info->name,info->street,info->city,info->zip,info->state);/*printf("%sn",info->name);printf("%sn",
21、info->street);printf("%sn",info->city);printf("%sn",info->state);printf("%sn",info->zip);*/printf("nn");void search(void)/*查找函数*/char name40;struct address *info;printf(" 输入想要查找的姓名:");gets(name);info=find(name);if(!info)printf(" 没有找到
22、n");/*elsedisplay(info);/*void save(void)/*struct address *info;FILE *fp;fp=fopen("mlist","wb");/*if(!fp)printf(" 不能打开文件.n");return;printf("n正在保存n");info=start;/*输入欲查找的姓名*/如果没找到,显示Not found*/如果找到,显示该结点资料*/保存函数*/生成文件*/while(info)/*把链表写入文件*/fwrite(info,size
23、of(struct address),1,fp);info=info->next;printf("-ok!n");fclose(fp);/* 链表全部写入文件后,关闭文件*/void load()/*调用预存文件函数*/register int t, size; /register变量的值是存放在CPU中的寄存器中,调用时直接从寄存器中取出参加运算,存放在寄存器中的变量值调用需要的时间短struct address *info,*temp=0;char *p;FILE *fp;/*打开文件*/if(fp=fopen("mlist","r&
24、quot;)=NULL)printf(" 没有打开文件!n");exit(0);printf("nn 正在加载.n");/*调用文件*/size=sizeof(struct address); /*为结点分配内存*/start=(struct address*)malloc(size);if(!start)/*如果读取失败,返回*/printf("Out of memory!1n");exit(0);info=start;p=(char*)info;while(*p+=getc(fp)!=EOF)for(t=0;t<size-1;+t)22*p+=getc(fp);info->next=(struct address*)malloc(size);if(!info->next)printf("Out of memory!2n");ret
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市轨道交通消防与环控系统检修电子教案-项目二任务四(1)通风空调系统设备维护管理
- 2026 幼儿台球启蒙课件
- 2026 幼儿情绪管理害怕情绪安慰陪伴课件
- 2026年信息技术应用课程
- 2026六年级道德与法治下册 问题解决能力
- 2026 四年级下册《跪跳起动作学习》课件
- 2026年幼儿园课题培训
- 建筑门窗的售后服务承诺书及方案
- 2026年危险化学品经营单位安全管理人员证考试题库及试题解析
- 旋挖钻材料计划
- 2026年滁州凤阳大明旅游发展(集团)有限公司招聘导游员(讲解员)15名笔试备考题库及答案详解
- T∕SZSSIA 019-2026 反恐怖防范管理规范 总则
- 24J113-1 内隔墙-轻质条板(一)
- 药食同源食品管理办法实施细则
- 律师事务所内部惩戒制度
- 政治监督培训课件模板
- 桥架培训课件
- 形势与政策课论文题目
- 无线电频谱管理现状与发展趋势
- 《青春之光》教学课件【大单元教学】
- JGT366-2012 外墙保温用锚栓
评论
0/150
提交评论