数据结构课程设计.docx
- 文档编号:25245903
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:35
- 大小:228.19KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(35页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
计算机科学与技术学院
课程设计报告
课程名称:
数据结构
专业:
计算机科学与技术
一、仓库管理系统
1.题目要求
使用链表实现一个仓库管理系统,仓库商品的属性包括(商品编号,商品名称,商品数量),借助计算机来完成如下功能:
(1)入库:
可以录入商品信息,包括:
商品编号,商品名称,商品数量,商品价格;
(2)出库:
可以删除一定数量的指定商品名称的商品,商品不够给出提示。
(3)修改:
修改指定商品编号或者商品名称的价格。
(4)删除:
可以删除指定商品编号、商品名称的商品记录。
(5)查询:
可以查询所有商品信息;或指定商品编号、商品名称的商品信息。
(6)排序:
可以根据价格或数量对商品进行排序,并显示排序结果。
typedefstruct{//仓库管理结点类型
charNO[10];//商品编号
charname[30];//商品名称
charcount[5];//商品数量
charpricet[10];//商品价格
}DataType;
2.应用程序功能
开始运行时界面如下:
仓库管理链表建立界面如下:
仓库管理链表插入界面如下:
仓库管理链表查询界面如下:
按商品编号查询界面如下:
仓库管理链表删除界面如下:
仓库管理链表排序界面:
仓库管理链表输出界面如下:
3.输入数据类型、格式和内容限制
输入数据类型为字符型,但在输入过程中不可出现空格,如在输入商品名称时不可出现空格。
4.主要模块的算法描述
流程图:
5.核心算法描述
定义仓库节点类型
typedefstruct{//仓库管理结点类型
charNO[10];//商品编号
charname[30];//商品名称
charcount[5];//商品数量
charprice[10];//商品价格
}DataType;
typedefstructnode{//结点类型定义
DataTypedata;//结点数据域
structnode*next;//结点指针域
}ListNode;
/*******尾插法建立带头结点的仓库管理链表算法*******/
LinkListCreateList(void)
{
LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点
ListNode*p,*rear;
charflag='y';//intflag=0;//结束标志置0
rear=head;//尾指针初始指向头结点
while(flag=='y')
{
p=(ListNode*)malloc(sizeof(ListNode));//申新结点
printf("商品编号(10)商品名称(30)商品数量(5)商品价格(10)\n");
printf("-----------------------------------------------\n");
printf("\n添加商品编号:
\n");
cin>>p->data.NO;
printf("\n添加商品名称:
\n");
cin>>p->data.name;
printf("\n添加商品数量:
\n");
cin>>p->data.count;
printf("\n添加商品价格:
\n");
cin>>p->data.price;
rear->next=p;//新结点连接到尾结点之后
rear=p;//尾指针指向新结点
printf("继续添加记录?
(y/n):
");
cin>>flag;
}
rear->next=NULL;//终端结点指针置空
returnhead;//返回链表头指针
}
/*********在仓库管理链表head中插入结点************/
voidInsertNode(LinkListhead,ListNode*p)
{
ListNode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.NO,p->data.NO)<0)
{
p1=p2;//p1指向刚访问过的结点
p2=p2->next;//p2指向表的下一个结点
}
p1->next=p;//插入p所指向的结点
p->next=p2;//连接表中剩余的结点
}
/**********有序仓库管理链表的查找****************/
ListNode*ListFind(LinkListhead)
{
ListNode*p;
charnum[10];
charname[9];
charpp;
printf("==================\n");
printf("a.按商品编号查询\n");
printf("b.按商品名称查询\n");
printf("==================\n");
printf("请选择:
");
p=head->next;
cin>>pp;
getchar();
if(pp=='a'||pp=='A')
{
printf("请输入要查找的商品编号:
");
cin>>num;
while(p&&strcmp(p->data.NO,num)<0)p=p->next;
if((p==NULL)||strcmp(p->data.NO,num)>0)p=NULL;//没有查到要查找的商品信息
}
else
if(pp=='b'||pp=='B')
{
printf("请输入要查找的商品名称:
");
cin>>name;
while(p&&strcmp(p->data.name,name)!
=0)p=p->next;
}
returnp;
}
/********仓库管理链表上的结点删除*****************/
voidDelNode(LinkListhead)
{
charjx;
ListNode*p,*q;
p=ListFind(head);//调用查找函数
if(p==NULL)
{
printf("没有查到要删除的商品信息!
\n");
return;
}
if(p!
=NULL)printf("真的要删除该商品吗?
(y/n):
");
cin>>jx;
if(jx=='y'||jx=='Y')
{
q=head;
while((q!
=NULL)&&(q->next!
=p))q=q->next;
q->next=p->next;//删除结点
free(p);//释放被删结点空间
printf("删除成功!
\n");
}
}
/********仓库管理链表的输出函数**********/
voidPrintList(LinkListhead)
{
ListNode*p;
p=head->next;
printf("商品编号(10)商品名称(30)商品数量(5)商品价格(10)\n");
printf("--------------------------------------------------------------------------------\n");
while(p!
=NULL)
{
printf("%15s%20s%23s%15s\n",p->data.NO,p->data.name,p->data.count,p->data.price);
printf("---------------------------------------------------------------------------------\n");
p=p->next;//后移一个结点
}
}
二、教学计划安排系统
1.题目要求
学校每学期开设的课程是有先后顺序的,如开设《数据结构》课程之前,必须开设《离散数学》和《程序设计基础》。
给定课程先后顺序如下图所示,选择物理存储方式,存储该课程关系图。
编程实现拓扑排序算法,合理安排开设各门课程的先后顺序。
2.应用程序功能
开始时运行界面:
输入课程操作界面:
输入课程门数操作界面:
输入各课程之间关系操作界面:
最终拓扑排序输出结果:
3.主要模块的算法描述
流程图:
4.核心算法描述
//filenetwork.h
#ifndefNetwork_
#defineNetwork_
#include"lqueue.h"
#include"lstack.h"
classNetwork{
public:
virtualintBegin(inti)=0;
virtualintNextVertex(inti)=0;
virtualvoidInitializePos()=0;
virtualvoidDeactivatePos()=0;
virtualintVertices()const=0;
virtualintEdges()const=0;
voidBFS(intv,intreach[],intlabel);
voidDFS(intv,intreach[],intlabel);
boolFindPath(intv,intw,int&length,intpath[]);
boolTopological(intv[]);
private:
voiddfs(intv,intreach[],intlabel);
boolfindPath(intv,intw,int&length,
intpath[],intreach[]);
};
voidNetwork:
:
BFS(intv,intreach[],intlabel)
{
LinkedQueue
InitializePos();
reach[v]=label;
Q.Add(v);
while(!
Q.IsEmpty()){
intw;
Q.Delete(w);
intu=Begin(w);
while(u){
if(!
reach[u]){
Q.Add(u);
reach[u]=label;}
u=NextVertex(w);
}
}
DeactivatePos();
}
voidNetwork:
:
DFS(intv,intreach[],intlabel)
{
InitializePos();
dfs(v,reach,label);
DeactivatePos();
}
voidNetwork:
:
dfs(intv,intreach[],intlabel)
{
reach[v]=label;
intu=Begin(v);
while(u){
if(!
reach[u])dfs(u,reach,label);
u=NextVertex(v);}
}
boolNetwork:
:
FindPath
(intv,intw,int&length,intpath[])
{//寻找由v到w的一条路径,并在path中保存其路径和长度
//起点始终为v
path[0]=v;
length=0;//当前的路径长度
if(v==w)returntrue;
intn=Vertices();
InitializePos();
int*reach=newint[n+1];
for(inti=1;i<=n;i++)
reach[i]=0;
boolx=findPath(v,w,length,path,reach);
DeactivatePos();
delete[]reach;
returnx;
}
boolNetwork:
:
findPath(intv,intw,int&length,
intpath[],intreach[])
{
reach[v]=1;
intu=Begin(v);
while(u){
if(!
reach[u]){
length++;
path[length]=u;
if(u==w)returntrue;
if(findPath(u,w,length,path,reach))
returntrue;
length--;
}
u=NextVertex(v);}
returnfalse;
}
boolNetwork:
:
Topological(intv[])
{//计算有向图中顶点的拓扑次序
//如果存在如此的拓扑次序则返回true
//并将拓扑次序返回在数组v[]中
//如果不存在则返回false
intn=Vertices();
//计算入度
int*InDegree=newint[n+1];
InitializePos();
for(inti=1;i<=n;i++)//先对每个顶点的入度进行初始化,都置为0
InDegree[i]=0;
for(i=1;i<=n;i++){//从i出发的顶点
intu=Begin(i);
while(u){
InDegree[u]++;//相应的改变对应定点的入度
u=NextVertex(i);}
}
//将入度为0的顶点先压入堆栈
LinkedStack
for(i=1;i<=n;i++)
if(!
InDegree[i])S.Add(i);
//开始创建拓扑次序
i=0;//数组v的游标
while(!
S.IsEmpty()){//从堆栈中选择一个入度为零的顶点
intw;
S.Delete(w);//将该顶点从堆栈中删除
v[i++]=w;//并将其加入到数组v中
intu=Begin(w);
while(u){//更新个顶点的入度
InDegree[u]--;//对于所有与w相连的并被w所指向的顶点,它们的入度都减以
if(!
InDegree[u])S.Add(u);//并再次对堆栈进行改变
u=NextVertex(w);}
}
DeactivatePos();
delete[]InDegree;
return(i==n);
}
#endif;
//文件awd.h
//加权有向图的类
#ifndefAdjacencyWDigraph_
#defineAdjacencyWDigraph_
#include
#include
#include"fchain.h"
#include"network.h"
#include"citer.h"
#include"wnetwork.h"
#include"swap.h"
#include"make2db.h"
#include"del2d.h"
template
template
classAdjacencyWDigraph:
virtualpublicNetwork,
virtualpublicWNetwork
friendAdjacencyWGraph
friendclassAdjacencyGraph;
public:
AdjacencyWDigraph
(intVertices=10,TnoEdge=1000);
~AdjacencyWDigraph(){
Delete2DArray(a,n+1);
}
boolExist(inti,intj)const;
intEdges()const{returne;}
intVertices()const{returnn;}
AdjacencyWDigraph
(inti,intj,constT&w);
AdjacencyWDigraph
intOutDegree(inti)const;
intInDegree(inti)const;
voidShortestPaths(ints,Td[],intp[]);
voidOutput()const;
voidInitializePos(){pos=newint[n+1];}
voidDeactivatePos(){delete[]pos;}
intBegin(inti);
intNextVertex(inti);
voidFirst(inti,int&j,T&c);
voidNext(inti,int&j,T&c);
voidAlltp(intindex);
TTSP(intv[]);
TBBTSP(intv[]);
boolEmpty()
{
for(inti=1;i<=n-1;i++)
if(a[n][i]!
=1)
returnfalse;
returntrue;
}
voidSet(char**newname,intn)
{
name=newname;
}
private:
voidtSP(inti);
TNoEdge;
intn;//顶点数
inte;//边数
T**a;//矩阵
int*pos;
intq[11];
char**name;
};
template
voidAdjacencyWDigraph
:
Alltp(intindex)
{
if(Empty()){//图为空输出已完成的序列
for(inti=1;i<=n-1;i++)
cout< cout< } else{ intInDegree[11]; //先对每个顶点的入度进行初始化,都置为0 for(inti=1;i<=n;i++) InDegree[i]=0; //由图判断各顶点的入度 for(inti1=1;i1<=n;i1++){//从i出发的顶点 for(intj2=1;j2<=n;j2++) if(a[i1][j2]==1) InDegree[j2]++; } //统计所有入度为零的顶点 intnv=0;//记录入度为零的个数 intarray[11];//用于保存入度为零的顶点 for(inti2=1;i2<=n;i2++){ if(InDegree[i2]==0&&i2! =n){ nv++;array[nv]=i2; } } if(nv==0) cout<<"没有拓扑序列"< else{//如果有如度为0的顶点 for(inti=1;i<=nv;i++){ intv=array[i]; intta[11];//辅助数组用来保存欲删顶点及其边 for(intj=0;j<=10;j++) ta[j]=0; //将删除的顶点写入序列数组中 q[index]=v; //删除边 for(intj3=1;j3<=n;j3++) { if(a[v][j3]==1) { a[v][j3]=NoEdge; ta[j3]=j3; } } //运用标记法使被删的顶点失效 Add(n,v,1); //运用回溯递归法 Alltp(index+1); //同样运用标记法再加入删除的顶点 Delete(n,v); //依次恢复被删的边 for(intj1=1;j1<=n;j1++){ if(ta[j1]! =0){ Add(v,j1,1); } } } } } } template AdjacencyWDigraph : : AdjacencyWDigraph(intVertices,TnoEdge) {//构造函数. n=Vertices; e=0; NoEdge=noEdge; Make2DArray(a,n+1,n+1); //初始化为没有任何边 for(inti=1;i<=n;i++) for(intj=1;j<=n;j++) a[i][j]=NoEdge; } template boolAdjacencyWDigraph : Exist(inti,intj)const {//边(i,j)是否存在? if(i<1||j<1||i>n||j>n ||a[i][j]==NoEdge)returnfalse; returntrue; } template AdjacencyWDigraph : : Add(inti,intj,constT&w) {//增加权重为w的边(i,j) if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计