实验一约瑟夫问题实验学时:3学时实验类型:设计实验要求:必修一、实验目的熟练掌握线性链表的基础知识;能够使用C++或其他程序设计语言编程实现线性链表;能够使用线性链表构造正确而且时间复杂度低的算法解决实际问题;锻炼程序设计能力。
二、实验内容M个教徒和N个非教徒在深海上遇险,必须将N个人投入海中,其余的人才能幸免于难,于是想了一个办法:所有人围成一圆圈,从第一个人开始依次报数,每数到第K个人就将他扔入大海,如此循环进行直到仅余M个人为止。
设计一个算法,找出这样一个排序:使每次被扔进大海的都是非教徒。
并用程序设计语言实现。
三、实验原理、方法和手段使用循环单链表,将每个人作为一个结点,每个结点的指针域指向下一个人,采用循环链表的遍历对每隔N-1个结点的结点进行标记,直至标记出N个结点为止。
该实验亦可用顺序表实现。
四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件每人一台计算机独立完成实验,有如下条件:(1)硬件:联想高性能PC机;(2)软件:VC++ 6.0、VC++.Net。
六、实验步骤(1)编写循环链表构造函数Node *Create( ),使链表中每个结点的数据域值为0,并让最后一个结点的指针域指向第一个结点;(2)编写约瑟夫问题函数Node *Move(Node *H,int n);void Insert(Node *H,int pos,int data);(5)主函数中调用Create,Move和Insert,采用具体数据计算,输出结果。
七、实验程序// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include"targetver.h"#include<stdio.h>#include<tchar.h>#include<iostream>using namespace std;struct Node{int judgement;int number;Node *Next;};Node *Create();Node *Move(Node *H,int n);void Insert(Node *H,int pos,int data);// px.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"int _tmain(int argc, _TCHAR* argv[]) {int n1,n2,k,c,j=1;cout<<"请输入n1,n2和k"<<endl;cin>>n1>>n2>>k;c=n1+n2;Node *H=Create();for(int i=2;i<=c;i++){Insert(H,i,i);}Node *p=H;Node *q;for (int i=0;i<n2;i++){q=Move(p,k);q->judgement=1;p=q->Next;}p=H;cout<<"排列标记为"<<endl;;do{cout<<p->judgement<<'\t';p=p->Next;j++;}while(j<=c);system("PAUSE");return 0;}Node *Create(){Node *H;H=new Node[1];H->judgement=0;H->number=1;H->Next=H;return H;}void Insert(Node *H,int pos,int data) {Node *p=Move(H,pos-1);Node *q=new Node[1];p->Next=q;q->Next=H;q->number=data;q->judgement=0;}Node *Move(Node *H,int n){Node *p=H;for(int i=1;i<n;){p=p->Next;if (p->judgement==1){continue;}i++;}return p;}// TODO: 在此处引用程序需要的其他头文件八、实验结果实验二串的模式匹配实验学时:2学时实验类型:设计实验要求:必修一、实验目的通过实验,实现串的模式匹配的程序的设计。
二、实验内容对于输入的串T和S,如果S是T的子串,求出S在T中的位置。
三、实验原理、方法和手段KMP算法的改进:每当一趟匹配过程中出现字符比较不等时,不需指针回溯,而是利用得到的部分匹配的结果,将模式向右滑动尽可能远的一段距离后,继续进行比较。
如主串‘s1s2…sn’,模式串‘p1p2…pm’。
当匹配过程中产生失配(即,si¹pj)时,将模式串向右移动至模式中的第k个字符和主串中的第i个字符对齐。
令next[j]=k。
四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件每人一台计算机独立完成实验,如下条件:(1)硬件:微机;(2)软件:VC++6.0、VC++.Net。
六、实验步骤(1)编写GetNext函数,函数头建议为int *GetNext(HString T);(2)调用Next函数,实现KMP函数函数头为int KMP(HString T,HString S);(3)采用具体实例串,检验所写KMP函数是否正确。
七、实验程序// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include"targetver.h"#include<stdio.h>#include<tchar.h>#include<iostream>using namespace std;void Judge(char s1[50],char s2[50]);// TODO: 在此处引用程序需要的其他头文件// Ex10.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char s1[50];char s2[50];cout<<"请输入第一个字符串:" <<endl;cin.getline(s1,50);cout<<"请输入第二个字符串:"<<endl;cin.getline(s2,50);cout<<"第一个字符串为:"<<s1<<endl;cout<<"第二个字符串为:"<<s2<<endl;Judge(s1,s2);system("PAUSE");return 0;}void Judge(char s1[50],char s2[50]){int flag=0;for(int i=0;s1[i]!=NULL;i++){int j;for (j=0;j<50&&s2[j]!=NULL;j++){if (s1[i+j]==s2[j])continue;elsebreak;}if (s2[j]==NULL){cout<<"第二个字符串从第"<<i+1<<"处与第一个字符串相匹配"<<endl;flag=1;}elsecontinue;}if (flag==0){cout<<"第二个字符串在第一个字符串中找不到匹配。
"<<endl;}}八、实验结果实验三稀疏矩阵三元组表的转置实验学时:2学时实验类型:综合实验要求:必修一、实验目的通过实验,实现串的模式匹配的程序的设计。
二、实验内容将以数组形式存储的稀疏矩阵转换为三元组表,并将其转置,输出转置后的结果。
三、实验原理、方法和手段创建一个class QOLList用来构架矩阵结构OLNode,在QOLList中写入void Insert(int y, int x, int Data)方法。
通过使用遍历和Insert方法进行转置功能的实现。
四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件每人一台计算机独立完成实验,如下条件:(1)硬件:微机;(2)软件:VC++6.0、VC++.Net。
六、实验步骤(1)编写二维数组到三元组表的转换函数。
(2)编写三元组转置函数;(3)在主函数中调用转换函数和转置函数,输出结果。
七、实验程序// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include"targetver.h"#include<stdio.h>#include<tchar.h>#include<iostream>#include"QOLList.h"using namespace std;// TODO: 在此处引用程序需要的其他头文件#pragma oncestruct OLNode{int x,y;int Data;OLNode *pRight,*pDown;};class QOLList{public:QOLList(void);QOLList(int H,int W);~QOLList(void);int m_H,m_W;OLNode *pXHead,*pYHead;OLNode* GetXTail(int x);OLNode* GetYTail(int y);void Insert(int y, int x, int Data);void Cout(void);void DeleteRow(int y);void RemoveNodeX(int x, int y);void InsertRow(OLNode *p,int y);void InsertNodeX(OLNode * p, int x);};#include"StdAfx.h"#include"QOLList.h"QOLList::QOLList(void){}QOLList::QOLList(int H,int W){m_H=H;m_W=W;pXHead=new OLNode[W];pYHead=new OLNode[H];for(int x=0;x<W;x++){pXHead[x].pDown=NULL;pXHead[x].x=x;}for(int y=0;y<W;y++){pYHead[y].pRight=NULL;pYHead[y].y=y;}}QOLList::~QOLList(void){}OLNode* QOLList::GetXTail(int x){OLNode *pX=&pXHead[x];while(pX->pDown!=NULL)pX=pX->pDown;return pX;}OLNode* QOLList::GetYTail(int y){OLNode *pY=&pYHead[y];while(pY->pRight!=NULL)pY=pY->pRight;return pY;}void QOLList::Insert(int y, int x, int Data) {OLNode *p=new OLNode;p->Data=Data;p->pDown=NULL;p->pRight=NULL;p->x=x;p->y=y;OLNode *pX=GetXTail(x);OLNode *pY=GetYTail(y);pX->pDown=p;pY->pRight=p;}void QOLList::Cout(void){for(int y=0;y<m_H;y++){OLNode *pX=&pYHead[y];while(pX->pRight!=NULL){cout<<pX->pRight->Data<<'\t';pX=pX->pRight;}cout<<endl;}}void QOLList::DeleteRow(int y){OLNode *p=pYHead[y].pRight;for(int x=0;x<m_W;x++)RemoveNodeX(x,y);for(int my=y;my<m_H-1;my++)pYHead[my].pRight=pYHead[my+1].pRight;pYHead[m_H-1].pRight=NULL;for(int my=y;my<m_H;my++){OLNode *pX=&pYHead[y];while(pX->pRight!=NULL){pX=pX->pRight;pX->y--;}}}void QOLList::RemoveNodeX(int x, int y){OLNode *p=&pXHead[x];while(p->pDown!=NULL){if(p->pDown->y!=y)p=p->pDown;else{p->pDown=p->pDown->pDown;break;}}}void QOLList::InsertRow(OLNode *p,int y){for(int x=0;x<m_W;x++)RemoveNodeX(x,y);for(int my=y;my<m_H-1;my++)pYHead[my].pRight=pYHead[my+1].pRight;pYHead[m_H-1].pRight=NULL;for(int my=y;my<m_H;my++){OLNode *pX=&pYHead[y];while(pX->pRight!=NULL){pX=pX->pRight;pX->y--;}}}void QOLList::InsertNodeX(OLNode * p, int x) {OLNode *q=&pXHead[x];while(q->pDown!=NULL){if(p->pDown->y<q->y)q=q->pDown;else{p->pDown=q->pDown;q->pDown=p;break;}}}// Ex9.cpp : 定义控制台应用程序的入口点。