算法设计基础实验报告
算法设计基础实验
班级:
学号:
姓名:
实验一线性表的应用
1.实验内容:
1.给定一线性表L=(15,25,05,36,78,85,23),写出顺序存储结构
下的插入、删除、排序操作的算法及程序。
2.写出链接存储结构下的插入、删除、排序操作的算法及程序。
2.实验要求:
1.掌握顺序及链接存储下的插入、删除算法;
2.掌握直接插入排序算法;
3.实验程序
#include
#include
struct List
{
int *list;
int size;
int MaxSize;
};
void InitList(List &L)
{
L.MaxSize=10;
L.list=new int[L.MaxSize];
if(L.list==NULL)
{
cout<<"动态可分配的存储空间用完,退出运行!"< exit(1); } L.size=0; } bool InsertList(List &L,int item,int pos) { if(pos<-1||pos>L.size+1) { cout<<"pos值无效!"< return false; } int i; if(pos==0) { for(i=0;i if(item pos=i+1; } else if(pos==-1) pos=L.size+1; if(L.size==L.MaxSize) { int k=sizeof(int); L.list=(int*)realloc(L.list,2*L.MaxSize*k); if(L.list==NULL) { cout<<"动态可分配的空间用完,退出运行!"< exit(1); } L.MaxSize=2*L.MaxSize; } for(i=L.size-1;i>=pos-1;i--) L.list[i+1]=L.list[i]; L.list[pos-1]=item; L.size++; return true; } bool DeleteList(List &L,int &item,int pos) { if(L.size==0) { cout<<"线性表为空,删除无效!"< return false; } if(pos<-1||pos>L.size) { cout<<"pos值无效!"< return false; } int i; if(pos==0) { for(i=0;i if(item==L.list[i]) break; if(i==L.size) return false; pos=i+1; } else if(pos==-1) pos=L.size; item=L.list[pos-1]; for(i=pos;i L.list[i-1]=L.list[i]; L.size--; if(float(L.size)/L.MaxSize<0.4&&L.MaxSize>10) { int k=sizeof(int); L.list=(int*)realloc(L.list,L.MaxSize*k/2); L.MaxSize=L.MaxSize/2; } return true; } void SortList(List &L) { int i,j; int x; for(i=1;i { x=L.list[i]; for(j=i-1;j>=0;j--) if(x L.list[j+1]=L.list[j]; else break; L.list[j+1]=x; } } void TraverseList(List &L) { for(int i=0;i cout< cout< } void main() { int a[7]={15,25,5,36,78,85,23}; int i; int x; List t; InitList(t); for(i=0;i<7;i++) InsertList(t,a[i],i+1); SortList(t); TraverseList(t); cout<<"输入待删除元素的值:"; cin>>x; if(DeleteList(t,x,0)) cout<<"删除成功!"< else cout<<"删除失败!"< TraverseList(t); cout<<"按值插入,输入待插入元素的值:"< if(InsertList(t,x,0)) cout<<"插入成功!"< else cout<<"插入失败!"< TraverseList(t); } 4.实验结果: 实验二二叉树的遍历 1.实验内容: 给定一棵用广义表表示的二叉树T,写出其前序遍历、中序遍历、后序遍历、层序遍历的算法及程序。 2.实验要求: 1.掌握二叉树的前序、中序、后序遍历的递归算法; 2.了解其非递归算法,并试着仿写。 3.掌握层序遍历算法,学会队列的应用。 3.实验程序 #include #include typedef char ElemType; struct BTreeNode{ ElemType data; BTreeNode*left; BTreeNode*right; }; void InitBTree(BTreeNode*& BT) { BT=NULL; }; void ClearBTree(BTreeNode*&BT) { if(BT!=NULL){ ClearBTree(BT->left); ClearBTree(BT->right); delete BT; BT=NULL; } }; void CreatBTree(BTreeNode*& BT,char*a) { const int MaxSize=10; BTreeNode*s[MaxSize]; int top=-1; BT=NULL; BTreeNode*p; int k; int i=0; while (a[i]) { switch(a[i]) { case ' ': break; case '(': if(top==MaxSize-1){ cout<<"栈空间太小,请增加MaxSize的值!"< exit(1); } top++;s[top]=p;k=1; break; case ')': if(top==-1){ cout<<"二叉树广义表字符串错!"< } top--;break; case ',': k=2;break; default: p=new BTreeNode; p->data=a[i];p->left=p->right=NULL; if(BT==NULL) BT=p; else{ if(k==1) s[top]->left=p; else s[top]->right=p; } } i++; } }; void PrintBTree(BTreeNode*BT) { if(BT!=NULL) { cout< if(BT->left!=NULL || BT->right!=NULL) { cout<<'('; PrintBTree(BT->left); if(BT->right!=NULL) cout<<','; PrintBTree(BT->right); cout<<')'; } } }; int DepthBTree(BTreeNode*BT) { if(BT==NULL) return 0; else{ int dep1=DepthBTree(BT->left); int dep2=DepthBTree(BT->right); if(dep1>dep2) return dep1+1; else return dep2+1; } }; bool FindBTree(BTreeNode*BT,ElemType&x) { if(BT==NULL) return false; else{ if(BT->data==x){ x=BT->data;return true; } else { if(FindBTree(BT->left,x)) return true; if(FindBTree(BT->right,x)) return true; return false; } } } void PreOrder(BTreeNode* BT) { if(BT!=NULL) { cout< PreOrder(BT->left); PreOrder(BT->right); } } void InOrder(BTreeNode* BT) { if(BT!=NULL) { InOrder(BT->left); cout< InOrder(BT->right); } }; void PostOrder(BTreeNode* BT) { if(BT!=NULL) { PostOrder(BT->left); PostOrder(BT->right); cout< } }; void LevelOrder(BTreeNode* BT) { const int MaxSize=30; BTreeNode* q[MaxSize]; int front=0,rear=0; BTreeNode* p; if(BT!=NULL) { rear=(rear+1)%MaxSize; q[rear]=BT; } while(front!=rear) { front=(front+1)%MaxSize; p=q[front]; cout< if(p->left!=NULL) { rear=(rear+1)%MaxSize; q[rear]=p->left; } if(p->right!=NULL) { rear=(rear+1)%MaxSize; q[rear]=p->right; } } }; void main() { BTreeNode* bt; InitBTree(bt); char b[50]; cout<<"输入二叉树用广义表表示的字符串:"< cin.getline(b,sizeof(b)); CreatBTree(bt,b); PrintBTree(bt);cout< cout<<"前序:";PreOrder(bt);cout< cout<<"中序:";InOrder(bt);cout< cout<<"后序:";PostOrder(bt);cout< cout<<"按层:";LevelOrder(bt);cout< ElemType x; cout<<"输入一个待查字符:"; cin>>x; if(FindBTree(bt,x)) cout<<"查找字符"< else cout<<"查找字符"< cout<<"深度:"; cout< ClearBTree(bt); } 4.实验结果: 实验三图的应用 1.实验内容: 1以下两项内容选做一项。 2 请按照书中介绍的拓扑排序算法,完成P303页第5题。 3 给定某一个图,完成其深度优先搜索遍历和广度优先搜索遍历,每种遍历都必须在邻接矩阵和邻接表中完成。 2.实验要求: 1掌握图的邻接表和邻接矩阵存储; 2掌握图的拓扑排序算法; 3.实验程序 #include #include #include const int MaxVertexNum=20; typedef int weightType; struct edgenode { int adjvex; weightType weight; edgenode *next; }; typedef edgenode *adjlist[ MaxVertexNum ]; // void InitAdjoin(adjlist GL) //初始化图的邻接表 { Int i; for (i=0;i GL[i] = NULL; } void CreateAdjoin( adjlist GL, int n, char *s, int k1, int k2) //根据一个图的边集生成其邻接表的算法 { // k1=0 代表无向图否则为有向图, k2 =0 代表无权图否则为带权图。s 存放边集。n为顶点数。 istrstream sin(s); char c1,c2,c3; int i, j; weightType w; edgenode *p; //将指向新申请的边结点 sin>>c1; //读入第一个字符'{' if(k2==0) // 建立无权图 do { sin>>c1>>i>>c2>>j>>c3; p = (edgenode *) malloc(sizeof(edgenode)); p->adjvex=j; p->weight=1; //插入边结点 p->next = GL[i]; GL[i] = p; if (k1==0) { //对无向图,需再插入一个边结点 p = (edgenode *) malloc(sizeof(edgenode)); p->adjvex=i; p->weight=1; p->next = GL[j]; GL[j] = p; } sin>>c1; //读入',' 或'}' } while ( c1==',' ); else { // 建立有权图 do { sin>>c1>>i>>c2>>j>>c3>>w; p = (edgenode *) malloc(sizeof(edgenode)); p->adjvex=j; p->weight=w; //插入边结点 p->next = GL[i]; GL[i] = p; if (k1==0) { //对无向图,需再插入一个边结点 p = (edgenode *) malloc(sizeof(edgenode)); p->adjvex=i; p->weight=w; p->next = GL[j]; GL[j] = p; } sin>>c1; //读入',' 或'}' } while ( c1==',' ); } } void PrintAdjoin( adjlist GL, int n, int k1, int k2) //输出算法 { // k1=0 代表无向图否则为有向图, k2 =0 代表无权图否则为带权图int i, j; edgenode *p; cout<<"V={ "; //准备输出顶点集 for (i=0; i cout< cout<<" E={ "; //准备输出边集 for (i=0; i { If (k2==0) { //无权图 p=GL[i]; while (p) { //输出顶点i 的邻接表 j=p->adjvex; if (k1==0) { //无向图 if (i } else //有向图 cout<<'<'<'<<','; p=p->next; } } else { //带权图 p=GL[i]; while (p) { j=p->adjvex; if (k1==0) { //无向图 if (i cout<<'('<weight<<','; } Else //有向图 cout<<'<'<'< p=p->next; } } } //for cout<<'}'< } void Toposort( adjlist GL, int n ) { int i, j, k, top, m=0; //m统计顶点数 edgenode *p; int* d=new int[n]; for(i=0; i for(i=0; i { //统计每个顶点的入度存于数组d中 p=GL[i]; while(p!=NULL) { j=p->adjvex; d[j]++; p=p->next; } } top=-1; for(i=0; i if(d[i]==0) { d[i]=top; top=i; } while(top!=-1) { //每次删除一个顶点及所有出边 j=top; top=d[top]; //删除栈顶元素j cout< p=GL[j]; while(p!=NULL) { // j 的所有出边邻接点的入度减一 k=p->adjvex; d[k]--; if(d[k]==0) { //入度为0的顶点进栈 d[k]=top; top=k; } p=p->next; } } cout< cout<<"The network has a cycle!"< delete [ ] d; } void main() { int n,k1,k2; cout<<"输入待处理图的顶点数:"; cin>>n; cout<<"输入图的有向图和无权图选择:"; cin>>k1>>k2; adjlist gl; InitAdjoin(gl); cout<<"输入图的边集:"; char *a=new char[100]; cin>>a; CreateAdjoin(gl,n,a,k1,k2); cout<<"得到拓扑序列:"; Toposort(gl,n); } 4.实验结果: 实验四内排序 1.实验内容: 1给定一组元素,如(46,74,16,53,14,26,40,38,86,65,27,34),写出堆排序、快速排序算法及程序。 2复习之前学过的直接插入排序、简单选择排序、气泡排序,并写出相应的算法及程序。 3如果此实验要求用外排序完成,参考书中的程序仿写外排序的相关程序。 2.实验要求: 1 掌握堆排序、快速排序算法; 2 掌握直接插入排序、简单选择排序、气泡排序算法。 3.实验程序 void Bubblesort(ElemType a[],int n) { ElemType temp; int i,j,flag; for(i=0;i<=n-1;i++) { flag=0; for(j=1;j if(a[j] { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; flag=1; } if(flag==0) return; } } //快速排序 void Quicksort (ElemType a[],int low ,int high) { ElemType temp=a[low]; int i=low+1;int j=high; while(i<=j) { while((a[j]>=temp)&&(j>=i)) { --j;} while((i<=j)&&(a[i]<=temp)) { ++i; } if(i { ElemType t1=a[i]; a[i]=a[j]; a[j]=t1; } } if(low!=j) {a[low]=a[j];a[j]=temp;} if(low if(j+1 //直接插入排序 void Insertsort(ElemType a[],int n) { for(int i=1;i { if(a[i] { ElemType temp=a[i]; a[i]=a[i-1]; for(int j=i-2;temp { a[j+1]=a[j]; } a[j+1]=temp; } } } //直接选择排序 void Selectsort(ElemType a[],int n) { ElemType temp; int i,j,k; for(i=1;i { k=i-1; for(j=i;j { if(a[j] } if(k!=i-1) { temp=a[i-1]; a[i-1]=a[k]; a[k]=temp; } } } void main() { int n; cout<<"输入要输入的整型数组的个数:"; cin>>n; cout<<"输入要输入的数组的元素:"; ElemType *a=new ElemType [n]; for(int i=0;i { cin>>a[i]; } Bubblesort(a, n); cout<<"运用气泡排序结果如下所示:\n"; for(i=0;i { cout< } cout< Quicksort(a,0,n-1); cout<<"运用快速排序结果如下所示:\n"; for(i=0;i { cout< } cout< cout<<"运用直接插入排序结果如下所示:\n"; Insertsort(a,n); for(i=0;i { cout< }