南阳理工学院软件学院数据结构上机实验指导书全部附标准答案.docx
- 文档编号:28361152
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:33
- 大小:24.92KB
南阳理工学院软件学院数据结构上机实验指导书全部附标准答案.docx
《南阳理工学院软件学院数据结构上机实验指导书全部附标准答案.docx》由会员分享,可在线阅读,更多相关《南阳理工学院软件学院数据结构上机实验指导书全部附标准答案.docx(33页珍藏版)》请在冰豆网上搜索。
南阳理工学院软件学院数据结构上机实验指导书全部附标准答案
南阳理工学院
数据结构上机实验指导书
(2011版)
答案(仅内供)
软件学院·软件工程教研室
2011.3
实验1线性表应用
一、实验目的
1.了解和掌握线性表顺序存储和链式存储在计算机中的表示,基本操做在计算机中的实现。
2.能够利用线性表结构对实际问题进行分析建模,利用计算机求解。
3.能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。
二、实验内容及步骤
1.利用程序设计语言分别实现顺序表和链表的抽象数据类型。
2.掌握程序分文件(头文件和实现文件)书写的方式。
3.分别用顺序表和链表实现课本算法2.2:
合并两个非递减有序序列,并对其时间性能做出分析。
●顺序表的非递减数列合并
实验2栈和队列的应用
一、实验目的
1.掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。
2.熟练掌握栈类型的两种实现方法。
3.熟练掌握循环队列和链队列的基本操作实现算法。
二、实验内容及步骤
1.用程序设计语言实现栈和队列的抽象数据类型。
2.在第一题的基础上完成以下选择:
选择一:
1)设计并实现括号匹配算法。
2)用队列实现在屏幕上打印杨辉三角。
选择二:
分别用栈和队列实现迷宫问题求解。
选择三:
分别用栈和队列实现一个列车调度系统。
●括号匹配算法。
#include
#include
#include
#include"string.h"
return0;
}
intPushStack(LinkStacktop,DataTypee)
/*进栈操作就是要在链表的第一个结点前插入一个新结点,进栈成功返回1*/
{
LStackNode*p;/*定义指向第i个元素的前驱结点指针pre,指针p指向新生成的结点*/
if((p=(LStackNode*)malloc(sizeof(LStackNode)))==NULL)
{
printf("内存分配失败!
");
exit(-1);
}
p->data=e;/*指针p指向头结点*/
p->next=top->next;
top->next=p;
return1;
}
intPopStack(LinkStacktop,DataType*e)
/*删除单链表中的第i个位置的结点。
删除成功返回1,失败返回0*/
{
LStackNode*p;
p=top->next;
if(!
p)/*判断链栈是否为空*/
{
printf("栈已空");
q=p;
p=p->next;
free(q);
}
}
intGetTop(LinkStacktop,DataType*e)
{
LStackNode*p;
p=top->next;
if(!
p)/*判断链栈是否为空*/
{
printf("栈已空");
return0;
}
*e=p->data;/*将出栈元素赋值给e*/
return1;
}
voidmain()
{
case'[':
case'{':
PushStack(S,*p++);
break;
case')':
case']':
case'}':
if(StackEmpty(S))
{
else
{
GetTop(S,&e);
printf("缺少右括号.\n");
}
intMatch(DataTypee,DataTypech)
{
if(e=='('&&ch==')')
return1;
elseif(e=='['&&ch==']')
return1;
elseif(e=='{'&&ch=='}')
return1;
else
return0;
typedefstructQNode
{
DataTypedata;
structQNode*next;
}LQNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
voidInitQueue(LinkQueue*LQ)
/*将返回1,否则返回0*/
return1;
else
return0;
}
intEnterQueue(LinkQueue*LQ,DataTypee)
/*将元素e插入到链式队列LQ中,插入成功返回1*/
{
LQNode*s;
LQ->rear=s;/*将队尾指针指向p*/
return1;
}
//intDeleteQueue(LinkQueue*LQ,DataType*e)
///*删除链式队列中的队头元素,并将该元素赋值给e,删除成功返回1,否则返回0*/
//{
//LQNode空*/
return0;
else
{
s=LQ.front->next;/*将指针p指向队列的第一个元素即队头元素*/
*e=s->data;/*将队头元素赋值给e,取出队头元素*/
return1;
}
}
/*出队操作。
*/
intDeleteQueue(LinkQueue*Q,DataType*x)
{
/*将队列Q的队头元素出队,并存放到x所指的存储空间中*/
LQNode*p;
if(Q->front==Q->rear)
retu
/*产生第中间n-2行的元素*/
for(n=2;n<=N;n++)/*产生第i行元素并入队,同时将第i-1行的元素保存在临时数组中*/
{
k=0;
EnterQueue(&Q,1);/*第i行的第一个元素入队*/
for(i=1;i<=n-2;i++)/*利用队列中第i-1行元素产生第i行的中间i-2个元素并入队列*/
{
DeleteQueue(&Q,&t);
temp[k++]=t;/*将第i-1行的元素存入临时数组*/
while(!
QueueEmpty(Q))/*将最后一行元素存入临时数组*/
{
DeleteQueue(&Q,&t);
temp[k++]=t;
if(QueueEmpty(Q))
PrintArray(temp,k,N);
}
}
voidmain()
{
intn;
printf("请输入要打印的行数:
n=:
");
scanf("%d",&n);
YangHuiTriangle(n);
}
}
用栈实现迷宫问题求解
#include
#include
#defineOVERFLOW-1
#defineMAX100
typedefstruct
{
intx;
inty;
intd;
}Data;
typedefstruct
{
intpos;
Datadata[MAX];
}SNode,*Stack;
StackInitStack()
{
StackpStack;
pStack=(Stack)malloc(sizeof(SNode));
if(!
pStack)
if(pStack->pos==-1)
exit(OVERFLOW);
else
pStack->pos--;
}
DataGetTop(StackpStack)
{
revoidDisplayPath(StackpStack)
{
Dataelement;
printf("Thepathis:
\n");
while(!
IsEmpty(pStack))
{
element=GetTop(pStack);
Pop(pStack);
printf("Thenodeis:
(%d,%d)\n",element.x,element.y);
}
}
voidMazePa{
inti,j,k,g,h;
StackpStack;
Dataelement;
pStack=InitStack();
maze[x1][y1]=2;
h=j+direction[k][1];
if(g==x2&&h==y2&&maze[g][h]==0)
{
Push(pStack,SetStackElem(i,j,k));
Push(pStack,SetStackElem(x2,y2,k));
DisplayPath(pStack);
return;
}
inti,j;
printf("Themazeis:
\n");
for(i=0;i<8;i++)
{for(j=0;j<11;j++)
printf("%2d",maze[i][j]);
printf("\n");
};
MazePath(maze,direction,1,1,6,9);
}
用队列实现迷宫问题求解
#include
#definer64
#definem28
#definen210
intm=m2-2,n=n2-2;
typedefstruct
{
intx,y;//行列坐标
{
inti,j,k,v,front,rear,x,y;
intmark[m2][n2];
for(i=0;i for(j=0;j mark[i][j]=0; printf("PleaseInputmovearray\n"); for(i=0;i<8;i++) { scanf("%d,%d",&move[i].x,&move[i].y); sq[1].x=1; sq[1].y=1; sq[1].pre=0; front=1; rear=1; mark[1][1]=1;//标记入口以到达过 while(front<=rear) { x=sq[front].x; y=sq[front].y;//(x,y)为出发点 for(v=0;v<8;v++)//搜索(x,y)的8个相邻(i,j)是否可以到达 { for(i=1;i<19;i++) printf("%3d",i); printf("\n"); for(i=1;i<19;i++) printf("%3d",sq[i].x); printf("\n"); for(i=1;i<19;i++) printf("%3d",sq[i].y); printf("\n"); for(i=1;i<19;i++) printf("%3d",sq[i].pre); printf("\n"); return (1);//成功返回 } } front++;//出队,front指向新的出发点 } } //队空,循环结束 printf("Thereisnopath! \n"); return(0);//迷宫没有路径返回 } main() { inti,j; for(i=0;i<10;i++) { maze[0][i]=1; maze[7][i]=1; } for(i=0;i<8;i++) { maze[i][0]=1; maze[i][9]=1; } /*for(i=1;i<7;i++) for(j=1;j<9;j++) { printf("%d%d",i,j); scanf("%d",&maze[i][j]); }*/ maze[1][1]=0;maze[1][2]=1;maze[1][3]=0;maze[1][4]=1;maze[1][5]=1;mazprintf("\n"); for(i=0;i<8;i++) { for(j=0;j<10;j++) printf("%d",maze[i][j]); printf("\n"); } PATH(maze); } 分别用队列实现一个列车调度系统。 实验3树的应用 一、实验目的 1.领会并理解二叉树的类型定义。 2.熟练掌握二叉树的主要特性,。 3.熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作。 4.熟练掌握二叉树和树的各种存储结构及其建立的算法。 5.了递归算法的实现过程。 二、实验内容及步骤 1.实现二叉树的抽象数据类型。 2.构造一棵二叉树并用递归实现其先序、中序、后序遍历算法并验证。 3.用非递归算法实现二叉树的中序遍历。 4.给出一段报文和每个字符出现的概率,对其进行哈夫曼编码和解码。 ●二叉树递归实现其先序、中序、后序遍历算法并验证。 #include #include #defineMaxSize50 typedefintKeyType; typedefstruct/*数据元素类型定义*/ if(low { pivot=Partition(L,low,high);/*将待排序序列L.r[low..high]划分为两部分*/ DispList2(*L,pivot,count);/*输出每次划分的结果*/ count++; QSort(L,low,pivot-1);/*对左边的子表进行递归排序,pivot是枢轴位置*/ QSort(L,pivot+1,high);/*对右边的子表进行递归排序*/ } } voidQuickSort(SqList*L) /*对顺序表L作快速排序*/ { QSort(L,1,(*L).length); inti,n=10; SqListL; /*冒泡排序*/ InitSeqList(&L,a,n); printf("冒泡排序前: "); DispList(L); BubbleSort(&L,n); printf("冒泡排序结果: "); DispList(L,n); /*快速排序*/ InitSeqList(&L,a,n); printf("快速排序前: "); DispList(L,n); QuickSort(&L,n); printf("快速排序结果: "); DispList(L); } voidInitSeqList(SqList*L,DataTypea[],intn) /* DataTypet; /*将第i个元素的关键字与后面[i+1...n]个元素的关键字比较,将关键字最小的的元素放在第i个位置*/ for(i=1;i<=n-1;i++) { j=i; for(k=i+1;k<=n;k++)/*关键字最小的元素的序号为j*/ if(L->data[k].key j=k; if(j! =i)/*如果序号i不等于j,则需要将序号i和序号j的元素交换*/ { t=L->data[i]; L->data[i]=L->data[j]; L->data[j]=t; } } } voidCreateHeap(SqList*H,intn) /*建立大顶堆*/ { inti; for(i=n/2;i>=1;i--)/*从序号n/2开始建立大顶堆*/ AdjustHeap(H,i,n); } voidAdjustHeap(SqList*H,ints,intm) /*调整H.data[s...m]的关键字,使其成为一个大顶堆*/ { DataTypet; intj; t=(*H).data[s];/*将根结点暂时保存在t中*/ for(j=2*s;j<=m;j*=2) { if(j j++;/*j为关键字较大的结点的下 s=j; } (*H).data[s]=t;/*将根结点插入到正确位置*/ } voidHeapSort(SqList*H) /*对顺序表H进行堆排序*/ { DataTypea[]={56,22,67,32,59,12,89,26,48,37}; intdelta[]={5,3,1}; inti,n=10,m=3; SqListL; /*简单选择排序*/ InitSeqList(&L,a,n); printf("排序前: "); DispList(L,n); SelectSort(&L,n); printf("简单选择排序结果: "); DispList(L,n); /*堆排序*/ { L->data[i]=a[i-1]; } L->length=n; } voidDispList(SqListL,intn) /*输出表中的元素*/ { inti; for(i=1;i<=n;i++) printf("%4d",L.data[i].key); printf("\n"); } 实验4图论及其应用 一、实验目的 1.了解图的基本概念及术语,并能够熟练掌握图的两种存储结构(邻接矩阵和邻接表)。 2.理解最小生成树的概念,能按Prim算法构造最小生成树。 3.掌握图的两种遍历(深度优先搜索遍历和广度优先搜索遍历)、拓扑排序、关键路径、最短路径的算法思想。 二、实验内容及步骤 1.实现网(有权图)的存储结构。 2.利用prim算法构造它的最小生成树。 3.选择一个源点,寻找从原点出发到达其它顶点的最短路径。 ●实现网(有权图)的存储结构。 v邻接矩阵存储结构 #include #defineListSize100 /*合并顺序表A和B的元素到C中,并保持元素非递减排序*/ { inti,j,k; DataTypee1,e2; i=1;j=1;k=1; while(i<=A.length&&j<=B.length) { GetElem(A,i,&e1);/*取出顺序表A中的元素*/ Ge { InsertList(C,k,e2);/*将较小的一个插入到C中*/ j++;/*往后移动一个位置,准备比较下一个元素*/ k++; } } GetElem(A,i,&e1); InsertList(C,k,e1);/*将A中剩余元素插入到C中*/ i++; k++; } while(j<=B.length)/*如果B中元素还有剩余,这时A中已经没有元素*/ { } C->length=A.length+B.length;/*C的表长等于A和B的表长的和*/ } ●链式表的非递减数列合并 /*包含头文件*/ { DataTypedata; structNode*next; }ListNode,*LinkList; voidMergeList(LinkListA,LinkListB,LinkList*C);/*将单链表A和B的元素合并到C中的函数声明*/ voidInitList(LinkList*head) /*将单链表初始化为空。 动态生成一个头结点,并将头结点的指 针域置为空。 */ { if((*head=(LinkList)malloc(sizeof(ListNode))) return0; } ListNode*Get(LinkListhead,inti) /*查找单链表中第i个结点。 查找成功返回该结点的指针表示成 功;否则返回NULL表示失败。 */ { ListNode*p; intj; if(ListEmpty(head))/*在查找第i个元素之前, 判断链表是否为空*/ returnNULL; if(i<1)/*在查找第i个元 p=p->next; j++; } if(j==i) returnp;/*找到第i个结点 ,返回指针p*/ else returnNULL;/*如果没有找到第i个元 素,返回NULL*/ } ListNode*LocateElem(LinkListhead,DataTypee) /*查找线性表中元素值为e的元素,查找成功将对应元素的结点 指针返回,否则返回NULL表示失败。 */ { L应元素的序号 返回,否则返回0表示失败。 */ { ListNode*p; inti; if(ListEmpty(head))/*在查找第i个元 素之前,判断链表是否为空*/ return0; p=head->next;/*指针p指向第一 个结点*/ i=1; while(p) { if(p->data==e)/*找到与e相等的 元素,返回该序号*/ returni; else { p=p->next; i++; } } 成功返回1,失败返回0*/ { ListNode*p,*pre;/*定义指向第i个元素的前 驱结点指针pre,指针p指向新生成的结点*/ intj; pre=head;/*指针p指向头结 点*/ j=0; while(pre->next! =NULL&&j ,即第i个结点的前驱结点*/ { pre=pre->next; j++; } intDeleteList(LinkListhead,inti,DataType*e) /*删除单链表中的第i个位置的结点。 删除成功返回1,失败返回 0*/ { ListNo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南阳 理工学院 软件 学院 数据结构 上机 实验 指导书 全部 标准答案