姓名:学号:班级:2010年12月15日实验一线性表的应用【实验目的】1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。
、;2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。
编写一个程序实现上述过程,n和m由键盘输入。
【实验要求】1、要求用顺序表和链表分别实现约瑟夫问题。
2、独立完成,严禁抄袭。
3、上的实验报告有如下部分组成:①实验名称②实验目的③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据算法:#include <stdio.h>#include <stdlib.h>typedef struct LPeople{int num;struct LPeople *next;}peo;void Joseph(int n,int m) //用循环链表实现{int i,j;peo *p,*q,*head;head=p=q=(peo *)malloc(sizeof(peo));p->num=0;p->next=head;for(i=1;i<n;i++){p=(peo *)malloc(sizeof(peo));p->num=i;q->next=p;p->next=head;}q=p;p=p->next;i=0;j=1;while(i<n){if(j%m==0){q->next=p->next;p=q->next;printf("%4d",j%n);i++;}else{q=p;p=p->next;}j++;}printf("\n");}void main(){int n,m; /*人的个数*/printf("Please Enter n amd m(n>m):\n");scanf("%d%d",&n,&m);Joseph(n,m);}实验二树和图的应用【实验目的】1.熟练掌握数的基本概念、二叉树的基本操作及在链式存储结构上的实现。
2.重点掌握二叉树的生成、遍历等算法。
3.掌握图的两种存储结构的表示方法。
4.掌握图的遍历、求最小生成树等基本运算。
【实验内容】(问题描述,数据描述,算法描述,程序清单,测试数据)二叉树采用二叉链表作存储结构,用编程实现二叉树的如下基本操作:1.按先序序列构造一棵二叉链表表示的二叉树T;2.对这棵二叉树进行中序遍历,输出结点的遍历序列;3.给定的顶点和边的信息构造图的邻接矩阵存储;4.对改图进行深度优先搜索,输出搜索得到的结点序列。
【实验要求】上交实验报告,要求同上。
关于树:#include <iostream>#include "BiTree.h"using namespace std;BiTree BITREE::CreateBiTree(){BiTree bt;char x;x = getchar();if(x == '#' ){bt = NULL;}else{bt = new BiTNode;bt->data = x;bt->lchild = this->CreateBiTree();bt->rchild = this->CreateBiTree();}this->T = bt;return bt;};void BITREE::InOrderTraverse(BiTree bt){if(bt != NULL){if(bt->lchild != NULL){this->InOrderTraverse(bt->lchild);}cout<<bt->data<<" ";if(bt->rchild != NULL){this->InOrderTraverse(bt->rchild);}}else{return;}//-+a##*b##-c##d##/e##f##};void BITREE::Destory(BiTree bt){if(bt != NULL){if(bt->lchild != NULL){this->Destory(bt->lchild);}if(bt->rchild != NULL){this->Destory(bt->rchild);}cout<<bt->data<<" ";delete bt;}else{return;}}关于图:#include "MGraph.h"void main(){MGRAPH G;G.CreateUDN();cout<<endl<<endl<<"------邻接矩阵------"<<endl;G.DisplayMatrix();cout<<endl<<"深度优先遍历结果:";G.Depth_FirstSearch();cout<<endl<<endl;}实验三查找的应用【实验目的】1、掌握各种静态查找表的查找方法,熟练掌握折半查找的方法。
2、熟练掌握二叉排序树的构造方法和查找算法及ASL的计算。
3、熟练掌握哈希表的构造方法,深刻理解哈希表与其他结构表的实质性差别。
【实验内容】1、要求将二叉排序树的建立、插入、删除、显示等算法合并在一个综合程序中,用户可通过菜单选择方式运行各种操作算法。
2、一直哈希表的表长为m,哈希函数为H(key)=key MOD p,用开放定址法(增量序列采用线性探测再散列)解决冲突,试编写构造哈希表的程序。
二叉排排序树:#include<stdio.h>#include<malloc.h>#define TRUE 1#define FALSE 0typedef int DataType;typedef int KeyType;struct BinTreeNode;typedef struct BinTreeNode * PBinTreeNode;struct BinTreeNode{KeyType key;DataType other; /*元素的属性*/PBinTreeNode llink,rlink;};typedef struct BinTreeNode * BinTree;typedef BinTree * PBinTree;int searchNode(PBinTree ptree,KeyType key,PBinTreeNode *position) {PBinTreeNode p,q;p=*ptree;q=p;while(p!=NULL){q=p;if(p->key==key){*position=p;return(TRUE);}else if(p->key>key)p=p->llink;else p=p->rlink;}*position=q;return(FALSE);}void insertNode(PBinTree ptree,KeyType key){PBinTreeNode p,position;if(searchNode(ptree,key,&position)==TRUE) return;p=(PBinTreeNode)malloc(sizeof(struct BinTreeNode));if(p==NULL){printf("Error!\n");exit(1);}p->key=key;p->llink=p->rlink=NULL;if(position==NULL)*ptree=p;else if(key<position->key)position->llink=p;else position->rlink=p;}void midOrder(PBinTreeNode ptree){PBinTreeNode p;p=ptree;if(p==NULL)return;midOrder(p->llink);printf(" %d ",p->key);midOrder(p->rlink);}void preOrder(PBinTreeNode ptree){PBinTreeNode p;p=ptree;if(p==NULL)return;printf(" %d ",p->key);preOrder(p->llink);preOrder(p->rlink);}void postOrder(PBinTreeNode ptree){PBinTreeNode p;p=ptree;if(p==NULL)return;postOrder(p->llink);postOrder(p->rlink);printf(" %d ",p->key);}void deleteTree(PBinTreeNode pbtree){PBinTreeNode p=pbtree;if(p==NULL)return;deleteTree(pbtree->llink);deleteTree(pbtree->rlink);free(p);}void deleteNode(PBinTree pbtree,KeyType key){PBinTreeNode position,p,q,parent;p=*pbtree,parent=p;int tag=0;position=NULL;while(p!=NULL){// printf("%d",p->key);if(p->key==key){position=p;break;}else if(p->key>key){parent=p;p=p->llink;tag=-1;}else {parent=p;p=p->rlink;tag=1;}}position=p;if(position == NULL){printf("\n不含有此关键字!\n");return;}else if(position==*pbtree){printf("\n是根节点!");tag=0;}elseprintf("\n它的父节点是%d",parent->key); if(position->llink==NULL){if(tag==-1)parent->llink=position->rlink;if(tag==1)parent->rlink=position->rlink;free(position);}else{PBinTreeNode trchild=position->llink;while(trchild->rlink!=NULL){trchild=trchild->rlink;}trchild->rlink=position->rlink;if(tag==-1)parent->llink=position->llink;if(tag==1)parent->rlink=position->llink;if(tag==0)*pbtree=position->llink;free(position);}}int main(){PBinTree newBTree;insertNode(newBTree,5);insertNode(newBTree,3);insertNode(newBTree,7);insertNode(newBTree,2);insertNode(newBTree,4);insertNode(newBTree,6);insertNode(newBTree,8);insertNode(newBTree,1);printf("---------midOrder-----");midOrder(*newBTree);printf("\n---------preOrder-----");preOrder(*newBTree);deleteNode(newBTree,5);printf("\n---------midOrder-----");midOrder(*newBTree);printf("\n---------preOrder-----");preOrder(*newBTree);printf("\n");deleteTree(*newBTree);}哈希表:#include<stdio.h>#include<malloc.h>#define NULL 0typedef char * InfoType;typedef int KeyType;typedef struct node{KeyType key;InfoType data;struct node *next;}SNode;typedef struct hnode{struct node *next;}HNode;//插入指定关键字void InsertHT2(HNode *ha[],KeyType k,int p){int adr;HNode *q;SNode *s,*t;adr=k%p;s=(SNode *)malloc(sizeof(SNode));s->key=k;s->next=NULL;q=ha[adr];t=q->next;if(t==NULL)q->next=s;else{while(t->next!=NULL)t=t->next;t->next=s;}}//建立哈希表void CreatHT2(HNode *ha[],KeyType x[],int n,int p) {int i=0;for(i=0;i<p;i++){ha[i]=(HNode *)malloc(sizeof(HNode));ha[i]->next=NULL;}for(i=0;i<n;i++)InsertHT2(ha,x[i],p);}//输出哈希表void DispHT2(HNode *ha[],int p){SNode *q;int i;for 9i=0;i<p;i++){printf ("%3d:",i);q=ha[i]->next;while(q!=NULL){printf("->%3d",q->key);q=q->next;}printf("->^\n");}}【实验要求】上交实验报告,要求同上。