收藏 分销(赏)

利用顺序表的方式实现通信录.doc

上传人:丰**** 文档编号:4292304 上传时间:2024-09-04 格式:DOC 页数:34 大小:220.50KB 下载积分:12 金币
下载 相关 举报
利用顺序表的方式实现通信录.doc_第1页
第1页 / 共34页
利用顺序表的方式实现通信录.doc_第2页
第2页 / 共34页


点击查看更多>>
资源描述
湖南人文科技学院计算机科学技术系 课程设计说明书 课 程 名 称: 数据结构 课 程 代 码: 题 目: 利用顺序表的方式实现通信录 年级/专业/班: 10级软件工程一班 学 生 姓 名: 任孜聪 岳常 朱红 黄晓芬 符强 学 号:10436144 10436145 10436146 10436147 10436148 指 导 教 师: 易 叶 青 开 题 时 间: 2012 年 3 月 10 日 完 成 时 间: 2002 年 4 月 8 日  目 录 摘 要 2 一、引 言 3 二、设计目的与任务 错误!未定义书签。 1、课程设计的目的 3 2、课程设计的任务 3 三、设计方案 3 1、需求分析 4 2、总体设计 4 3、详细设计 6 4、程序清单 11 四、调试分析与体会 27 五、运行结果 28 六、结 论 33 七、致 谢 33 八、参考文献 34 摘 要 C语句简练、语法结构清晰、紧凑,使用方便、灵活,程序结构简单、书写格式自由,数据类型丰富、齐全,运算能力强,语法限制不太严格,程序自由度大、可移植性强,语言的通用性较强等特点。本文论述了使用DEV-C++设计一个通讯录系统。首先,在定义了结构体(student),其中包括学号、姓名、性别、电话、QQ号和专业,以及其他一些成员函数;然后编写了记录输入的函数,以及记录查找函数、记录修改函数、记录删除函数、记录查找函数、按照学号升序排列函数,同时运用了线性表的顺序表示这种数据结构;最后在主程序中调用。通过这个通讯录系统,实现了输入记录、查询记录、修改记录、删除记录以及显示记录的基本功能。 关键词:通讯录;数据结构;C语言 Abstract C statement concise, grammar structure is clear, compact and easy to use, flexible, simple structure, writing format program free, data type is rich, is complete, the operation ability, grammar limit not too strictly, procedures, and freedom portability is strong, language is used widely, etc. This paper discusses the use of DEV-C++ design a directory system. First, the definition in structures (student), including student id, name, gender, telephone, QQ number and professional, and some other member function; And then write the record of the input function, and search function, record record change function, delete function, record record search function, according to student id is arranged by function, and using the linear table order said the data structure; Finally in the main program called. Through the address book system, realized the input records, inquires the record, modify records, deleting records and display the basic functions of the record. · Keywords: address list;data structure;C programming language 《数据结构》课程设计 ----利用顺序表的方式实现通讯录 一、引 言 “数据结构“是计算机程序设计的重要理论技术基础,它不仅是计算机科学科的和新课程,而且已成为其他理工专业的热门选修课。它将让学生学会分析研究计算机加工的数据结构的特征,为运用涉及的的数据选择适当的逻辑结构、存储结构、相应的算法以及算法的时间分析和空间分析,打下基础。通过若干数据结构应用实例,引导学生学习数据类型的使用,达到培养学生的数据抽象能力的目的。 本课程设计运用的数据结构是线性表的顺序表示。这种数据结构指的是用一组地址连续的存储单元依次存储线性表的数据元素。它的特点是,以元素在计算机内的“物理位置“来表示线性表中的数据元素之间的逻辑关系。每一个数据元素的的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。由此可知,线性表的顺序存储结构是一种随机存储的存储结构 本课程设计的基本要求是:实现记录的输入、查询、显示、修改和删除等一系列操作。 二、设计目的与任务 1、课程设计目的 这个程序是通过C语言采用顺序表这种数据结构来设计的。定义结构体(student),其中至少包括姓名、性别、学号、电话、QQ号和专业。通过本次数据结构的课程设计,我们将会把平日书本上的知识真正应用到了实际中来。深入了解数据结构的相关内容及相关函数的应用,结合其它相关知识,如软件工程等,把所学知识融会贯通。 2、课程设计的任务 问题描述: 纸质通讯录已经不能满足大家的要求,容易丢失、查找困难等问题是纸质通讯录的缺点。“通讯录管理系统”是为了帮助老师、同学等管理和分析的一种应用程序。 三、设计方案 1、需求分析 1) 输入数据并建立通讯录 2) 查询通讯录中的信息 3) 插入新的信息 4) 删除信息 5) 查询信息 6) 更新信息 7) 按学号排序 2、概要设计 1) 抽象数据类型(ADT)如下: ADT Sqllist { 数据对象:D={ai|ai ElemSet,i=1,2,3,……,n,n≥0} 数据关系:R1={<ai-1,ai>| ai-1,ai ∈D,i=1,2,3,……,n} 基本操作: (1) void ScanIn(Sqlist &L) //学生信息输入函数 (2) Status ListInsert(Sqlist &L,int i,student e) //插入学生信息到顺序表L中 (3) void SearchName(Sqlist L,Status(*equal)(student,student)) //根据姓名查找顺序表中的记录 (4) void SortorderAscend(Sqlist &L) //按学号升序排列并输出 (5) void DeleteName(Sqlist &L,Status(*equal)(student,student)) //根据姓名删除顺序表中的记录 (6) void ModifyName(Sqlist &L,Status(*equal)(student,student)) //根据姓名修改顺序表中的记录 2) 存储结构 Typedef typedef struct { char num[11]; //学号 char name[10]; //姓名 char sex; //性别 char tel[12]; //电话 char qq[13]; //QQ号 char major[20]; //专业 }student; 3) 流程图 通讯录 主菜单 从数组中导入记录 删除 记录 修改 记录 查询 记录 按学号升序排列并输出 根据姓名删 除 根据学号删除 根据姓名修改 根据学号修改 根据姓名查询 根据学号查询 输入 记录 显示 记录 3、详细设计 通讯录,这个程序能够基本实现记录的输入,查询,修改和删除等一系列操作。下面是一些重要的程序段,将详细介绍这些函数。 一、将学生信息插入到顺序表L中 1) Status ListInsert(Sqlist &L,int i,student e) 2) { 3) int j; 4) student *newbase; 5) if(i<1||i>L.length+1) return ERROR; //i值不合法 6) if(L.length>=L.listsize) //当前存储空间已满,增加分配 7) { 8) newbase=(student *)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student))); 9) if(!newbase) //存储分配失败 10) exit(OVERFLOW); 11) L.elem=newbase; //新基址 12) L.listsize+=LIST_INCREMENT; //增加存储容量 13) } 14) for(j=L.length;j>=i;j--) 15) L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移 16) L.elem[i-1]=e; 17) L.length++; 18) return OK; 19) } 二、根据姓名查找顺序表中的记录 1) void SearchName(Sqlist L,Status(*equal)(student,student)) 2) { student e; 3) int j; 4) printf("请输入你要查找的学生的姓名:"); 5) scanf("%s",e.name); 6) j=LocateElem(L,e,equal); //找到所对应学生的位置 7) if(!j) printf("没有查找到你所要查找的学生记录\n"); 8) else 9) { 10) printf("查找到你所要查找的学生记录其为:\n"); 11) printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); 12) print(L.elem[j-1]); //输出学生信息 13) } 14) } 三、根据学号删除顺序表中的记录 1) void DeleteNum(Sqlist &L,Status(*equal)(student,student)) 2) { 3) system("cls"); 4) student e; 5) int j; 6) printf("请输入待删除记录的学号:"); 7) scanf("%s",e.num); 8) j=LocateElem(L,e,equal); //找到所对应学生的位置 9) if(!j) printf("没有学号为:%s的记录\n",e.num); 10) if(!ListDelete(L,j,e)) printf("删除失败\n"); 11) else printf("删除成功\n"); 12) } 四、根据学号修改顺序表中的记录 1) void ModifyNum(Sqlist &L,Status(*equal)(student,student)) 2) { student e; 3) int j; 4) char s[8]; 5) printf("请输入你要更改的学生的学号:"); 6) scanf("%s",e.num); 7) j=LocateElem(L,e,equal); 8) if(!j) printf("没有查找到你所要更改的学生记录\n"); 9) else 10) { 11) printf("查找到你所要更改的学生记录\n"); 12) printf("请输入你要将该学号更改为:"); 13) jump: scanf("%s",s); 14) for(int i=0;i<L.length;i++) 15) { 16) if(strcmp(L.elem[i].num,s)==0) 17) { 18) printf("该通讯录中已存在这样的学号,请重新输入:"); 19) goto jump; 20) } 21) } 22) strcpy(L.elem[j-1].num,s); 23) printf("更改后该条记录变为:\n"); 24) printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); 25) print(L.elem[j-1]); 26) } 27) } 五、在顺序表L中删除第i个元素 1) Status ListDelete(Sqlist & L,int i,student & e) 2) { 3) int j; 4) if(i<1||i>L.length) //i值不合法 5) return ERROR; 6) else 7) { 8) e=L.elem[i-1]; //p为删除元素的位置 9) for(j=i;j<=L.length;j++) L.elem[j-1]=L.elem[j]; //被删除元素之后的元素左移 10) L.length--; //表长减一 11) return OK; 12) } 六、修改信息 1) int Modify(Sqlist &L) 2) { 3) system("cls"); 4) int i,k; 5) char a[2]; 6) loop: printf("根据学号修改信息请输入: 1, 根据姓名修改信息请输入: 2 \n"); 7) scanf("%d",&k); 8) while(k!=1&&k!=2) 9) { 10) printf("输入有误,请重新输入:"); 11) scanf("%d",&k); 12) } 13) 14) switch(k) 15) { 16) case 1: 17) { 18) ModifyNum(L,EqualNum); 19) printf("你是否想继续修改(y/n)"); 20) scanf("%s",a); 21) if(strcmp(a,"y")==0||strcmp(a,"Y")==0) 22) goto loop; 23) if(strcmp(a,"n")==0||strcmp(a,"N")==0) a) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); 24) } 25) case 2: 26) { 27) ModifyName(L,EqualName);//break; 28) printf("你是否想继续修改(y/n)"); 29) scanf("%s",a); 30) if(strcmp(a,"y")==0||strcmp(a,"Y")==0) 31) goto loop; 32) if(strcmp(a,"n")==0||strcmp(a,"N")==0) 33) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); 34) } 35) } 36) return 0; 37) } 4、程序清单 #include<stdio.h> #include<malloc.h> #include<math.h> #include<string.h> #define FALSE 0 #define ERROR 0 #define OK 1 #define INFEASIBLE -1 #define LIST_INIT_SIZE 10 #define LIST_INCREMENT 5 #define N 5 typedef int Status; typedef struct { char num[11]; //学号 char name[10]; //姓名 char sex; //性别 char tel[12]; //电话 char qq[13]; //QQ号 char major[20]; //专业 }student; typedef struct { student *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储空间(以sizeof(student)为单位) }Sqlist; Sqlist L; //定义全局变量L 为Sqllist类型 Status ListInsert(Sqlist &L,int i,student e) { //插入学生信息到顺序表L中 int j; student *newbase; if(i<1||i>L.length+1) return ERROR; //i值不合法 if(L.length>=L.listsize) //当前存储空间已满,增加分配 { newbase=(student *)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student))); if(!newbase) //存储分配失败 exit(OVERFLOW); L.elem=newbase; //新基址 L.listsize+=LIST_INCREMENT; //增加存储容量 } for(j=L.length;j>=i;j--) L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移 L.elem[i-1]=e; L.length++; return OK; } void InitList(Sqlist &L) { //创建顺序表 L.elem=(student *)malloc(LIST_INIT_SIZE*sizeof(student)); if(!L.elem) exit(OVERFLOW); //存储分配失败 L.length=0; //空表长度 L.listsize=LIST_INIT_SIZE; //初始存储容量 } void ListTraverse(Sqlist L,void(*vi)(student &)) { //显示顺序表中的所有记录 system("cls"); printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); student *p; int i; p=L.elem; for(i=1;i<L.length+1;i++) vi(*p++); printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } void print(student &a) { //学生信息输出 printf("%-10s%-8s",a.num,a.name); if(a.sex=='m') printf(" 男"); else printf(" 女"); printf("%14s %9s % 10s",a.tel,a.qq,a.major); printf("\n"); } int ListLength(Sqlist L) //返回顺序表的长度 { return L.length; } int LocateElem(Sqlist L,student e,Status(*compare)(student,student)) { //返回L中第一个与e满足关系compare的数据的位序, //若这样的数据不存在,则返回为0; int i=1; //i的初值为第1个元素的位序 student *p=L.elem; //p的初值为第1个元素的存储位置 while(i<=L.length&&!compare(*p++,e)) i++; if(i<=L.length) return i; else return ERROR; } Status ListDelete(Sqlist &L,int i,student &e) { //在顺序表L中删除第i个元素,并返回OK int j; if(i<1||i>L.length) //i值不合法 return ERROR; else { e=L.elem[i-1]; //p为删除元素的位置 for(j=i;j<=L.length;j++) L.elem[j-1]=L.elem[j]; L.length--; return OK; } } void wrong() { //错误提示信息输出 printf("you have inputed a wrong number"); printf(" please input the number that is between 0 and 8"); } Status EqualName(student c1,student c2) { //比较两学生姓名 if(strcmp(c1.name,c2.name)) return ERROR; else return OK; } Status EqualNum(student c1,student c2) { //比较两学生的学号 if(!(strcmp(c1.num,c2.num))) return OK; else return ERROR; } void DeleteNum(Sqlist &L,Status(*equal)(student,student)) { //根据学号删除顺序表中的记录 student e; int j; printf("请输入待删除记录的学号:"); scanf("%s",e.num); j=LocateElem(L,e,equal); if(!j) printf("没有学号为:%s的记录\n",e.num); if(!ListDelete(L,j,e)) printf("删除失败\n"); else printf("删除成功\n"); } void DeleteName(Sqlist &L,Status(*equal)(student,student)) { //根据姓名删除顺序表中的记录 student e; int j; printf("请输入待删除记录的姓名:"); scanf("%s",e.name); j=LocateElem(L,e,equal); if(!j) printf("没有姓名为:%s的记录\n",e.name); if(!ListDelete(L,j,e)) printf("删除失败\n"); else printf("删除成功\n"); } int Delete(Sqlist &L) { //修改信息 system("cls"); int i,k; char a[2]; loop: printf("根据学号删除信息请输入: 1, 根据姓名删除信息请输入: 2 \n"); scanf("%d",&k); while(k!=1&&k!=2) { printf("输入有误,请重新输入:"); scanf("%d",&k); } switch(k) { case 1: { DeleteNum(L,EqualNum); printf("你是否想继续删除(y/n)"); scanf("%s",a); if(strcmp(a,"y")==0||strcmp(a,"Y")==0) goto loop; if(strcmp(a,"n")==0||strcmp(a,"N")==0) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } case 2: { DeleteName(L,EqualName); printf("你是否想继续删除(y/n)"); scanf("%s",a); if(strcmp(a,"y")==0||strcmp(a,"Y")==0) goto loop; if(strcmp(a,"n")==0||strcmp(a,"N")==0) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } } return 0; } void ScanIn(Sqlist &L) { //学生信息输入 system("cls"); int i; student e; char a[2]; printf("请输入学生基本信息:\n"); do { student *p=L.elem; printf("请输入学号:"); scanf("%s",e.num); for( i=0;i<L.length;i++) { if(EqualNum(*p++,e)) { printf("此学好已存在\n"); goto jump; } } printf("请输入姓名(<=%d个字符): ",10); scanf("%s",e.name); printf("请输入性别(m:男 f:女)"); scanf("%*c%c",&e.sex); printf("请输入电话号码:"); scanf("%s",e.tel); printf("请输入qq号:"); scanf("%s",e.qq); printf("请输入专业:"); scanf("%s",e.major); printf("请输入你要插入的位置(1≦i≦%d): ",L.length+1); scanf("%d",&i); ListInsert(L,i,e); jump: printf("是否继续输入学生信息(y/n)"); scanf("%s",a); }while(strcmp(a,"y")==0||strcmp(a,"Y")==0); printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } void SortorderAscend(Sqlist &L) { //按学号升序排列并输出 system("cls"); student e; for(int i=0;i<L.length-1;i++) for(int j=0;j<L.length-i-1;j++) { if(strcmp(L.elem[j].num,L.elem[j+1].num)>0) { e=L.elem[j]; L.elem[j]=L.elem[j+1]; L.elem[j+1]=e; } } printf("按照升序排序成功\n"); } void SearchName(Sqlist L,Status(*equal)(student,student)) { //根据姓名查找顺序表中的记录 student e; int j; printf("请输入你要查找的学生的姓名:"); scanf("%s",e.name); j=LocateElem(L,e,equal); //找到所对应学生的位置 if(!j) printf("没有查找到你所要查找的学生记录\n"); else { printf("查找到你所要查找的学生记录其为:\n"); printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); print(L.elem[j-1]); //输出学生信息 } } void SearchNum(Sqlist L,Status(*equal)(student,student)) { //根据学号查找顺序表中的记录 student e; int j; printf("请输入你要查找的学生的学号:"); scanf("%s",e.num); j=LocateElem(L,e,equal); if(!j) printf("没有查找到你所要查找的学生记录\n"); else { printf("查找到你所要查找的学生记录其为:\n"); printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); print(L.elem[j-1]); } } int Search(Sqlist &L) { //修改信息 system("cls"); int i,k; char a[2]; loop: printf("根据学号查找信息请输入: 1, 根据姓名查找信息请输入: 2 \n"); scanf("%d",&k); while(k!=1&&k!=2) { printf("输入有误,请重新输入:"); scanf("%d",&k); } switch(k) { case 1: { SearchNum(L,EqualNum); printf("你是否想继续查找(y/n)"); scanf("%s",a); if(strcmp(a,"y")==0||strcmp(a,"Y")==0) goto loop; if(strcmp(a,"n")==0||strcmp(a,"N")==0) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } case 2: { SearchName(L,EqualName); printf("你是否想继续查找(y/n)"); scanf("%s",a); if(strcmp(a,"y")==0||strcmp(a,"Y")==0) goto loop; if(strcmp(a,"n")==0||strcmp(a,"N")==0) printf("输入 0:退出, 输入8:返回菜单 请输入您的选择: "); } } return 0; } void ModifyNum(Sqlist &L,Status(*equal)(student,student)) { //根据学号修改顺序表中的记录 student e; int j; char s[8]; printf("请输入你要更改的学生的学号:"); scanf("%s",e.num); j=LocateElem(L,e,equal); if(!j) printf("没有查找到你所要更改的学生记录\n"); else { printf("查找到你所要更改的学生记录\n"); printf("请输入你要将该学号更改为:"); jump: scanf("%s",s); for(int i=0;i<L.length;i++) { if(strcmp(L.elem[i].num,s)==0) { printf("该通讯录中已存在这样的学号,请重新输入:"); goto jump; } } strcpy(L.elem[j-1].num,s); printf("更改后该条记录变为:\n"); printf(" 学号 姓名 性别 手机号 QQ号 专业\n"); print(L.elem[j-1]); } } void ModifyName(Sqlist &L,Status(*equal)(student,student)) { //根据姓名修改顺序表中的记录 student e; int j; char s[10]; printf("请输入你要更改的学生的姓名:"); scanf("%s",e.name);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服