当前位置:文档之家› 数据结构与算法上机实验报告

数据结构与算法上机实验报告

数据结构与算法B上机实验报告第1次2011-10-02 顺序表的实现和基本操作第2次2011-10-29 二叉树的实现和递归遍历第3次2011-11-23 内部排序第4次2011-12-dd 实现图从邻接矩阵到邻接表存储转化第一次线性表数据结构一、上机实习题目线性链表操作——插入、删除、合并、排序、查找二数据结构设计(算法设计)源程序(#include <iostream>#define MaxSize 100using namespace std;typedef int ElemType;class SeqList{ElemType list[MaxSize];int length;public:SeqList() {length=0;}void SeqListSort(int i,ElemType x);void SeqListCreat(int n);void SeqListInset(int i,ElemType x);void SeqListDelete(int i);void SeqListMerge();int GetLength(){return length;}int SeqListFind(ElemType x);int SeqListIsEmpty();void SeqListPrint();}Mylist1,Mylist2;//创建顺序表void SeqList::SeqListCreat(int n){ElemType x;cout<<"请输入数据元素:";for (int i=0;i<n;i++){cin>>x;list[i]=x;length++;}}//对顺序表进行排序void SeqList::SeqListSort(int i,ElemType x) {for(int k=0;k<length;k++){for(i=k+1;i<=length;i++){if(list[k]>list[i]){x=list[k];list[k]=list[i];list[i]=x;}}}}//在顺序表L中的第i个位置插入新元素x void SeqList::SeqListInset(int i,ElemType x) {int k;if(length>=MaxSize)cout<<"表已满,无法插入!"<<endl;else if(i<0||i>length)cout<<"参数i不合理!"<<endl;else{for (k=length;k>=i;k--){list[k]=list[k-1];}list[i-1]=x;length++;}}//删除第i个位置的数据元素void SeqList::SeqListDelete(int i){int k;if(!SeqListIsEmpty())cout<<"表已空,无法删除!"<<endl;else if(i<0||i>length)cout<<"参数i不合理!"<<endl;elsefor(k=i-1;k<length;k++)list[k]=list[k+1];length--;}//查找元素x在表中的位置int SeqList::SeqListFind(ElemType x) {int i=0;while(i<length&&list[i]!=x)i++;if(i>length)return -1;elsereturn i+1;}//判断顺序表是否为空int SeqList::SeqListIsEmpty(){if(length<=0)return 0;else return 1;}//将顺序表显示在屏幕上void SeqList::SeqListPrint(){if(!SeqListIsEmpty())cout<<"空表!"<<endl;elsefor(int i=0;i<length;i++)cout<<list[i]<<" ";cout<<endl;}int main(){SeqList Mylist1,Mylist2;int i,n,flag=1,select;ElemType x;cout<<"1. 建立顺序表\n";cout<<"2. 对顺序表进行排序\n";cout<<"3. 求x数值的位置\n";cout<<"4. 在第i个位置插入新元素x\n"; cout<<"5. 删除第i个位置上的数值\n"; cout<<"6. 将两个顺序表合并\n";cout<<"7. 退出\n";cout<<endl;while (flag){cout<<"请选择操作:";cin>>select;switch(select){case 1:cout<<"请输入顺序表1的长度:";cin>>n;Mylist1.SeqListCreat(n);cout<<"你所输入的顺序表1为:";Mylist1.SeqListPrint();cout<<"请输入顺序表2的长度:";cin>>n;Mylist2.SeqListCreat(n);cout<<"你所输入的顺序表2为:";break;case 2:cout<<"请选择所要排序的顺序表1或2:"; cin>>n;if(n==1){Mylist1.SeqListSort(i,x);cout<<"排序后的顺序表1为:";Mylist1.SeqListPrint();}else{Mylist2.SeqListSort(i,x);cout<<"排序后的顺序表2为:";Mylist2.SeqListPrint();}break;case 3:cout<<"请输入x的值:";cin>>x;i=Mylist1.SeqListFind(x);if(i!=-1) cout<<"x的位置为:"<<i<<endl;else cout<<"没有找到!";break;case 4:cout<<"请输入要插入的元素的位置和数值x:"; cin>>i>>x;cout<<"插入后的顺序表为:";Mylist1.SeqListPrint();break;case 5:cout<<"请输入要删除的元素的位置:";cin>>i;Mylist1.SeqListDelete(i);cout<<"删除后的顺序表为:";Mylist1.SeqListPrint();break;case 6:cout<<"合并后的顺序表为:\n";Mylist1.SeqListPrint();Mylist2.SeqListPrint();break;case 7:flag=0;break;}}}三运行结果为:四、上机环境和使用语言(计算机程序实现)Visual C++。

使用语言:C++五、上机总结(体会提高)总的来说,这次让我感触最深的就是C++挺麻烦的,应该说我还是太不熟悉了,以前没有怎么接触过,通过这次实验,我初步掌握了一点点的C++的基础,往后我要多花点时间学习。

再者,通过这次实验,我也掌握了对于线性表的的表示,使用,特别是顺序表。

但是对于链表还是有待提高。

六、参考资料《据结构与算法分析》教材,《据结构》(C语言版),《软件开发技术基础》(第二版)。

同时还有网上的一些资源。

当然还有同学之间的探讨。

第二次:非线性表数据结构一、上机实习题目编写的递归算法,交换二叉树的左右子树。

二数据结构设计(算法设计)源程序#include<stdio.h>#include<malloc.h>#define N 9typedef struct binode{int data;struct binode *lchild,*rchild;//指向左右孩子的指针}binode,*bitree;//结点与指针typedef struct{bitree elem[100];int top;}stack;bitree creat_bt()//按先序建二叉树{bitree t;int i,x=0;//一颗N个结点的二叉树tscanf("%d",&x);if(x==100)//输入100作为结束该结点,而不是用循环t=NULL;else{t=(bitree)malloc(sizeof(binode));t->data=x;printf("请输入%d结点的左子结点",t->data);t->lchild=creat_bt();printf("请输入%d结点的右子结点",t->data);t->rchild=creat_bt();}return t;}bitree exchange(bitree t) //递归左、右子树交换{bitree p;if(t!=NULL){ p=t->lchild;t->lchild=t->rchild;t->rchild=p;exchange(t->lchild);exchange(t->rchild);}return t;}void preorder(bitree bt) //递归的先序遍历{ if (bt){printf("% d",bt->data);preorder(bt->lchild);preorder(bt->rchild);}}main(){bitree root;//一颗树rootprintf("\n");printf("输入二叉树的元素:");root=creat_bt();printf("交换前的先序序列是:"); preorder(root);exchange(root);printf("\n交换后的先序序列是:"); preorder(root);printf("\n");}三运行结果为:四、上机环境和使用语言(计算机程序实现)Visual C++。

相关主题