数据结构课程设计 - 班级通讯录管理系统

CHO 贡献于2013-11-28

作者   创建于2012-06-06 01:30:27   修改者chengpeng  修改于2013-11-11 10:43:04字数8758

文档摘要: 设计的目的设计题目及要求设计问题的描述设计算法分析4.1设计流程图4.2功能模块描述程序代码调试情况总结班级通讯录管理系统1.设计目的这次课程设计的目的就是一次综合性的强化训练。使我们明白程序设计语言以及数据结构的具体应用,使我们巩固已学的和掌握但又重要的知识。同时,让我们学习做程序设计的方法和步骤。具体的目的如下:1)使我们更深刻的理解和掌握课程中有关基础知识,以及程序设计思想和方法。2)培养学生综合运用知识和独立思考的能力。
关键词:

 数据结构课程设计一 ————班级通讯录管理系统 设计者:程鹏 学校:榆林学院 院系:信息工程学院 专业:计算机科学与技术 年级:计12本1 学号:1212210138 2013年11月08日 目 录 1. 设计的目的 2. 设计题目及要求 3. 设计问题的描述 4. 设计算法分析 4.1设计流程图 4.2功能模块描述 5. 程序代码 6. 调试情况 7. 总结 班级通讯录管理系统 1.设计目的 这次课程设计的目的就是一次综合性的强化训练。使我们明白程序设计语言以及数据结构的具体应用,使我们巩固已学的和掌握但又重要的知识。同时,让我们学习做程序设计的方法和步骤。具体的目的如下: 1)使我们更深刻的理解和掌握课程中有关基础知识,以及程序设计思想和方法。 2)培养学生综合运用知识和独立思考的能力。 3)培养学生逻辑思维能力和检验学生的逻辑严密性。 4)是对我们对知识掌握的成度,用理论知识解决实际问题的能力,课程设计,表达能力的一次综合考核。 2.设计题目及要求 [1]设计题目:班级通讯录管理系统 [2] 要求: 建立班级通讯录的结构体(学号,姓名,性别,电话,地址,电子邮件)。 ‚建立链表的结点。 ƒ班级通讯录的初始化(即学生信息的录入)。 ④通讯录菜单的建立。 ⑤通讯录信息的插入,查找,修改,删除。 ⑥通讯录的输出。 ⑦程序的退出。 3.设计问题的描述: 为某个班级建立一个学生通讯录管理系统,可以方便查询每一个学生的学号,姓名,性别,电话,地址,及电子邮箱。其功能包括通讯录链表的建立、学生通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 4. 设计算法分析 4.1 设计流程图 4.2 功能模块描述 ①构建Datatype类型结构体(包含学生学号,姓名,性别,电话,地址,电子邮件),以及带头结点的链式存储的声明(结点包含Datatype类型的数据域,以及存储下一个节点地址的指针域)。 typedef struct student//构建结构体 { char num[10]; char name[10]; char sex[2]; char phone[15]; char addr[20]; char email[20]; }Datatype; typedef struct LNode { Datatype data; struct LNode *next; }LNode,*LinkList; ‚主函数 程序运行的开始于结尾。用while()始终循环菜单,用switch() case来选择所要实现的功能,在switch()里面调用selece()菜单函数用。主函数中包括7个函数:菜单函数selece(),学生信息录入函数InitList(),学生信息插入函数Inser(),学生信息查找函数Find(),学生信息删除函数Delete(),学生信息修改函数Change(),学生信息输出函数printList(). void main() {LinkList L;int i; while(TRUE) {switch(selece()){ case 1:printf("##学生信息的录入##\n" ); L=(LinkList )malloc(sizeof(LNode)); L=InitList( L);break; case 2:printf("##学生信息的插入##\n"); printf("请输入插入位置: "); scanf("%d",&i); Inser( L, i);break; case 3:printf("##学生信息的查找##\n"); Find(L);break; case 4:printf("##学生信息的修改##\n"); Change( L);break; case 5:printf("##学生信息的删除##\n"); Delete(L);break; case 6:printf("##信息的输出##\n"); printList( L);break; case 7:printf("!!!!!您已退出程序!!!!!\n"); return; } } } ƒ菜单,用1-7代表不同的功能,来选择所要执行的功能。函数中用了for()循环,当输入的数字为1-7时,返回所选数字到调用selece()的switch()处,当输入数字小于1或大于7时会提示 “输入错误,请从新输入”。 int selece() {int c; printf("*****************************\n"); printf(" 1学生信息的录入:\n\n"); printf(" 2学生信息的插入:\n\n"); printf(" 3学生信息的查找:\n\n"); printf(" 4学生信息的修改:\n\n"); printf(" 5学生信息的删除:\n\n"); printf(" 6信息的输出:\n\n"); printf(" 7退出程序:\n\n"); printf(" 1-7请选择:\n\n"); printf("*****************************\n"); printf("你的选择为: "); for(;;){ scanf("%d",&c); if(c<1&&c>7) printf("输入错误,从新输入: "); else break;} return c; } ④线性表的初始化(学生信息的录入)用head作为形参接收函数传输过来的结点,并以此作为头结点,新建一个结点p使其等于头结点。输入学生人数n,确定要建立的结点个数,建立新结点q,将学生信息存储在q中。然后将q在头结点后依次插入,同时不断调整结点指针使其指向下一个结点,直到p->next=NULL; LinkList InitList(LinkList head) { LinkList p=head,q; int n,i; printf("输入学生人数:"); scanf("%d",&n); for(i=1;idata.num,q->data.name,q->data.sex,q->data.phone,q->data.addr,q->data.email); p->next=q; p=q; } p->next=NULL;//尾结点为空 return head; } ⑤学生信息的插入(在已建立好的学生信息链表中插入)。首先,输入要确定要插入的位置和插入的学生的学号,然后从链表的第一个结点起找所要插入的位置,找到后申请一个新结点用来存储要插入的学生信息,最后把所申请的结点插入即可。 void Inser(LinkList head,int i) { LinkList p=head->next,t; int j=1; while(p!=NULL&&jnext;j++; } t=(LinkList )malloc(sizeof(LNode));//新建一个用于插入的结点 printf("输入学生的学号,姓名,性别,电话,地址,电子邮箱:\n"); scanf("%s%s%s%s%s%s",t->data.num,t->data.name,t->data.sex,t->data.phone,t->data.addr,t->data.email); t->next=p->next;//结点的插入 p->next=t; printf("插入成功\n\n"); } ⑥学生信息的查找。首先,确定查找的方式:按学号,按姓名。然后从第一个结点起向后查找,直至找到为止。找到后并把其学生信息输出。 void Find(LinkList head) { char cz,num[15],name[15]; LinkList p=head->next; printf("** A按学号查找:\n"); printf("** B按姓名查找:\n"); printf("输入查找方式: "); scanf("%s",&cz); switch(cz) { case 'A': printf("输入学号: ");//按学号查找 scanf("%s",&num); while((p!=NULL)&&(strcmp(p->data.num,num)!=0)) p=p->next; break; case 'B':printf("输入姓名: ");//按姓名查找 scanf("%s",&name); while((p!=NULL)&&(strcmp(p->data.name,name)!=0)) p=p->next; break; } if(p)//输出查找的结果 { printf("你要查找的学生:\n学号,姓名,性别,电话,地址,电子邮箱:\n"); printf("%s %s %s %s %s %s\n",p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr, p->data.email); } else printf("查无此人\n\n"); } ⑦修改学生信息。运用删除和插入相结合的方式。首先输入要修个的学生的学号,并找到此结点,然后把此结点删除;最后申请一个新结点,存放新学生的信息,把新结点插入到所删除的位置。 void Change(LinkList head) { LinkList p=head->next,q=head,s,t; char num[15]; printf("请输入要修改的学生的学号: "); scanf("%s",&num); while((p!=NULL)&&(strcmp(p->data.num,num)!=0))//查找要修改的学生 { p=p->next;//要修改的结点 q=q->next;//要修改的结点的前一个结点 } if(p==NULL) { printf("查无此人\n\n"); } else {/*删除要修改的结点*/ s=q->next; q->next=s->next; free(s); /*在删除的位置插入一个新结点*/ t=(LinkList )malloc(sizeof(LNode)); printf("输入新信息:\n学号,姓名,性别,电话,地址,电子邮箱:\n"); scanf("%s%s%s%s%s%s",t->data.num,t->data.name,t->data.sex,t->data.phone,t->data.addr,t->data.email); t->next=q->next;//结点的插入 q->next=t; printf("修改成功\n\n"); } } ⑧ 删除学生信息。先定义两个结点p和q,使p=head->next,q=head.然后输入要删除的学生的学号,用while()循环从第一个结点起(即p=head->next起)找此学生所在的结点。在while循环中不断修改p和q的指向位置,当找到结点时,p也指向次结点(要删除的结点),q指向要删除的结点的前一个结点。 void Delete(LinkList head) { LinkList p=head->next, q=head, s; char num[15]; printf("请输入要删除的学生的学号: "); scanf("%s",&num); while((p!=NULL)&&strcmp(p->data.num,num)!=0)//查找要删除的学生 { p=p->next;//要删除的结点 q=q->next;//要删除的结点的前一个结点 } if(p==NULL) printf("无此学生\n"); else { s=q->next;//删除 q->next=s->next; free(s); printf("删除成功\n\n"); } } ⑨输入所有学生信息。 void printList(LinkList head) { LinkList p=head->next; printf("学号,姓名,性别,电话,地址,电子邮箱:\n"); while(p) { printf("%s %s %s %s %s %s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr,p->data.email); p=p->next; } } 5.程序代码 #include "stdio.h" #include "string.h" #include "malloc.h" #define TRUE 1 typedef struct student//构建结构体 { char num[10]; char name[10]; char sex[2]; char phone[15]; char addr[20]; char email[20]; }Datatype; typedef struct LNode { Datatype data; struct LNode *next; }LNode,*LinkList; /***********菜单**********/ int selece() { int c; printf("*****************************\n"); printf(" 1学生信息的录入:\n\n"); printf(" 2学生信息的插入:\n\n"); printf(" 3学生信息的查找:\n\n"); printf(" 4学生信息的修改:\n\n"); printf(" 5学生信息的删除:\n\n"); printf(" 6信息的输出:\n\n"); printf(" 7退出程序:\n\n"); printf(" 1-7请选择:\n\n"); printf("*****************************\n"); printf("你的选择为: "); for(;;){ scanf("%d",&c); if(c<1&&c>7) printf("输入错误,从新输入: "); else break;} return c; } /* ********学生信息的录入******** */ LinkList InitList(LinkList head) { LinkList p=head,q; int n,i; printf("输入学生人数:"); scanf("%d",&n); for(i=1;idata.num,q->data.name,q->data.sex,q->data.phone,q->data.addr,q->data.email); p->next=q; p=q; } p->next=NULL;//尾结点为空 return head; } /************信息插入************/ void Inser(LinkList head,int i) { LinkList p=head->next,t; int j=1; while(p!=NULL&&jnext;j++; } t=(LinkList )malloc(sizeof(LNode));//新建一个用于插入的结点 printf("输入学生的学号,姓名,性别,电话,地址,电子邮箱:\n"); scanf("%s%s%s%s%s%s",t->data.num,t->data.name,t->data.sex,t->data.phone,t->data.addr,t->data.email); t->next=p->next;//结点的插入 p->next=t; printf("插入成功\n\n"); } /***********查找***********/ void Find(LinkList head) { char cz,num[15],name[15]; LinkList p=head->next; printf("** A按学号查找:\n"); printf("** B按姓名查找:\n"); printf("输入查找方式: "); scanf("%s",&cz); switch(cz) { case 'A': printf("输入学号: ");//按学号查找 scanf("%s",&num); while((p!=NULL)&&(strcmp(p->data.num,num)!=0)) p=p->next; break; case 'B':printf("输入姓名: ");//按姓名查找 scanf("%s",&name); while((p!=NULL)&&(strcmp(p->data.name,name)!=0)) p=p->next; break; } if(p)//输出查找的结果 { printf("你要查找的学生:\n学号,姓名,性别,电话,地址,电子邮箱:\n"); printf("%s %s %s %s %s %s\n",p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr, p->data.email); } else printf("查无此人\n\n"); } /*********修改*********/ void Change(LinkList head) { LinkList p=head->next,q=head,s,t; char num[15]; printf("请输入要修改的学生的学号: "); scanf("%s",&num); while((p!=NULL)&&(strcmp(p->data.num,num)!=0))//查找要修改的学生 { p=p->next;//要修改的结点 q=q->next;//要修改的结点的前一个结点 } if(p==NULL) { printf("查无此人\n\n"); } else {/*删除要修改的结点*/ s=q->next; q->next=s->next; free(s); /*在删除的位置插入一个新结点*/ t=(LinkList )malloc(sizeof(LNode)); printf("输入新信息:\n学号,姓名,性别,电话,地址,电子邮箱:\n"); scanf("%s%s%s%s%s%s",t->data.num,t->data.name,t->data.sex,t->data.phone,t->data.addr,t->data.email); t->next=q->next;//结点的插入 q->next=t; printf("修改成功\n\n"); } } /***********删除************/ void Delete(LinkList head) { LinkList p=head->next, q=head, s; char num[15]; printf("请输入要删除的学生的学号: "); scanf("%s",&num); while((p!=NULL)&&strcmp(p->data.num,num)!=0)//查找要删除的学生 { p=p->next;//要删除的结点 q=q->next;//要删除的结点的前一个结点 } if(p==NULL) printf("无此学生\n"); else { s=q->next;//删除 q->next=s->next; free(s); printf("删除成功\n\n"); } } /***********输出*************/ void printList(LinkList head) { LinkList p=head->next; printf("学号,姓名,性别,电话,地址,电子邮箱:\n"); while(p) { printf("%s %s %s %s %s %s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr,p->data.email); p=p->next; } } void main() { LinkList L; int i; while(TRUE) { switch(selece()) { case 1:printf("##学生信息的录入##\n" ); L=(LinkList )malloc(sizeof(LNode)); //定义一个结点 L=InitList( L); break; case 2:printf("##学生信息的插入##\n"); printf("请输入插入位置: "); scanf("%d",&i); Inser( L, i); break; case 3:printf("##学生信息的查找##\n"); Find(L); break; case 4:printf("##学生信息的修改##\n"); Change( L); break; case 5:printf("##学生信息的删除##\n"); Delete( L); break; case 6:printf("##信息的输出##\n"); printList( L); break; case 7:printf("!!!!!您已退出程序!!!!!\n"); return; } } } 6. 调试情况 7. 总结 这次课程设计是一次综合性的强化训练是对我们对知识掌握的成度,用理论知识解决实际问题的能力,课程设计,表达能力的一次综合考核。使我明白程序设计语言以及数据结构的具体应用,使我巩固已学的和掌握但又重要的知识。同时,让我学会了做程序设计的方法和步骤。更深刻的理解和掌握课程中有关基础知识,以及程序设计思想和方法。提高了综合运用知识和独立思考的能力。逻辑思维能力和检验的逻辑严密性。程序设计中,我发现我对 指针及指针的应用不能很好地理解,还有对带头结点的链表的应用不会。同时我还发现很多基础知识我都遗忘了。通过这次实验

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档