数据结构课程设计之链表讲解.docx
- 文档编号:3289551
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:30
- 大小:128.55KB
数据结构课程设计之链表讲解.docx
《数据结构课程设计之链表讲解.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之链表讲解.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之链表讲解
《数据结构》课程设计报告
之线性表及应用
信息工程学院
计算机科学与技术
姓名:
XX
班级:
XX
学号:
XX
程序设计书目录
一.课程题目
二.设计目标
三.问题描述
四.需求分析
五.概要设计
六.详细设计(给出算法的伪码描述和流程图)
七.测试分析
八.使用说明
九.测试数据
一十.课程设计总结
一.课程题目:
线性表及应用(班级通讯录管理系统)。
二.设计目标
通过对通讯录管理链表的课程设计,加深对程序设计的理解,熟练掌握和加深c语言的基本知识和语法规范,同时更进一步地理解数据结构对单链表知识的应用,也提高了我们进行程序设计的基本能力。
这次课程设计提供一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力,从而进一步提高了实际运用的能力。
三.问题描述
为某个班级建立一个学生通讯录管理系统,可以方便查询每一个学生的宿舍电话、手机号、及电子邮箱。
其功能包括通讯录链表的建立、学生通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
四.需求分析
建立一个班级通讯录的管理系统,从而方便查询其每个学生的一些通讯信息。
首先,应运用c语言中结构体的知识。
把学生的各项信息储存到结构体的链表中,定义一个新的结构体类型struct(struct是声明结构体时所必须使用的关键字)它向编译系统声明这是一个“结构体类型”,它包括num,name,phone等不同类型的数据项。
其次:
运用数据结构中线性表的知识。
线性表的存储结构分为线性表的线性存储结构和线性表的链式存储结构,线性表的顺序存储结构是指用一组地址连续的存储单元一次存储线性表的数据元素。
线性表的链式存储结构则是通过指针反映元素之间的关系,不要求逻辑上相邻的元素在物理位置上也相邻,所以该方法可以克服顺序表的一些缺点。
所以本题应运用线性链表的链式存储结构。
线性链表的链式存储结构又分为单链表、循环链表和双链表,本题运用单链表的知识。
1.通讯录链表的建立。
建立单链表有两种方法,头插入法和尾插入法。
头插入法是将每次新插入的结点插入在链表的表头,而尾插入法是将新插入的结点插入到链表的表尾。
在这个通讯录的建立中将采用尾插入法建立链表。
2.链表的插入。
链表结点的插入是要求将一个通讯录数据结点按其编号的顺序插入有序通讯录表的相应位置,以保持其有序性。
使用两个指针变量分别指向刚访问的结点和下一个结点,寻找插入结点的位置,其中一个指向待插入位置的前一个结点。
3.链表的查询。
首先输入要查找的通讯录的学号、姓名、宿舍电话号或手机号码,从表头顺序访问表中结点,查找成功则返回指向查找的通讯者信息的结点,否则返回一个空的指针。
4.单链表的删除。
输入要查找的通讯录的学号或者姓名,从表头顺序访问表中结点,查找成功则返回指向查找的通讯者信息的结点,删除结点即可。
5.学生通讯信息的修改。
首先通过链表的查询找到要修改的结点,找到后就可以对的学号、姓名、宿舍电话号码、手机号码、电子邮箱任意一项进行改。
6.通讯录的输出。
将表头指针赋给一个指针变量,然后用其向后扫描,直至表尾,指针为空为止。
五.概要设计
1.本程序主要运用了结构体、线性表(单链表)、及函数调用的相关知识。
A.定义学生通讯录结点类型:
typedefstruct//通讯录结点类型
{
charnum[10];/*学号*/
charname[15];/*姓名*/
charphone[15];/*宿舍电话*/
charcall[15];/*手机号*/
chare_mail[20];/*电子邮箱*/
}datatype;
B.线性表的链式存储结构定义:
typedefstructnode{
datatypedata;/*结点数据域*/
structnode*next;/*结点指针域*/
}Dnode;
typedefstructnode*LinkList;
LinkListhead;
Dnode*p;
2.进入主函数,会出现菜单供我们选择:
选择1,则调用尾插入法建立通讯录链表函数LinkListCreateList();选择2,则调用通讯录链表结点插入函数InsertNode(head,p);选择3,则调用通讯录链表上结点查询函数ListFind(head);选择4,则调用有序通讯录链表结点的删除函数DeleteNode(head);选择5,则调用通讯录链表的输出函数disply(head);;选择6,则调用修改通讯信息函数Dnode*Change(Dnode*head,chark[]);选择0,退出管理系统。
六.详细设计
流程图:
(1)通讯链表的建立
LinkListCreateList(void)/*尾插法建立链表*/
{
Dnode*p,*rear;
LinkListhead=(Dnode*)malloc(sizeof(Dnode));//申请头结点
charflag='y';//intfalg=0;/*结束标志置0*/
rear=head;//尾指针初始指向头结点
while(flag=='y')
{
p=(Dnode*)malloc(sizeof(Dnode));
printf("请输入学号:
\n");
scanf("%s",p->data.num);
printf("请输入姓名:
\n");
scanf("%s",p->data.name);
printf("请输入宿舍电话:
\n");
scanf("%s",p->data.phone);
printf("请输入手机:
\n");
scanf("%s",p->data.call);
printf("请输入电子邮箱:
\n");
scanf("%s",p->data.e_mail);
rear->next=p;//新结点连接到尾结点之后
rear=p;//尾指针指向新结点
printf("继续建表?
(y/n):
");
scanf("%s",&flag);
}
rear->next=NULL;//终端结点指针域置空
returnhead;
}
(2)通讯结点的的插入
voidInsertNode(LinkListhead,Dnode*p)/*插入*/
{
Dnode*p1;
Dnode*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;//p1指向刚访问过的结点
p2=p2->next;//p2指向表的下一个结点
}
p1->next=p;//插入p所指向的结点
p->next=p2;//连接表中剩余部分
}
(3)通讯结点信息的查询
Dnode*ListFind(LinkListhead)//通讯链表上的查找
{
Dnode*p;
charnum[5];
charname[10];
charphone[15];
charcall[15];
intx;
printf("1.按学号查询:
\n");
printf("2.按姓名查询:
\n");
printf("3.按电话号码查询:
\n");
printf("4.按手机号码查询:
\n");
printf("请选择(1-4)的数字:
");
p=head->next;//有头结点
scanf("%d",&x);
if(x==1)
{
printf("请输入要查询者的学号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)!
=0)
p=p->next;
if(p==NULL)
//没有查到要查找的通讯信息
p=NULL;
}
else
if(x==2)
{
printf("请输入要查询者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
if(x==3)
{
printf("请输入要查询者的办公室电话号码:
");
scanf("%s",phone);
while(p&&strcmp(p->data.phone,phone)!
=0)
p=p->next;
}
if(x==4)
{
printf("请输入要查询者的手机号码:
");
scanf("%s",call);
while(p&&strcmp(p->data.call,call)!
=0)
p=p->next;
}
returnp;
}
(4)通讯结点的删除
voidDeleteNode(LinkListhead)/*学生通讯信息的删除*/
{
chara,b;
Dnode*p;
Dnode*q;
charnum[5];
charname[10];
intx;
printf("1.按学号删除\n");
printf("2.按姓名删除\n");
printf("请选择(1或2):
");
p=head->next;
scanf("%d",&x);
if(x==1)
{
printf("请输入要查询者的学号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0)
p=NULL;
}
if(x==2)
{
printf("请输入要查询者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
scanf("%s",&b);
if(p==NULL)
{
printf("对不起没有您要查询者的信息\n");
return;
}
printf("要删除该结点吗?
(y/n):
");
scanf("%s",&a);
if(a=='y'||a=='Y')
{
q=head;
while(q!
=NULL&&q->next!
=p)
q=q->next;
q->next=p->next;/*从链表中删除*/
free(p);//释放被删除的结点
printf("通讯者已经被删除\n");
}
}
(5)通讯信息的输出
voiddisply(LinkListhead)/*学生通讯信息的输出*/
{
Dnode*p;
if(head==NULL)
{
printf("链表为空!
\n");
return;
}
p=head->next;
printf("学号姓名宿舍电话手机号电子邮箱\n");
printf("\n");
while(p!
=NULL)
{
printf("%-5s\t",p->data.num);
printf("%-10s\t",p->data.name);
printf("%-10s\t",p->data.phone);
printf("%-10s\t",p->data.call);
printf("%-15s\t\n",p->data.e_mail);
p=p->next;/*后移一个结点使链表数据项全部输出*/
}
}
(6)通讯信息的修改
Dnode*Change(LinkListhead,chark[])/*员工信息修改*/
{
Dnode*q;
q=ListFind(head);
if(q==0)
{printf("没有要修改的信息!
\n");
return0;
}
else
{
inti;
k[15]='\0';
printf("学号姓名宿舍电话手机号码邮箱\n");
printf("%-5s\t%-10s\t%-10s\t%-10s\t%-15s\t\n",q->data.num,q->data.name,q->data.phone,q->data.call,q->data.e_mail);
printf("1--修改姓名\n");
printf("2--修改宿舍电话号码\n");
printf("3--修改手机号码\n");
printf("4--修改电子邮箱\n");
printf("请选择按键(1-4):
");
scanf("%d",&i);
switch(i)
{
case1:
printf("修改姓名----\n");
strcpy(q->data.name,k);
printf("请输入要改的姓名:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.name,k);
break;
case2:
printf("修改宿舍电话号码----\n");
strcpy(q->data.phone,k);
printf("请输入要修改的号码:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.phone,k);
break;
case3:
printf("修改手机号码----\n");
strcpy(q->data.call,k);
printf("请输入要修改的号码:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.call,k);
break;
case4:
printf("修改电子邮箱----\n");
strcpy(q->data.e_mail,k);
printf("请输入要修改的电子邮箱:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.e_mail,k);
break;
default:
printf("输入错误!
\n");
break;
}
}
returnq;
}
程序源代码
#include
#include"string.h"
#include"stdlib.h"
intflag1=0;
typedefstruct//通讯录结点类型
{
charnum[10];/*学号*/
charname[15];
charphone[15];
charcall[15];
chare_mail[20];
}datatype;
typedefstructnode{
datatypedata;/*结点数据域*/
structnode*next;/*结点指针域*/
}Dnode;
typedefstructnode*LinkList;
LinkListhead;
Dnode*p;
LinkListCreateList(void)/*尾插法建立链表*/
{
Dnode*p,*rear;
LinkListhead=(Dnode*)malloc(sizeof(Dnode));//申请头结点
charflag='y';//intfalg=0;/*结束标志置0*/
rear=head;//尾指针初始指向头结点
while(flag=='y')
{
p=(Dnode*)malloc(sizeof(Dnode));
printf("请输入学号:
\n");
scanf("%s",p->data.num);
printf("请输入姓名:
\n");
scanf("%s",p->data.name);
printf("请输入宿舍电话:
\n");
scanf("%s",p->data.phone);
printf("请输入手机:
\n");
scanf("%s",p->data.call);
printf("请输入电子邮箱:
\n");
scanf("%s",p->data.e_mail);
rear->next=p;//新结点连接到尾结点之后
rear=p;//尾指针指向新结点
printf("继续建表?
(y/n):
");
scanf("%s",&flag);
}
rear->next=NULL;//终端结点指针域置空
returnhead;
}
Dnode*ListFind(LinkListhead)//通讯链表上的查找
{
Dnode*p;
charnum[5];
charname[10];
charphone[15];
charcall[15];
intx;
printf("1.按学号查询:
\n");
printf("2.按姓名查询:
\n");
printf("3.按电话号码查询:
\n");
printf("4.按手机号码查询:
\n");
printf("请选择(1-4)的数字:
");
p=head->next;//有头结点
scanf("%d",&x);
if(x==1)
{
printf("请输入要查询者的学号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)!
=0)
p=p->next;
if(p==NULL)
//没有查到要查找的通讯信息
p=NULL;
}
else
if(x==2)
{
printf("请输入要查询者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
if(x==3)
{
printf("请输入要查询者的办公室电话号码:
");
scanf("%s",phone);
while(p&&strcmp(p->data.phone,phone)!
=0)
p=p->next;
}
if(x==4)
{
printf("请输入要查询者的手机号码:
");
scanf("%s",call);
while(p&&strcmp(p->data.call,call)!
=0)
p=p->next;
}
returnp;
}
Dnode*Change(LinkListhead,chark[])/*员工信息修改*/
{
Dnode*q;
q=ListFind(head);
if(q==0)
{printf("没有要修改的信息!
\n");
return0;
}
else
{
inti;
k[15]='\0';
printf("学号姓名宿舍电话手机号码邮箱\n");
printf("%-5s\t%-10s\t%-10s\t%-10s\t%-15s\t\n",q->data.num,q->data.name,q->data.phone,q->data.call,q->data.e_mail);
printf("1--修改姓名\n");
printf("2--修改宿舍电话号码\n");
printf("3--修改手机号码\n");
printf("4--修改电子邮箱\n");
printf("\n");
printf("请选择按键(1-4):
");
scanf("%d",&i);
printf("\n");
switch(i)
{
case1:
printf("修改姓名----\n");
strcpy(q->data.name,k);
printf("请输入要改的姓名:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.name,k);
break;
case2:
printf("修改宿舍电话号码----\n");
strcpy(q->data.phone,k);
printf("请输入要修改的号码:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.phone,k);
break;
case3:
printf("修改手机号码----\n");
strcpy(q->data.call,k);
printf("请输入要修改的号码:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.call,k);
break;
case4:
printf("修改电子邮箱----\n");
strcpy(q->data.e_mail,k);
printf("请输入要修改的电子邮箱:
\n");
getchar();
gets(k);
printf("\n");
strcpy(q->data.e_mail,k);
break;
default:
printf("输入错误!
\n");
break;
}
}
returnq;
}
voidInsertNode(LinkListhead,Dnode*p)/*插入*/
{
Dnode*p1;
Dnode*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
//p1指向刚访问过的结点
p1=p2;
//p2指向表的下一个结点
p2=p2->next;
}
//插入p所指向的结点
p1->next=p;
//连接表中剩余部分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 讲解