数据结构实验报告.docx
- 文档编号:11974961
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:30
- 大小:20.76KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
数据结构实验报告
实验一
1、编写算法实现线性顺序表的逆置。
2、用线性表的链式模式编写算法,实现两个表La=(1,5,4,8,6,11)和Lb=(9,7,4,2,1,5)的并集。
实验1-1
主要代码:
boolGetElem(intposition,int&e)const//求指定位置的元素
{
if(position<=0||position>count)
returnfalse;
else
{
e=elems[position-1];
returntrue;
}
}
boolSetElem(intposition,constint&e)//设置指定位置的元素值
{
if(position<=0||position>count)
returnfalse;
else
{
elems[position-1]=e;
returntrue;
}
}
voiddisp()
{
for(inti=0;i { cout< } cout< } }; voidreverse(SqList&la) { intleftposition=1; intrightposition=la.Length(); inta,b; while(leftposition {la.GetElem(leftposition,a); la.GetElem(rightposition,b); la.SetElem(leftposition,b); la.SetElem(rightposition,a); leftposition++; rightposition--; }//在这里加代码 } intmain() { inta[10]={1,2,3,4,5,6,7,8,9,10}; SqListla(a,10); la.disp(); reverse(la);//该函数完成逆置功能 la.disp(); return0; } int*p,*q; intposition=0; boolflag=false; p=head; p=p->next; while(p! =null) {position++; if(position>=2&&p->data==x) {q=GetElemPtr(position-2); *tmpPtr=q->next; } q->next=tmpPt->next; deletetmpPtr; flag=true; position--;} p=p->next; }//这里加代码 returnflag; 实验1-2 主要代码: SimpleLinkList: : SimpleLinkList(constSimpleLinkList©) //操作结果: 由线性表copy构造新线性表——复制构造函数模板 { intcopyLength=copy.Length();//copy的长度 inte; Init();//初始化线性表 for(intcurPosition=1;curPosition<=copyLength;curPosition++) { boolSimpleLinkList: : Delete_x(int&x) { Node*p,*q; intposition=0; p=head; p=p->next; while(p! =NULL) { position++; if(position>=2&&p->data==x) { q=GetElemPtr(position-2); Node*tmpPtr=q->next; q->next=tmpPtr->next; deletetmpPtr; position--; } p=p->next; } returntrue;//这里加代码 } intmain() { inta[9]={1,5,4,8,6,11,11,11,56}; SimpleLinkListla(a,9); la.Traverse(); la.Delete_x(a[5]); //这里完成删除x的前一个节点操作 la.Traverse(); } 实验二 1、已知q是一个非空顺序队列,s是一个顺序栈,请设计一个算法,实现将队列q中所有元素逆置。 2、请完成队列划分子集问题的算法。 实验2-1 主要代码: voidSqQueue: : Traverse()const //操作结果: 依次对队列的每个元素调用函数(*visit) { for(intcurPosition=front;curPosition! =rear; curPosition=(curPosition+1)%maxSize) {//对队列每个元素调用函数(*visit) cout< } cout< } boolSqQueue: : OutQueue(int&e) //操作结果: 如果队列非空,那么删除队头元素,并用e返回其值,返回SUCCESS, //否则返回UNDER_FLOW, { if(! Empty()) {//队列非空 e=elems[front];//用e返回队头元素 front=(front+1)%maxSize;//front指向下一元素 returntrue; } else {//队列为空 returnfalse; } } boolSqQueue: : GetHead(int&e)const //操作结果: 如果队列非空,那么用e返回队头元素,返回SUCCESS, //否则返回UNDER_FLOW, { if(! Empty()) {//队列非空 e=elems[front];//用e返回队头元素 returntrue; } else {//队列为空 returnfalse; } } boolSqQueue: : InQueue(constint&e) //操作结果: 如果队列已满,返回OVER_FLOW, //否则插入元素e为新的队尾,返回SUCCESS { if(Full()) {//队列已满 returnfalse; } else {//队列未满,入队成功 elems[rear]=e;//插入e为新队尾 rear=(rear+1)%maxSize;//rear指向新队尾 returntrue; } } intmain() { inta[10]={1,2,3,4,5,6,7,8,9,10}; inti,temp,n=10; SqQueueq(n+1); SqStacks(n+1); for(i=0;i q.InQueue(a[i]); cout<<"队列目前的元素为: "; q.Traverse(); for(i=0;i { q.OutQueue(temp); s.Push(temp); } cout<<"栈的元素为: "; s.Traverse(); for(i=0;i { s.Pop(temp); q.InQueue(temp); } cout<<"新队列的元素为: "; q.Traverse(); return0; } 实验2-2 主要代码: boolSqQueue: : OutQueue(int&e) //操作结果: 如果队列非空,那么删除队头元素,并用e返回其值,返回SUCCESS, //否则返回UNDER_FLOW, { if(! Empty()) { //队列非空 e=elems[front];//用e返回队头元素 front=(front+1)%maxSize;//front指向下一元素 returntrue; } else { //队列为空 returnfalse; } } boolSqQueue: : InQueue(constint&e) //操作结果: 如果队列已满,返回OVER_FLOW, //否则插入元素e为新的队尾,返回SUCCESS { if(Full()) { //队列已满 returnfalse; } else { //队列未满,入队成功 elems[rear]=e;//插入e为新队尾 rear=(rear+1)%maxSize;//rear指向新队尾 returntrue; } } intmain() { intA[9]={1,2,3,4,5,6,7,8,9}; intR[9][9],n=9,a,b,i,j,temp,group,num_all,num_group; intresult[n],newr[n]; SqQueueq(n+1); for(i=0;i { result[i]=0; for(j=0;j { R[i][j]=0; } } for(i=0;i q.InQueue(A[i]); cout<<"请输入相互排斥的数据对,以-1为结束信号: "< while(cin>>a,a! =-1)//完成关系矩阵的赋值操作 { cin>>b; R[a-1][b-1]=1; R[b-1][a-1]=1; } group=0; num_all=n; num_group=0; while(! q.Empty())//只要循环队列中元素不为空,就做如下的划分操作 { group++;//第group组的元素划分 q.OutQueue(temp);//该组第一个元素出栈 num_group++;//该组目前具有的数量 result[temp-1]=group;//该组元素对应的位置放到result中 for(i=0;i newr[i]=R[temp-1][i];//把与该元素的冲突关系记录到数组newr中 num_all=num_all-num_group;//还需要出队列判断的元素数量 num_group=0;//初始化 for(j=0;j { q.OutQueue(temp); if(newr[temp-1]==1)//如果该元素与当前的组的元素有冲突,重新入队 q.InQueue(temp); else//否则把该元素加入到当前组中 { result[temp-1]=group; for(i=0;i { if(R[temp-1][i]==1)//把鱼当前元素有冲突的冲突关系加入到数组newr中 newr[i]=1; } num_group++;//该组目前具有的元素数量 } } } for(i=1;i<=group;i++)//打印出划分结果 { cout<<"第"< "; for(j=0;j { if(result[j]==i) cout< } cout< } return0; } 实验三 1、系数矩阵的快速转置,并输出转置之后的矩阵 2、二叉树的遍历,分别调用先序,中序和后序遍历算法输出遍历结果。 实验3-1 主要代码: voidTriSparseMatrix: : FastTranspose(constTriSparseMatrix&source,TriSparseMatrix&dest) //操作结果: 将稀疏矩阵source转置成稀疏矩阵dest的快速算法 { dest.rows=source.cols; dest.cols=source.rows; dest.num=source.num; dest.maxSize=source.maxSize; delete[]dest.triElems; dest.triElems=new Triple[dest.maxSize]; if(dest.num>0) { intdestPos=0; for(intcol=1;col<=source.cols;col++) { for(intsourcePos=0;sourcePos { if(source.triElems[sourcePos].col==col) { dest.triElems[destPos].row=source.triElems[sourcePos].col; dest.triElems[destPos].col=source.triElems[sourcePos].row; dest.triElems[destPos].value=source.triElems[sourcePos].value; destPos++; } } } } //代码写在这里 //释放cPos } intmain(void) { constintn=5; TriSparseMatrixa(n,n);//定义一个n行n列稀疏矩阵 intb[n][n]= { 1,0,3,0,0, 4,0,6,0,0, 0,0,8,9,0, 0,0,0,1,12, 1,0,0,3,1 }; inti,j,v;//工作变量 //设置稀疏矩阵a的元素值 for(i=1;i<=n;i++) { //行 for(j=1;j<=n;j++) { //列 a.SetElem(i,j,b[i-1][j-1]);//设置元素值 } } //显示转置前的稀疏矩阵a cout<<"转置前稀疏矩阵a: "< for(i=1;i<=a.GetRows();i++) { //行 for(j=1;j<=a.GetCols();j++) { //列 a.GetElem(i,j,v);//求元素值 cout< } cout< } TriSparseMatrixc; TriSparseMatrix: : FastTranspose(a,c);//转置a成c //显示转置后稀疏矩阵c cout<<"转置后的稀疏矩阵c: "< for(i=1;i<=c.GetRows();i++) { //行 for(j=1;j<=c.GetCols();j++) { //列 c.GetElem(i,j,v);//求元素值 cout< } cout< } return0;//返回值0,返回操作系统 } 实验3-2 主要代码: voidBinaryTree: : InOrderHelp(BinTreeNode*r)const //操作结果: 中序遍历以r为根的二叉树 { if(r! =NULL) { InOrderHelp(r->leftChild); cout<<(r->data); InOrderHelp(r->rightChild); }//代码写在这里 } voidBinaryTree: : InOrder()const //操作结果: 中序遍历二叉树 { InOrderHelp(root); } voidBinaryTree: : PostOrderHelp(BinTreeNode*r)const //操作结果: 后序遍历以r为根的二叉树 { if(r! =NULL) {PostOrderHelp(r->leftChild); PostOrderHelp(r->rightChild); cout<<(r->data); }//代码写在这里 } 实验四 1、分别用普通查找和折半查找在数组中查找一个数字,输出其数组的下标和比较的次数。 2、散列表的构建与查找已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79) 哈希函数为: H(key)=keyMOD13,哈希表长为m=16,利用线性探索法构建散列表,并根据每个输入的key值输出其位置下标和比较的次数。 实验4-1 主要代码: #include usingnamespacestd; boolsqSearch(inta[],intn,intkey,int&loc,int&count)//顺序查找函数: 数组为a;n为数组中元素个数;key为查找的数据,loc为数据对应的位置;count为比较的次数;查找成功返回true,否则返回false. { //代码内容 inti; for(i=0;i { if(a[i]==key) { loc=i; count=i+1; returntrue; } } returnfalse; } boolBinSearch(inta[],intn,intkey,int&loc,int&count)//折半查找函数: 数组为a;n为数组中元素个数;key为查找的数据,loc为数据对应的位置;count为比较的次数;查找成功返回true,否则返回false. { //代码内容 intcou,mid,low,high; cou=0; low=0; high=n-1; while(low<=high) { mid=(low+high)/2; cou=cou+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告