完整word版数据结构课程设计学生通讯录.docx
《完整word版数据结构课程设计学生通讯录.docx》由会员分享,可在线阅读,更多相关《完整word版数据结构课程设计学生通讯录.docx(23页珍藏版)》请在冰豆网上搜索。
![完整word版数据结构课程设计学生通讯录.docx](https://file1.bdocx.com/fileroot1/2023-2/8/cf6c4d9c-0b9b-4d14-bcdc-a52e2cde4535/cf6c4d9c-0b9b-4d14-bcdc-a52e2cde45351.gif)
完整word版数据结构课程设计学生通讯录
成绩评定
教师签名
嘉应学院计算机学院
实验报告
课程名称:
数据结构课程设计
开课学期:
2017-2018学年第2学期
班级:
指导老师:
实验题目:
学生通讯录管理系统
学号:
姓名:
上机时间:
1.需求分析
1)输入数据建立通讯录。
2)查询通讯录中满足要求的信息。
3)插入新的通讯录信息。
4)删除不需要的通讯录信息。
5)查看所有的通讯录信息。
2.概要设计
1)界面设计
为了实现“学生通讯录管理系统”各个功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。
************************^@^欢迎使用通讯录系统********************
●1通讯录的建立
●2插入通讯记录
●3查询通讯记录
●4删除通讯记录
●5显示通讯录信息
●6退出管理系统
************************^@^欢迎使用通讯录系统********************
2)储存结构设计
本系统主要采用链表结构类型来表示存储在“学生通讯录管理系统”中的信息。
其中,链表结点有4个分量构成:
通讯录成员学号、通讯录成员姓名、通讯录成员电话号码、指向该结构体的指针。
此外,本系统还设置了一个全局变量seat,表示通讯录中成员的序号。
3)系统功能设计
本系统设置了5个功能菜单,5个子功能的设计描述如下。
建立通讯录系统。
可以一次输入多个成员通讯录的信息,建立通讯录。
该功能由creatIncreLink函数实现。
插入通讯记录。
每次可以插入一个成员通讯录的信息,如果要连续插入多个成员通讯录信息则必须多次选择该功能。
该功能由insetYouXu函数实现。
查询通讯录记录。
可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,二是按照姓名查询。
分别有searchNum函数和searchName函数实现。
删除通讯录记录。
可以对通讯录中不再需要的信息进行删除。
有三种删除方式:
按序号进行deleteElem函数、delNum函数和delName函数实现。
显示通讯录记录。
可以查看通讯录中所有查看通讯录中所有的通讯录成员记录。
该功能由printList函数是实现。
3.详细设计
1)数据类型定义
本系统采用链式结构存储通讯录结点。
结点结构定义如下:
#defineLENsizeof(LNode)
typedefstructLNode
{
intnumber;//学号
charname[20]//姓名
doubletelenum//电话
structLNode*next;
}LNode,*LinkList;
2)系统主要子程序详细设计
建立通讯录链表的函数。
LinkListcreatIncreLink()
{//创建一个存放通讯录成员的非递减有序表,返回头结点地址
LinkListp;
intnum=1,number;
doubletelenum;
charname[20],temp;
LinkListL,P;
L=(LinkList)malloc(LEN);
L->next=NULL;
printf(“请输入学生学号、姓名和电话号码,建立通讯录,以’-1’为输入结束标记\n”);
printf(“请输入学号%d:
”,num);
scanf(“%d”,&number);
printf(“请输入姓名%d:
”,num);
temp=getchar();gets(name);
printf(“请输入电话号码%d:
”,num);
scanf(“%lf”,&telenum);
while(number>=0)
{
p=(LinkList)malloc(LEN);
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYouXu(L,p);
num++;
printf(“请输入学号%d:
“,num);
scanf(“%d”,&number);
printf(“请输入姓名%d:
“,num);
temp=getchar();gets(name);
printf(“请输入电话号码 %d:
“,num);
scanf(“%lf”,&telenum);
}
return(L);
}//end
2)查看通讯录所有记录的函数。
voidprintList(LinkListL)
{//打印头结点地址为L的通讯录
LinkListp=L;
intn=1;
printf(“\n--------\n”);
printf(“学号姓名电话号码\n”);
printf(“--------\n”);
if(L==NULL||L->next==NULL)//判断通讯录是否为空
printf(“该通讯录在中没有元素\n”);
else
while(p->next!
=NULL)
{
printf(“%2d%-9d”,n,p->next->number);
printf(“%5s%.0f\n”,p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf(“------------\n”);
return;
}//end
4.测试分析
1).通讯录的建立
在主菜单下,用户输入1并回车,然后按照提示建立通讯录。
分别依次输入通讯录成员的学号、姓名、电话号码;重复此过程,直至分别输入-1三次,退出。
2).插入通讯记录
在主菜单下,用户输入2并回车,可以插入一个新成员的记录。
按照提示,依次输入学号、姓名、和电话号码后完成插入。
3).查询通讯记录
在主菜单下,用户输入3并回车,可以按照两种方式查询通讯录。
一是按照“学号”查询,二是按“姓名”查询,可按照提示操作。
4).删除通讯录记录
在主菜单下,用户输入4并回车,可以进行通讯录记录的删除。
本系统提供三种删除方式:
分别是按序号、按学号、和按姓名进行删除。
5).显示通讯录信息
在主菜单下,用户输入5并回车,可以查看通讯录中所有的成员信息。
5.源程序清单
详见附件-文件夹:
学生通讯录/main.cpp
6.用户手册
1)本程序执行文件为“学生通讯录管理系统.exe”。
2)进行本系统之后,随即显示系统主菜单界面。
用户可在该界面下输入各个菜单前对应的数字并按下回车键,执行相应子菜单命令。
3)本系统没用提供直接修改通讯录信息的功能,可通过删除和插入操作完成修改功能。
完整代码如下:
#include
#include
#include
#defineLENsizeof(LNode)
/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/
intseat;
typedefstructLNode
{
intnumber;
charname[20];
doubletelenum;
structLNode*next;
}LNode,*LinkList;
//7.找到当前地址元素的直接前驱元素的地址
LinkListprior(LinkListL,LinkListp)
{
LinkListp_prior=L;
if(L->next==NULL)returnL;
while(p_prior->next!
=p)
p_prior=p_prior->next;
return(p_prior);
}
//5.插入一条成员记录,使原通讯录保持有序
voidinsertYouXu(LinkListL,LinkListElem)
{
LinkListp=L->next;
while(p!
=NULL&&(Elem->number)>=(p->number))
{
if(p->number==Elem->number)
{
printf("重复输入!
!
\n");
return;
}
p=p->next;
}
if(p==NULL)
{
p=prior(L,p);
Elem->next=NULL;
p->next=Elem;
}
else
{
p=prior(L,p);
Elem->next=p->next;
p->next=Elem;
}
}
//1.创建链表
LinkListcreatIncreLink()
{
LinkListp;
intnum=1,number;
doubletelenum;
charname[20],temp;
LinkListL,P;
L=(LinkList)malloc(LEN);
L->next=NULL;
printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n");
printf("--------------------------\n");
printf("请输入学号%d:
",num);
scanf("%d",&number);
printf("请输入姓名%d:
",num);
temp=getchar();
gets(name);
printf("请输入电话号码%d:
",num);
scanf("%lf",&telenum);
while(number>=0)
{
p=(LinkList)malloc(LEN);
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYouXu(L,p);
num++;
printf("--------------------------\n");
printf("请输入学号%d:
",num);
scanf("%d",&number);
printf("请输入姓名%d:
",num);
temp=getchar();
gets(name);
printf("请输入电话号码%d:
",num);
scanf("%lf",&telenum);
}
return(L);
}
//2.在通讯录中按序号删除第i个成员
voiddeleteElem(LinkListL,inti)
{
LinkListp=L,q;
intj=0;
while(p->next&&j{
p=p->next;
j++;
}
if(!
(p->next))
{
printf("第%d个元素删除失败\n",i);
return;
}
q=p->next;
p->next=q->next;
free(q);
}
//3.按姓名删除通讯录成员
intdelName(LinkListL,charn[])
{
intflag=0;
LinkListp=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,查找失败\n");
else
{
while(p!
=NULL)
{
if(!
strcmp(p->name,n))
{
flag=1;
printf("%s",p->name);
p=p->next;
deleteElem(L,seat);
}
else
{
p=p->next;
seat++;
}
if(flag)
printf("被删除\n");
}
returnflag;
}
}
//4.按学号删除通讯录成员
intdelNum(LinkListL,intn)
{
intflag=0;
LinkListp=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p!
=NULL)
{
if(p->number==n)
{
flag=1;
printf("%d",p->number);
p=p->next;
deleteElem(L,seat);
}
else
{
p=p->next;
seat++;
}
printf("被删除\n");
returnflag;
}
}
}
//6.输出通讯录L的所有元素
voidprintList(LinkListL)
{
LinkListp=L;
intn=1;
printf("\n----------------------------------------\n");
printf("学号姓名电话号码\n");
printf("----------------------------------------\n");
if(L==NULL||L->next==NULL)
printf("该通讯录中没有元素\n");
else
while(p->next!
=NULL)
{
printf("%2d%-9d",n,p->next->number);
printf("%-5s%.0f\n",p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf("----------------------------------------\n");
return;
}
//8.按姓名查找通讯录成员
intsearchName(LinkListL,charn[])
{
intflag=0;
LinkListp=L->next;
seat=1;
if(L->next==NULL||L==NULL)
printf("该通讯录中没有元素,查找失败!
\n");
else
{
while(p!
=NULL)
{
if(!
strcmp(p->name,n))
{
flag=1;
printf("要查找的是第%d位通讯录成员:
\n",seat);
printf("Number:
%dName:
%sTelephone:
%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;
seat++;
}
}
returnflag;
}
//9.按学号查找通讯录成员
intsearchNum(LinkListL,intn)
{
intflag=0;
LinkListp=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,查找失败\n");
else
{
while(p!
=NULL)
{
if(p->number<=n)
if(p->number==n)
{
flag=1;
printf("要查找的是第%d位通讯录成员:
\n",seat);
printf("学号:
%d姓名:
%s电话号码.:
%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;
seat++;
}
}
returnflag;
}
intmain(intargc,char*argv[]){
LinkListL=NULL;
intflag=0;
intmenu;
system("colorlf");
printf("\n************************^@^欢迎使用通讯录系统**********************\n");
printf("*1通讯录的建立*\n");
printf("*2插入通讯记录*\n");
printf("*3查询通讯记录*\n");
printf("*4删除通讯记录*\n");
printf("*5显示通讯录信息*\n");
printf("*0退出管理系统*\n");
printf("*************************^@^欢迎使用通讯录系统**********************\n");
printf("请选择0-5:
");
scanf("%d",&menu);
while(menu!
=0)
{
switch(menu)
{
case1:
L=creatIncreLink();
printf("建立通讯录:
");
printList(L);
flag=1;
break;
case2:
if(flag==1)
{
intnumber,telenum;
charname[20],temp;
LinkListp;
printf("----------请输入通讯录成员--------\n");
printf("请输入学号:
");
scanf("%d",&number);
printf("请输入姓名:
");
temp=getchar();gets(name);
printf("请输入电话号码:
");
scanf("%d",&telenum);
p=(LinkList)malloc(LEN);
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYouXu(L,p);
printf("插入后:
");
printList(L);
}
else
printf("\nERROR:
通讯录还没有建立,请先建立通讯录\n");
break;
case3:
intway,n,s;
charna[20],temp;
if(L!
=NULL)
{
if(flag)
{
printf("------------------------------------\n");
printf("选择查询方式(1.按学号2.按姓名):
");
scanf("%d",&way);
if(way==1)
{
printf("请输入学号:
");
scanf("%d",&n);
s==searchNum(L,n);
if(s==0)
printf("无此通讯录成员,查询失败!
\n");
}
elseif(way==2)
{
printf("请输入姓名:
");
temp=getchar();gets(na);
s=searchName(L,na);
if(s==0)
printf("无此通讯录成员,查找失败!
\n");
}
elseprintf("通讯录中无记录!
\n");
}
break;
}
elseprintf("通讯录中无记录!
\n");
break;
case4:
printf("选择删除方式:
(1.按序号2.按号3.按姓名):
");
scanf("%d",&way);
if(way==1)
{
intn;
printf("请输入通讯录序号:
");
scanf("%d",&n);
printf("删除后:
\n");
deleteElem(L,n);
printList(L);
}
elseif(way==2)
{
intn,f;
printf("请输入学号:
");
scanf("%d",&n);
f=delNum(L,n);
if(f!
=0)
{
printf("删除后:
\n");
printList(L);
}
elseprintf("无该学号,删除失败!
\n");
}
elseif(way==3)
{
charna[20],temp;
intf;
printf("\n请输入姓名:
");
temp=getchar();gets(na);
f=delName(L,na);
if(f!
=0)
{
printf("删除后:
\n");
printList(L);
}
elseprintf("无该学号,删除失败!
\n");
}
elseprintf("ERROR\n");
break;
case5:
printf(