1、数据结构算法实验内容与指导 1、 实验目的:将书中常用算法编写成程序,上机调试,验证算法的正确性,同时理解数据结构对于软件开发的意义。同时又能复习C++语言的重点与难点,熟悉vc++6.0调试环境,掌握一个完整程序的构成,为今后软件设计打下基础。 2、 实验要求:熟练掌握c++面象对象的编程思想及vc++6.0上机调试环境。 3、 实验内容: (1)线性表顺序存储(顺序表类)的插入、删除等操作的实现 (2)线性表链式存储(单链表类)的建立、插入、删除等操作的实现 (3)特殊线性表进栈、退栈操作的实现 (4)顺序查找及二分查找算法的实现 (5)常用的几种排序算法的实现 (6
2、二叉树的建立、遍历算法的实现 (7)图的邻接矩阵的建立,及遍历算法实现 实验一:线性表顺序存储(顺序表类)的插入、删除等操作的实现 //SeqList.h class SeqList { protected: DataType *list; //数组 int maxSize; //最大元素个数 int size; //当前元素个数 public: SeqList(int max=0); //构造函数 ~SeqList(void); //析构函数 int Size(void
3、) const; //取当前数据元素个数 void Insert(const DataType& item, int i);//插入 DataType Delete(const int i); //删除 DataType GetData(int i) const; //取数据元素 }; SeqList::SeqList(int max) //构造函数 { maxSize = max; size = 0; list = new DataType[maxSize]; } SeqList::~SeqList(void) //析构函数
4、 { delete []list; } int SeqList::Size(void) const //取当前数据元素个数 { return size; } void SeqList::Insert(const DataType& item, int i) //插入 //在指定位置i前插入一个数据元素item { if (size == maxSize) { cout << "顺序表已满无法插入!" << endl; exit(0); } if(i < 0 || i > size) //参数正确与否判断 {
5、 cout << "参数i越界出错!" << endl; exit(0); } //从size-1至i逐个元素后移 for(int j = size; j > i; j--) list[j] = list[j-1]; list[i] = item; //在i位置插入item size++; //当前元素个数加1 } DataType SeqList::Delete(const int i) //删除 //删除指定位置i的数据元素,删除的元素由函数返回 { if (size == 0) { cout << "
6、顺序表已空无元素可删!" << endl;
exit(0);
}
if(i < 0 || i > size - 1) //参数正确与否判断
{
cout<<"参数i越界出错!"< 7、DataType SeqList::GetData(int i) const //取数据元素
//取位置i的数据元素,取到的数据元素由函数返回
{
if(i < 0 || i > size - 1) //参数正确与否判断
{
cout << "参数i越界出错!" << endl;
exit(0);
}
return list[i]; //返回取到的元素
}
//ExamTest1.cpp
#include 8、的数据类型
#include "SeqList.h"
void main(void)
{
SeqList myList(100); //定义顺序表类对象myList
int n = 10, x;
for(int i = 0; i < n; i++) //在myList中顺序插入10个元素
{cout<< “请输入插入元素x的值”< 9、Size(); i++) //依次取myList中的元素并显示
cout << myList.GetData(i) << " ";
}
分析讨论:
问题1:请分析上述主函数的功能及运行结果;
问题2:完成P41例2-2建立学生情况表实验。
//ExamTest2.cpp
#include 10、据项
int age; //年龄数据项
}; //结构体StudentType
typedef StudentType DataType; //定义DataType为StudentType数据类型
#include "SeqList.h" //包含顺序表文件
void main(void)
{
SeqList myList(100);
StudentType x[3] = {{2000001, "张三", "男", 20},
{2000002, "李四", "男", 21},
{2000003, " 11、王五", "女", 22}};
int n = 3;
DataType s;
for(int i = 0; i < n; i++) //在myList中顺序插入n个元素
myList.Insert(x[i], i);
for(i = 0; i < myList.Size(); i++) //依次取myList中的元素并显示
{
s = myList.GetData(i);
cout << s.number << s.name << s.sex << s.age << endl;
}
}
实验二:线性表链式存储(单链表类)的建立、插 12、入、删除等操作的实现
//LinList.h
template 13、de(ListNode 14、 //当前的数据元素个数
ListNode 15、
LinList 16、te q;
}
size = 0; //结点个数置为初始化值0
head = NULL;
}
template 17、时返回头指针head
ListNode 18、e 19、> *q = new ListNode 20、{
cout << "参数i越界出错!" << endl;
exit(0);
}
ListNode 21、e 22、ude "LinList.h"
void main(void)
{
LinList 23、三:各种排序算法的实验
//sort.h
#include 24、a[j+1] = temp;
}
}
void ShellSort (datatype a[], int n, int d[], int numOfD)
//用希尔排序法对记录a[0]--a[n-1]排序
//各组内采用直接插入法排序
{
int i, j, k, m, span;
datatype temp;
for(m = 0; m < numOfD; m++)
{
span = d[m];
for(k = 0; k < span; k++)
{
for(i = k; i < n-span; i = i+span)
{
25、 temp = a[i+span];
j = i;
while(j > -1 && temp.key <= a[j].key)
{
a[j+span] = a[j];
j = j-span;
}
a[j+span] = temp;
}
}
}
}
void SelectSort(datatype a[], int n)
/*用直接选择排序法对a[0]--a[n-1]排序*/
{
int i, j, small;
datatype temp;
for(i=0; i < n-1 26、 i++)
{
small = i;
for(j = i+1; j < n; j++)
if(a[j].key < a[small].key) small=j;
if(small != i)
{
temp = a[i];
a[i] = a[small];
a[small] = temp;
}
}
}
void BubbleSort(datatype a[], int n)
//用冒泡排序法对a[0]--a[n-1]排序
{
int i, j, flag=1;
datatype temp;
for 27、i = 1; i < n && flag == 1; i++)
{
flag = 0;
for(j = 0; j < n-i; j++)
{
if(a[j].key > a[j+1].key)
{
flag = 1;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
void QuickSort(datatype a[], int low, int high)
//用递归方法对对象a[low]--a[high]进行快速排序
{
int 28、 i, j;
datatype temp;
i = low;
j = high;
temp = a[low];
while(i < j)
{
//在数组的右端扫描
while(i < j && temp.key <= a[j].key) j--;
if(i < j)
{
a[i] = a[j];
i++;
}
//在数组的左端扫描
while(i < j && a[i].key < temp.key) i++;
if(i < j)
{
a[j] = a[i];
j--;
29、 }
}
a[i] = temp;
//对子对象数组进行递归快速排序
if(low < i) QuickSort(a, low, i-1);
if(i < high) QuickSort(a, j+1, high);
}
void Merge(DataType a[], int n, DataType swap[], int k)
//k为有序子数组的长度,一次二路归并排序后的有序子序列存于数组swap中
{
int m = 0, u1,l2,i,j,u2;
int l1 = 0; //第一个有序子数组下界为0
while(l1+k 30、 <= n-1)
{
l2 = l1 + k; //计算第二个有序子数组下界
u1 = l2 - 1; //计算第一个有序子数组上界
u2 = (l2+k-1 <= n-1)? l2+k-1: n-1;//计算第二个有序子数组上界
//两个有序子数组合并
for(i = l1, j = l2; i <= u1 && j <= u2; m++)
{
if(a[i].key <= a[j].key)
{
swap[m] = a[i];
i++;
}
else
{
sw 31、ap[m]=a[j];
j++;
}
}
//子数组2已归并完,将子数组1中剩余的元素存放到数组swap中
while(i <= u1)
{
swap[m] = a[i];
m++;
i++;
}
//子数组1已归并完,将子数组2中剩余的元素存放到数组swap中
while(j <= u2)
{
swap[m] = a[j];
m++;
j++;
}
l1 = u2 + 1;
}
//将原始数组中只够一组的数据元素顺序存放到数组swap中
f 32、or(i = l1; i < n; i++, m++) swap[m] = a[i];
}
void MergeSort(DataType a[], int n)
{
int i, k = 1; //归并长度从1开始
DataType *swap = new DataType[n]; //申请动态数组空间
while(k < n)
{
Merge(a, n, swap, k); //调用归并函数Merge(a, n, swap, k)
for(i = 0; i < n; i++)
a[i] = swap[i]; //将 33、元素从临时数组swap放回数组a中
k = 2 * k; //归并长度加倍
}
delete []swap; //释放动态数组空间
}
//exam.cpp
#include 34、ow,high;
char c;
cout<<”请输入”< 35、1’: {InsertSort(test,N);break;}
case ‘2’:
{p=N;
while((p/2)!=1)
{ d[I]=p/2; cnt++;p=p/2;I++;}
d[I]=1;cnt++;
ShellSort(text,N,d,cnt);break;
}
case ‘3’:{SelectSort(test,N);break;}
case ‘4’:{BubbleSort(text,N);break;}
case ‘5’:{ low=0;high=N-1;
QuickSort(text,low,high); break;}
case ‘6’:{MergeSort(text,N);break;}
case ‘0’: {exit(0);break;}
}
}
16






