数据结构实验报告.docx
- 文档编号:26629306
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:36
- 大小:102.93KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(36页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
实验一单链表的插入,删除,初始化
一、实验环境
Windowsxp操作系统TurboC2.0
二、实验目的
通过对链表的实际操作,巩固链表的基本知识,关键是掌握指针的操作。
三、实验容
生成一个头指针是head的单链表,然后对该链表进行插入和删除运算。
四、实验要求
1编写程序生成一个单链表;
2插入、删除用子程序实现;
3输出每次运算前后的链表,进行比较与分析。
五、实验步骤
#include
#include
#defineNULL0
typedefstructLNode
{intdata;
structLNode*next;
}LNode,*LinkList;
//假设下面的单链表均为带头结点。
voidCreatLinkList(LinkList&head,intj)
{//建立一个单链表L;,数据为整数,数据由键盘随机输入。
inti;
LinkListp,q;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
q=head;
printf("在单链表输入整数:
\n");
for(i=0;i {p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=q->next; q->next=p; q=p; } } intPrintLinkList(LinkList&L) {//输出单链表L的数据元素 LNode*p; p=L->next; if(L->next==NULL) { printf("链表没有元素! \n"); return0; } printf("单链表的数据元素为: "); while(p) { printf("%d",p->data); p=p->next; } printf("\n"); //return1; } voidLinkListLengh(LinkList&L) {//计算单链表L的数据元素个数。 inti=0; LinkListp; p=L->next; while(p) { i++; p=p->next; } printf("单链表的数据元素个数为: %d",i); printf("\n"); } intInsertLinkList(LinkList&L,inti,intx) {//在单链表L的第I个元素前插入一个数据元素X。 LinkListp,s; intj=0; p=L; while(p&&j { p=p->next; ++j; } if(! p||j>i-1) { printf("插入元素的位置不合理! "); return0; } s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=p->next; p->next=s; return1; } intDeleteLinkList(LinkList&L,inti) {//删除单链表L的第I个数据元素。 LinkListp,q; intj=0; p=L; while(p->next&&j { p=p->next; ++j; } if(! (p->next)||j>i-1) { printf("删除元素的位置不合理! "); return0; } q=p->next; p->next=q->next; i=q->data; free(q); return1; } voidClearLinkList(LinkList&L) {//将单链表L置为空表。 L->next=NULL; } voidDestroyLinkList(LinkList&L) {//销毁单链表L。 LinkListp,q; p=L->next; while(L->next! =NULL) { q=p->next; L->next=q; free(p); p=q; } free(L); printf("链表已经被销毁! \n"); } voidmain() {//调用上面的各函数,运行并检验程序是否正确。 LinkListL; inti,j,x; printf("---------------------------------------"); printf("\n"); printf("《单链表实验,按提示操作》"); printf("\n"); printf("---------------------------------------"); printf("\n"); printf("输入的元素的个数: "); scanf("%d",&j); CreatLinkList(L,j); LinkListLengh(L); PrintLinkList(L); printf("在第几个元素前插入: "); scanf("%d",&i); printf("输入插入的元素: "); scanf("%d",&x); InsertLinkList(L,i,x); LinkListLengh(L); PrintLinkList(L); printf("输入删除元素的位置: "); scanf("%d",&i);; DeleteLinkList(L,i); LinkListLengh(L); PrintLinkList(L); ClearLinkList(L); printf("清空链表后: \n"); LinkListLengh(L); PrintLinkList(L); DestroyLinkList(L); } 六、实验结果 实验二栈及其应用 一、实验环境 Windowsxp操作系统TurboC2.0 二、实验目的 通过一个实际问题、加深对栈的理解;掌握进栈、出栈、清栈运算的实现方法。 三、实验容 十进制转换成八进制 四、实验要求 进栈、出栈和清栈的运算以子程序的方式实现。 五、实验步骤 #include #include"malloc.h" #include"stdlib.h" #definestack_init_size100 #definestackincrement10 #defineN8 typedefstruct { int*base; int*top; intstacksize; }sqstack; intinitstack(sqstack&s) { s.base=(int*)malloc(stack_init_size*sizeof(int)); if(! s.base)exit(0); s.top=s.base; s.stacksize=stack_init_size; return0; } intgettop(sqstacks,int&e) { if(s.top==s.base) return1; e=*(s.top-1); return0; } intpush(sqstack&s,inte) { if(s.top-s.base>=s.stacksize) { s.base=(int*)realloc(s.base, (s.stacksize+stackincrement)*sizeof(int)); if(! s.base)return1; s.top=s.base+s.stacksize; s.stacksize+=stackincrement; } *s.top++=e; return0; } intpop(sqstack&s,int&e) { if(s.top==s.base)return1; e=*--s.top; return0; } intstackempty(sqstacks) { if(s.top==s.base) return1; return0; } intdestroystack(sqstack&s) { free(s.base); s.base=s.top=0; return0; } voidmain() { intn,e; sqstacks; initstack(s); cout<<"请输入一个正整数: "< cin>>n; while(n) { push(s,n%8); n/=N; } cout<<"转换出的八进制为"< while(! stackempty(s)) { pop(s,e); cout< } cout< destroystack(s); } 六实验结果: 实验三二叉树的建立及输出 一、实验环境 Windowsxp操作系统TurboC2.0 二、实验目的 熟悉二叉链表表示的二叉树结构及其递归遍历,掌握建立二叉链表要领,深入理解递归遍历二叉链表的执行路径。 三、实验容 (1)建立一颗二叉链表表示的二叉树; (2)对其进行前序,中序,后序输出。 四、实验要求 先将二叉树通过加入虚节点的方式使其完全化,然后按层将其输入。 可以用二叉树中不会出现字符表示虚节点例如,另一二叉树中不会出现的字符表示输入序列结束例如#。 如下二叉树须输入序列abc#。 或以广义表的形式输入二叉树的节点。 按先序,中序,后序序列将其遍历输出。 五、实验步骤 //A.HeaderFilesSourceFilesbitree.cpp #include"bitree.h" intmain(intargc,char*argv[]) { intarray[]={5,6,3,7,67,1,24,8,21,16,78,9}; Treetr(array,sizeof(array)/sizeof(array[0])); tr.traverse(); return0; } //B.HeaderFilesbitree.h #include #include //heredelete#include usingnamespacestd; typedefinttelemtype; structbitnode//changetotypedefstructbitnodeanditwillbe //'typedef': ignoredonleftof'structbitnode'whennovariableisdeclaredatlastitwillbeok { bitnode*lchild; bitnode*rchild; telemtypedata; bitnode(inte=0,bitnode*left=NULL,bitnode*right=NULL) { data=e; lchild=left; rchild=right; } }; classTree { public: Tree() { root=NULL; } Tree(intarray[],intsize); ~Tree(); voidtraverse(); voidpostTraverse(); voidrecur_postTraverse(bitnode*cur); voidpreTraverse(); voidrecur_preTraverse(bitnode*cur); voidinTraverse(); voidrecur_inTraverse(bitnode*cur); private: Tree(constTree&t); Tree&operator=(constTree&t); bitnode*createTree(intarray[],intsize); voiddestroyTree(bitnode*cur); private: bitnode*root; }; Tree: : Tree(intarray[],intsize) { if((array==NULL)||(size<=0)) root=NULL; else root=createTree(array,size); } //createatree bitnode*Tree: : createTree(intarray[],intsize) { if((array==NULL)||(size<=0)) returnNULL; intmid=size/2; bitnode*cur=newbitnode(array[mid]); cur->lchild=createTree(array,mid); cur->rchild=createTree(array+mid+1,size-mid-1); returncur; } Tree: : ~Tree() { destroyTree(root); } voidTree: : destroyTree(bitnode*cur) { if(cur! =NULL) { destroyTree(cur->lchild); destroyTree(cur->rchild); deletecur; } } //后序递归遍历 voidTree: : recur_postTraverse(bitnode*cur) { if(cur! =NULL) { recur_postTraverse(cur->lchild); recur_postTraverse(cur->rchild); cout< } } //先序递归遍历 voidTree: : recur_preTraverse(bitnode*cur) { if(cur! =NULL) { cout< recur_preTraverse(cur->lchild); recur_preTraverse(cur->rchild); } } //中序递归遍历 voidTree: : recur_inTraverse(bitnode*cur) { if(cur! =NULL) { recur_inTraverse(cur->lchild); cout< recur_inTraverse(cur->rchild); } } //后序非递归遍历 voidTree: : postTraverse() { stack bitnode*pre,*cur; cur=root; pre=NULL; if(cur! =NULL) treeStack.push(cur); while(! treeStack.empty()) { cur=treeStack.top(); if(((cur->lchild==NULL)&&(cur->rchild==NULL))||//没有孩子结点或者 ((pre! =NULL)&&((pre==cur->lchild)||(pre==cur->rchild))))//孩子遍历过了 { treeStack.pop(); cout< pre=cur; } else { if(cur->rchild! =NULL) treeStack.push(cur->rchild); if(cur->lchild! =NULL) treeStack.push(cur->lchild); } } } //中序非递归遍历 voidTree: : inTraverse() { stack bitnode*cur;//thefirstisbitnode*pre,*cur;delete*preisok; cur=root; if(cur! =NULL) treeStack.push(cur); while(! treeStack.empty()) { cur=treeStack.top(); treeStack.pop(); if(cur==NULL) continue; if((cur->lchild==NULL)||//没有左孩子或者 ((! treeStack.empty())&&(treeStack.top()==cur->rchild)))//右孩子已经入过栈 cout< else { treeStack.push(cur->rchild); treeStack.push(cur); if(cur->lchild! =NULL) treeStack.push(cur->lchild); } } } //先序非递归遍历 voidTree: : preTraverse() { stack bitnode*cur; cur=root; if(cur! =NULL) treeStack.push(cur); while(! treeStack.empty()) { cur=treeStack.top(); treeStack.pop(); cout< if(cur->rchild! =NULL) treeStack.push(cur->rchild); if(cur->lchild! =NULL) treeStack.push(cur->lchild); } } voidTree: : traverse() { cout<<"递归前序遍历二叉树"< recur_preTraverse(root); cout< cout<<"非递归前序遍历二叉树"< preTraverse(); cout< cout<<"递归中序遍历二叉树"< recur_inTraverse(root); cout< cout<<"非递归中序遍历二叉树"< inTraverse(); cout< cout<<"递归后序遍历二叉树"< recur_postTraverse(root); cout< cout<<"非递归后序遍历二叉树"< postTraverse(); cout< } 六、实验结果 实验四图及其遍历 一、实验环境 Windowsxp操作系统TurboC2.0 二、实验目的 (1)熟悉图的邻接矩阵及邻接表的表示方法; (2)掌握建立图的邻接矩阵算法,并由邻接矩阵转化为邻接表; (3)熟悉对图遍历算法; (4)熟悉队列这种基本的数据结构。 三、实验容 (1)建立图的邻接表及邻接矩阵; (2)对其进行深度优先及广度优先遍历。 四、实验要求 将图以邻接矩阵的存储形式存入计算机,然后输出其深度优先及广度优先序列。 五、实验步骤 #include //#include #defineINFINITY32767 #defineMAX_VEX20//最大顶点个数 #defineQUEUE_SIZE(MAX_VEX+1)//队列长度 usingnamespacestd; bool*visited;//访问标志数组 //图的邻接矩阵存储结构 typedefstruct{ char*vexs;//顶点向量 intarcs[MAX_VEX][MAX_VEX];//邻接矩阵 intvexnum,arcnum;//图的当前顶点数和弧数 }Graph; //队列类 classQueue{ public: voidInitQueue(){ base=(int*)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0; } voidEnQueue(inte){ base[rear]=e; rear=(rear+1)%QUEUE_SIZE; } voidDeQueue(int&e){ e=base[front]; front=(front+1)%QUEUE_SIZE; } public: int*base; intfront; intrear; }; //图G中查找元素c的位置 intLocate(GraphG,charc){ for(inti=0;i if(G.vexs[i]==c)returni; return-1; } //创建无向网 voidCreateUDN(Graph&G){ inti,j,w,s1,s2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告