当前位置:文档之家› 北理工数据结构实验报告4

北理工数据结构实验报告4

《数据结构与算法设计》实验报告——实验四学院:自动化学院班级:____学号:__姓名:____ ____一、实验目的1、熟悉VC 环境,学习使用C 语言实现链表的存储结构。

2、通过编程、上机调试,进一步理解线性表、链表、环表的基本概念。

3、锻炼动手编程,独立思考的能力。

二、实验内容从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。

三、程序设计1、概要设计为实现上述程序功能,应用线性表寄存数字序列。

为此,需要线性表的抽象数据结构。

(1)、线性表的抽象数据类型定义为:ADT SqList{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作:CreateList(&L)操作结果:构造一个线性表L 。

ShowList(&L)初始条件:线性表L 已存在。

操作结果:按顺序在屏幕上输出L 的数据元素。

InsertSort(&L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行插入排序。

QuickSort(&L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行快速排序。

SelectSort(&L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行选择排序。

}ADT SqList(2)、宏定义#define MAXSIZE 10#define OVERFLOW -2#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0(3)、主程序流程主程序首先调用CreateList(l1)函数创建顺序表l1。

随后调用InsertSort(l1)、QuickSort(l2)、SelectSort(l3)函数计算三种排序结果,并调用相应的ShowList()函数显示排序结果。

(4)、模块调用关系:由主函数模块调用创建模块,显示模块与计算模块。

(5)、流程图2、详细设计(1)、数据类型设计typedef int Status;typedef int ElemType; //定义数据元素类型typedef struct{ElemType r[MAXSIZE+1];int length;}SqList; //定义顺序表类型(2)、操作算法设计Status CreateList(SqList &L){//创建顺序表L.length=0;for(int i=1;i<=MAXSIZE;i++){scanf("%d",&L.r[i]);L.length++;}return OK;}Status ShowList(SqList &L){//显示顺序表的内容for(int i=1;i<=MAXSIZE;i++)printf("%d ",L.r[i]);return OK;}void InsertSort(SqList &L){//插入排序for(int i=2;i<=L.length;++i)if(L.r[i]<L.r[i-1]){ //需将L.r[i]插入有序子表L.r[0]=L.r[i]; //复制为哨兵L.r[i]=L.r[i-1];for(int j=i-2;L.r[0]<L.r[j];--j)L.r[j+1]=L.r[j]; //记录后移L.r[j+1]=L.r[0]; //插入到正确位置}}int Partition(SqList &L, int low, int high){//一趟快速排序L.r[0]=L.r[low]; //用子表第一个记录做枢轴元素int pivotkey=L.r[low]; //枢轴记录关键字while(low<high){ //从两端交替向中间扫描while(low<high && L.r[high]>=pivotkey) --high;L.r[low]=L.r[high]; //将记录小的移到低端while(low<high && L.r[low]<=pivotkey) ++low;L.r[high]=L.r[low]; //将记录大的移到高端}L.r[low]=L.r[0]; //枢轴记录到位return low; //返回枢轴位置}void QSort(SqList &L,int low,int high){//对[low,high]做快速排序if(low<high){ //长度大于1int pivotloc=Partition(L,low,high); //一分为二QSort(L,low,pivotloc-1); //对低子表递归排序QSort(L,pivotloc+1,high); //对高子表递归排序}}void QuickSort(SqList &L){//对L快速排序QSort(L,1,L.length);}void SelectSort(SqList &L){//对L选择排序for(int i=1;i<L.length;++i){ //选择第i小记录并交换到位int k=i;for(int j=i+1;j<=L.length;j++)if(L.r[j]<L.r[k])k=j;if(k!=i){L.r[0]=L.r[i];L.r[i]=L.r[k];L.r[k]=L.r[0]; //与第i个元素交换}}}(3)、主函数设计int main(){//主程序SqList l1,l2,l3;printf("Please input 10 numbers:\n");CreateList(l1); //创建线性表l1l2=l1;l3=l1;InsertSort(l1); //对l1插入排序printf("The result of InsertSort is:\n");ShowList(l1);printf("\n");QuickSort(l2); //对l2快速排序printf("The result of QuickSort is:\n");ShowList(l2);printf("\n");SelectSort(l3); //对l3选择排序printf("The result of SelectSort is:\n");ShowList(l3);printf("\n");return 0;}四、程序调试分析1、由于对于快速排序理解不深,开始时出现了许多细节问题,导致排序结果不正常,经过修改后得以解决。

2、在选择排序中,由于不细心,误将”<”打为”<=”导致结果不正常。

3、在快速排序中,一些后引入的变量,例如pivotkey没有声明,导致编译失败。

五、用户使用说明1、本程序的运行环境为DOS操作系统,执行文件为:Sort.exe。

2、进入程序后,在Please input 10 numbers:后输入所需排序的十个整数,回车运行程序。

3、程序运行后即在屏幕上输出计算结果。

六、程序运行结果1、2、七、程序清单#define MAXSIZE 10#define OVERFLOW -2#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#include"stdio.h"#include"stdlib.h"typedef int Status;typedef int ElemType; //定义数据元素类型typedef struct{ElemType r[MAXSIZE+1];int length;}SqList; //定义顺序表类型Status CreateList(SqList &L){//创建顺序表L.length=0;for(int i=1;i<=MAXSIZE;i++){scanf("%d",&L.r[i]);L.length++;}return OK;}Status ShowList(SqList &L){//显示顺序表的内容for(int i=1;i<=MAXSIZE;i++)printf("%d ",L.r[i]);return OK;}void InsertSort(SqList &L){//插入排序for(int i=2;i<=L.length;++i)if(L.r[i]<L.r[i-1]){ //需将L.r[i]插入有序子表L.r[0]=L.r[i]; //复制为哨兵L.r[i]=L.r[i-1];for(int j=i-2;L.r[0]<L.r[j];--j)L.r[j+1]=L.r[j]; //记录后移L.r[j+1]=L.r[0]; //插入到正确位置}}int Partition(SqList &L, int low, int high){//一趟快速排序L.r[0]=L.r[low]; //用子表第一个记录做枢轴元素int pivotkey=L.r[low]; //枢轴记录关键字while(low<high){ //从两端交替向中间扫描while(low<high && L.r[high]>=pivotkey) --high;L.r[low]=L.r[high]; //将记录小的移到低端while(low<high && L.r[low]<=pivotkey) ++low;L.r[high]=L.r[low]; //将记录大的移到高端}L.r[low]=L.r[0]; //枢轴记录到位return low; //返回枢轴位置}void QSort(SqList &L,int low,int high){//对[low,high]做快速排序if(low<high){ //长度大于1int pivotloc=Partition(L,low,high); //一分为二QSort(L,low,pivotloc-1); //对低子表递归排序QSort(L,pivotloc+1,high); //对高子表递归排序}}void QuickSort(SqList &L){//对L快速排序QSort(L,1,L.length);}void SelectSort(SqList &L){//对L选择排序for(int i=1;i<L.length;++i){ //选择第i小记录并交换到位int k=i;for(int j=i+1;j<=L.length;j++)if(L.r[j]<L.r[k])k=j;if(k!=i){L.r[0]=L.r[i];L.r[i]=L.r[k];L.r[k]=L.r[0]; //与第i个元素交换}}}int main(){//主程序SqList l1,l2,l3;printf("Please input 10 numbers:\n"); CreateList(l1); //创建线性表l1l2=l1;l3=l1;InsertSort(l1); //对l1插入排序printf("The result of InsertSort is:\n"); ShowList(l1);printf("\n");QuickSort(l2); //对l2快速排序printf("The result of QuickSort is:\n"); ShowList(l2);printf("\n");SelectSort(l3); //对l3选择排序printf("The result of SelectSort is:\n"); ShowList(l3);printf("\n");return 0;}。

相关主题