数据结构算法实验内容与指导文档格式.docx
- 文档编号:17342765
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:17
- 大小:20.32KB
数据结构算法实验内容与指导文档格式.docx
《数据结构算法实验内容与指导文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构算法实验内容与指导文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
}
intSeqList:
Size(void)const//取当前数据元素个数
returnsize;
voidSeqList:
Insert(constDataType&
item,inti)//插入
//在指定位置i前插入一个数据元素item
if(size==maxSize)
{
cout<
<
"
顺序表已满无法插入!
"
<
endl;
exit(0);
}
if(i<
0||i>
size)//参数正确与否判断
cout<
参数i越界出错!
//从size-1至i逐个元素后移
for(intj=size;
j>
i;
j--)list[j]=list[j-1];
list[i]=item;
//在i位置插入item
size++;
//当前元素个数加1
DataTypeSeqList:
Delete(constinti)//删除
//删除指定位置i的数据元素,删除的元素由函数返回
if(size==0)
顺序表已空无元素可删!
size-1)//参数正确与否判断
cout<
endl;
DataTypex=list[i];
//取到要删除的元素
//从i+1至size-1逐个元素前移
for(intj=i;
j<
size-1;
j++)list[j]=list[j+1];
size--;
//当前元素个数减1
returnx;
//返回删除的元素
GetData(inti)const//取数据元素
//取位置i的数据元素,取到的数据元素由函数返回
returnlist[i];
//返回取到的元素
//ExamTest1.cpp
#include<
iostream.h>
stdlib.h>
typedefintDataType;
//定义具体问题元素的数据类型
#include"
SeqList.h"
voidmain(void)
SeqListmyList(100);
//定义顺序表类对象myList
intn=10,x;
for(inti=0;
i<
n;
i++)//在myList中顺序插入10个元素
{cout<
“请输入插入元素x的值”<
cin>
>
x;
mylist.Insert(x,i);
myList.Delete(4);
//删除myList中数据元素5
for(i=0;
myList.Size();
i++)//依次取myList中的元素并显示
myList.GetData(i)<
;
分析讨论:
问题1:
请分析上述主函数的功能及运行结果;
问题2:
完成P41例2-2建立学生情况表实验。
//ExamTest2.cpp
structStudentType
longnumber;
//学号数据项
charname[10];
//姓名数据项
charsex[3];
//性别数据项
intage;
//年龄数据项
//结构体StudentType
typedefStudentTypeDataType;
//定义DataType为StudentType数据类型
//包含顺序表文件
StudentTypex[3]={{2000001,"
张三"
"
男"
20},
{2000002,"
李四"
21},
{2000003,"
王五"
女"
22}};
intn=3;
DataTypes;
i++)//在myList中顺序插入n个元素
myList.Insert(x[i],i);
s=myList.GetData(i);
s.number<
s.name<
s.sex<
s.age<
}
实验二:
线性表链式存储(单链表类)的建立、插入、删除等操作的实现
//LinList.h
template<
classT>
classLinList;
//前视定义,否则友元无法定义
//模板类型为T
classListNode
friendclassLinList<
T>
//定义类LinList<
为友元
private:
ListNode<
*next;
//指向下一结点的指针
Tdata;
//定义为公有成员方便使用
//构造函数1,用于构造头结点
ListNode(ListNode<
*ptrNext=NULL)
{next=ptrNext;
//构造函数2,用于构造其他结点
ListNode(constT&
item,ListNode<
{data=item;
next=ptrNext;
~ListNode(void){}//析构函数
//单链表类的定义
classLinList
*head;
//头指针
//当前的数据元素个数
*Index(inti);
//定位
LinList(void);
//构造函数
~LinList(void);
//析构函数
intListSize(void)const;
//取当前数据元素个数
voidInsert(constT&
//前插
TDelete(inti);
//删除
TGetData(inti);
//取元素
//单链表类的实现
LinList<
LinList(void)//构造函数
head=newListNode<
();
//头指针指向头结点
//size的初值为0
~LinList(void)//析构函数
{ListNode<
*p,*q;
p=head;
//p指向第一个结点
while(p!
=NULL)//循环释放结点空间直至初始化状态
{q=p;
p=p->
next;
deleteq;
//结点个数置为初始化值0
head=NULL;
ListNode<
*LinList<
Index(inti)//定位
//返回指向第i个数据元素结点的指针
//参数i的取值范围为:
-1≤i≤size-1;
i=-1时返回头指针
-1||i>
size-1)
参数i越界出错!
if(i==-1)returnhead;
//i为-1时返回头指针head
*p=head->
//p指向第一个数据元素结点
intj=0;
//从0开始计数
=NULL&
&
j<
i)//寻找第i个结点
j++;
returnp;
//返回第i个结点的指针
intLinList<
ListSize(void)const//取当前数据元素个数并返回
voidLinList<
Insert(constT&
item,inti)//插入
//在第i个结点后插入一个元素值为item的新结点
0≤i≤size
size)
*p=Index(i-1);
//p为指向第i-1个结点的指针
//构造新结点p,p的data域值为item,next域值为p->
next
*q=newListNode<
(item,p->
next);
p->
next=q;
//新结点插入第i个结点前
//元素个数加1
TLinList<
Delete(inti)//删除
//删除第i个数据元素并返回。
参数i的取值范围为:
0≤i≤size-1
if(size==0)
链表已空无元素可删!
ListNode<
*s,*p=Index(i-1);
//p为指向第i-1个结点指针
s=p->
//s指向第i个结点
next=p->
next->
//第i个结点脱链
Tx=s->
data;
deletes;
//释放第i个结点空间
//结点个数减1
//返回第i个结点的data域值
GetData(inti)//取数据元素
//取第i个数据元素并返回。
*p=Index(i);
//p指向第i个结点
returnp->
//ExamTest3.cpp
LinList.h"
LinList<
int>
myList;
Ints[]={10,20,30,40,50,60,70,80,90,100},n=10;
Inttemp;
For(intI=0;
I<
n;
I++)
MyList.Insert(s[I],I);
MyList.Delete(4);
For(I=0;
myList.Size();
temp=myList.GetData(i);
cout<
temp<
”“;
实验三:
各种排序算法的实验
//sort.h
voidInsertSort(DataTypea[],intn)
//用直接插入法对a[0]--a[n-1]排序
inti,j;
DataTypetemp;
for(i=0;
i<
n-1;
i++)
temp=a[i+1];
j=i;
while(j>
-1&
temp.key<
=a[j].key)
{
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
voidShellSort(datatypea[],intn,intd[],intnumOfD)
//用希尔排序法对记录a[0]--a[n-1]排序
//各组内采用直接插入法排序
inti,j,k,m,span;
datatypetemp;
for(m=0;
m<
numOfD;
m++)
span=d[m];
for(k=0;
k<
span;
k++)
for(i=k;
n-span;
i=i+span)
{
temp=a[i+span];
j=i;
while(j>
{
a[j+span]=a[j];
j=j-span;
}
a[j+span]=temp;
}
voidSelectSort(datatypea[],intn)
/*用直接选择排序法对a[0]--a[n-1]排序*/
inti,j,small;
n-1;
small=i;
for(j=i+1;
j++)
if(a[j].key<
a[small].key)small=j;
if(small!
=i)
temp=a[i];
a[i]=a[small];
a[small]=temp;
voidBubbleSort(datatypea[],intn)
//用冒泡排序法对a[0]--a[n-1]排序
inti,j,flag=1;
for(i=1;
n&
flag==1;
flag=0;
for(j=0;
n-i;
if(a[j].key>
a[j+1].key)
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
voidQuickSort(datatypea[],intlow,inthigh)
//用递归方法对对象a[low]--a[high]进行快速排序
i=low;
j=high;
temp=a[low];
while(i<
j)
//在数组的右端扫描
while(i<
j&
=a[j].key)j--;
if(i<
a[i]=a[j];
i++;
//在数组的左端扫描
a[i].key<
temp.key)i++;
a[j]=a[i];
a[i]=temp;
//对子对象数组进行递归快速排序
if(low<
i)QuickSort(a,low,i-1);
high)QuickSort(a,j+1,high);
voidMerge(DataTypea[],intn,DataTypeswap[],intk)
//k为有序子数组的长度,一次二路归并排序后的有序子序列存于数组swap中
intm=0,u1,l2,i,j,u2;
intl1=0;
//第一个有序子数组下界为0
while(l1+k<
=n-1)
l2=l1+k;
//计算第二个有序子数组下界
u1=l2-1;
//计算第一个有序子数组上界
u2=(l2+k-1<
=n-1)?
l2+k-1:
//计算第二个有序子数组上界
//两个有序子数组合并
for(i=l1,j=l2;
=u1&
=u2;
m++)
if(a[i].key<
swap[m]=a[i];
i++;
else
swap[m]=a[j];
j++;
//子数组2已归并完,将子数组1中剩余的元素存放到数组swap中
=u1)
swap[m]=a[i];
m++;
//子数组1已归并完,将子数组2中剩余的元素存放到数组swap中
while(j<
=u2)
swap[m]=a[j];
j++;
l1=u2+1;
//将原始数组中只够一组的数据元素顺序存放到数组swap中
for(i=l1;
i++,m++)swap[m]=a[i];
voidMergeSort(DataTypea[],intn)
inti,k=1;
//归并长度从1开始
DataType*swap=newDataType[n];
//申请动态数组空间
while(k<
n)
Merge(a,n,swap,k);
//调用归并函数Merge(a,n,swap,k)
for(i=0;
i++)
a[i]=swap[i];
//将元素从临时数组swap放回数组a中
k=2*k;
//归并长度加倍
delete[]swap;
//释放动态数组空间
//exam.cpp
#defineN8
typedefintKeyType;
structDataType
{KeyTypekey;
Sort.h"
{DataTypetest[8];
intd[N],I=0,p,cnt=0,low,high;
charc;
cout<
”请输入”<
N<
”个”<
for(I=0;
N;
cin>
test[I];
”请选择排序方式”<
”1-直接插入排序”<
”2-希尔排序”<
”3-直接选择
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 实验 内容 指导