级本科数据结构实验指导书文档格式.docx
- 文档编号:17618467
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:26
- 大小:51.69KB
级本科数据结构实验指导书文档格式.docx
《级本科数据结构实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《级本科数据结构实验指导书文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
size=0;
/*定义初始数据元素个数*/
}
intListLength(SeqListL)
{returnL.size;
}
intListInsert(SeqList*L,inti,DataTypex)
{intj;
for(j=L->
size;
j>
i;
j--)L->
list[j]=L->
list[j-1];
L->
list[i]=x;
/*插入x*/
L->
size++;
/*元素个数加1*/
return1;
}
intListDelete(SeqList*L,inti,DataType*x)
*x=L->
list[i];
/*保存删除的元素到x中*/
for(j=i+1;
j<
=L->
size-1;
j++)L->
list[j-1]=L->
list[j];
size--;
/*数据元素个数减1*/
return1;
intListGet(SeqListL,inti,DataType*x)
{if(i<
0||i>
L.size-1)
{printf("
参数i不合法!
\n"
);
return0;
else
{
*x=L.list[i];
(二)已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc,要求lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表。
(三)完成下列程序,该程序构建如表3所示的带头结点的单链表h,在单链表h中第3个数据元素之前插入如表4所示的数据元素,删除第4个数据元素。
要求生成单链表时,从键盘上读取数据元素,用链式存储结构实现存储。
表3
员工编号
职位
001
文员
002
销售员
004
经理
005
秘书
006
表4
typedefstructNode
{DataTypedata;
structNode*next;
}SLNode;
voidListInitiate(SLNode**head)
{*head=(SLNode*)malloc(sizeof(SLNode));
(*head)->
next=NULL;
intListLength(SLNode*head)
{
SLNode*p=head;
intsize=0;
while(p->
next!
=NULL)
{p=p->
next;
size++;
returnsize;
intListInsert(SLNode*head,inti,DataTypex)
{SLNode*p,*q;
intj;
p=head;
j=-1;
=NULL&
&
i-1)
j++;
if(j!
=i-1)
{printf(“插入位置参数错!
”);
return0;
}
q=(SLNode*)malloc(sizeof(SLNode));
q->
data=x;
next=p->
p->
next=q;
intListDelete(SLNode*head,inti,DataType*x)
{SLNode*p,*s;
next->
next!
s=p->
*x=s->
data;
free(s);
intListGet(SLNode*head,inti,DataType*x)
{SLNode*p;
i)
=i)
{printf(“取元素位置参数错!
*x=p->
voidDestroy(SLNode**head)
{SLNode*p,*p1;
p=*head;
while(p!
=NULL)
{p1=p;
p=p->
free(p1);
*head=NULL;
(四)已知单链表la和lb中的数据元素按非递减有序排列,将la和lb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。
要求不破坏la表和lb表的结构。
(五)约瑟夫环程序:
设有N个人围坐一圈,现从某个人开始报数,数到M的人出列,接着从出列的下一个人开始重新报数,数到M的人以出列,如此下去,直到所有人都出列为此。
试设计确定他们的出列次序序列的程序。
要求选择单向循环链表作为存储结构模拟整个过程,并依次输出列的各人的编号。
如n=8,m=4时,若从第一个人,设每个人的编号依次为1,2,3,…开始报数,则得到的出列次序为4,8,5,2,1,3,7,6,
实验二栈、队列的实现及应用
1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。
2、掌握栈和队列的特点,即先进后出与先进先出的原则。
3、掌握栈和队列的基本操作实现方法。
(一)完成下列程序,该程序实现栈的顺序存储结构,构建顺序栈(栈中的元素依次为R,S,Y,F,C,T),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。
要求生成顺序栈时,从键盘上读取数据元素。
{DataTypestack[MaxStackSize];
inttop;
}SeqStack;
voidStackInitiate(SeqStack*S)
S->
top=0;
intStackNotEmpty(SeqStackS)
if(S.top<
=0)return0;
elsereturn1;
intStackPush(SeqStack*S,DataTypex)
{if(S->
top>
=MaxStackSize)
{
printf("
堆栈已满无法插入!
{S->
stack[S->
top]=x;
top++;
intStackPop(SeqStack*S,DataType*d)
top<
=0)
堆栈已空无数据元素出栈!
top--;
*d=S->
top];
intStackTop(SeqStackS,DataType*d)
{if(S.top<
堆栈已空!
return0;
{*d=S.stack[S.top-1];
(二)完成下列程序,该程序实现栈的链式存储结构,构建链栈(栈中的元素依次为China,Japan,France,India,Australia),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。
要求生成链栈时,从键盘上读取数据元素。
typedefstructsnode
{
DataTypedata;
structsnode*next;
}LSNode;
voidStackInitiate(LSNode**head)
*head=(LSNode*)malloc(sizeof(LSNode));
intStackNotEmpty(LSNode*head)
if(head->
next==NULL)return0;
intStackPush(LSNode*head,DataTypex)
LSNode*p;
p=(LSNode*)malloc(sizeof(LSNode));
next=head->
head->
next=p;
intStackPop(LSNode*head,DataType*d)
{LSNode*p=head->
if(p==NULL)
堆栈已空出错!
"
*d=p->
free(p);
intStackTop(LSNode*head,DataType*d)
LSNode*p=head->
printf("
voidDestroy(LSNode*head)
LSNode*p,*p1;
p1=p;
p=p->
free(p1);
(三)利用顺序栈实现数制转换,输入十进制整数,分别将其转换为八进制数和二进制数。
(四)完成下列程序,该程序实现循环队列的存储和基本操作,构建循环队列(队列中的元素依次为John,Mary,Linda,Mike,Paul),依次进行判断队列是否为空和满操作、入队和出队操作、取得队首元素操作。
DataTypequeue[MaxQueueSize];
intrear;
intfront;
intcount;
}SeqCQueue;
voidQueueInitiate(SeqCQueue*Q)
Q->
rear=0;
front=0;
count=0;
intQueueNotEmpty(SeqCQueueQ)
if(Q.count!
=0)return1;
elsereturn0;
intQueueAppend(SeqCQueue*Q,DataTypex)
if(Q->
count>
0&
rear==Q->
front)
队列已满无法插入!
{Q->
queue[Q->
rear]=x;
rear=(Q->
rear+1)%MaxQueueSize;
count++;
intQueueDelete(SeqCQueue*Q,DataType*d)
count==0)
队列已空无数据元素出队列!
{*d=Q->
front];
front=(Q->
front+1)%MaxQueueSize;
count--;
intQueueGet(SeqCQueueQ,DataType*d)
if(Q.count==0)
队列已空无数据元素可取!
{*d=Q.queue[Q.front];
实验三二叉树的操作及应用
1、进一步掌握指针变量、动态变量的含义。
2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。
3、掌握用指针类型描述、访问和处理二叉树的运算。
(一)完成下列程序,该程序以二叉链表作存储结构,构建如图1所示的二叉树,并依次进行二叉树的前序、中序、后序及层次遍历。
图1
typedefstructNode
structNode*leftChild;
structNode*rightChild;
}BiTreeNode;
/*初始化*/
voidInitiate(BiTreeNode**root)
{*root=(BiTreeNode*)malloc(sizeof(BiTreeNode));
(*root)->
leftChild=NULL;
rightChild=NULL;
voidPreOrder(BiTreeNode*t,voidVisit(DataTypeitem))
/*前序遍历二叉树t,访问操作为Visit()函数*/
{if(t!
{Visit(t->
data);
PreOrder(t->
leftChild,Visit);
rightChild,Visit);
voidInOrder(BiTreeNode*t,voidVisit(DataTypeitem))/*中序t*/
if(t!
{InOrder(t->
Visit(t->
InOrder(t->
voidPostOrder(BiTreeNode*t,voidVisit(DataTypeitem))/*后序*/
{PostOrder(t->
PostOrder(t->
(二)完成下列程序,该程序以二叉链表作存储结构,构建如图2所示二叉树,计算二叉树深度、所有结点总数、叶子结点数、双孩子结点个数、单孩子结点个数。
图2
intBTreeDepth(BiTreeNode*BT)
intleftdep,rightdep;
if(BT==NULL)
return(0);
leftdep=BTreeDepth(BT->
leftChild);
rightdep=BTreeDepth(BT->
rightChild);
if(leftdep>
rightdep)
return(leftdep+1);
else
return(rightdep+1);
intnodecount(BiTreeNode*BT)
return(0);
return(nodecount(BT->
leftChild)+nodecount(BT->
rightChild)+1);
intleafcount(BiTreeNode*BT)
elseif(BT->
leftChild==NULL&
BT->
rightChild==NULL)
return
(1);
return(leafcount(BT->
leftChild)+leafcount(BT->
rightChild));
intnotleafcount(BiTreeNode*BT)
return(notleafcount(BT->
leftChild)+notleafcount(BT->
intonesoncount(BiTreeNode*BT)
elseif((BT->
rightChild!
=NULL)||
(BT->
leftChild!
=NULL&
rightChild==NULL))
return(onesoncount(BT->
leftChild)+onesoncount(BT->
return(onesoncount(BT->
inttwosoncount(BiTreeNode*BT)
leftChild==NULL||BT->
return(twosoncount(BT->
leftChild)+twosoncount(BT->
=NULL)
return(twosoncount(BT->
(三)用非递归方式遍历图2所示的二叉树(先序、中序或后序),输出遍历序列。
实验四图的操作及应用
1、理解图的基本概念及术语。
2、掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法。
3、熟练掌握图的两种遍历(深度优先搜索遍历和广度优先搜索遍历)的算法思想、步骤,并能列出在两种存储结构上按上述两种遍历算法得到的序列。
4、理解最小生成树的概念,能按Prim算法构造最小生成树。
二、实现内容
(一)完成下列程序,该程序构造如图1所示的图的邻接矩阵存储结构。
/*邻接矩阵*/
typedefstruct
SeqListVertices;
intedge[MaxVertices][MaxVertices];
intnumOfEdges;
}AdjMGraph;
voidInitiate(AdjMGraph*G,intn)
inti,j;
for(i=0;
i<
n;
i++)
for(j=0;
j++)
if(i==j)G->
edge[i][j]=0;
elseG->
edge[i][j]=MaxWeight;
G->
numOfEdges=0;
/*边的条数置为0*/
ListInitiate(&
G->
Vertices);
/*顺序表初始化*/
voidInsertVertex(AdjMGraph*G,DataTypevertex)
ListInsert(&
Vertices,G->
Vertices.size,vertex);
voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)
if(v1<
0||v1>
Vertices.size||v2<
0||v2>
Vertices.size)
参数v1或v2越界出错!
\n"
exit
(1);
edge[v1][v2]=weight;
numOfEdges++;
introw;
//行下标
intcol;
//列下标
intweight;
//权值
}RowColWeight;
voidCreatGr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 数据结构 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)