数据结构实验四概览

合集下载

数据结构实验四报告

数据结构实验四报告

实验日期:_______________ 实验指导老师:
实验4 无向图的深度优先搜索
一、实验目的和实验环境
【实验目的】
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序。

【实验环境】VC++6.0
二、理论依据
邻接多重表是无向图的一种很有效链式存储结构,在邻接表中容易求得顶点和边的各种信息。

除了在边结点中增加一个标志域外,邻接多重表所需的存储量和邻接表相同。

三、实验内容
设无向图G有n个点e条边,写一算法建立G的邻接多表,并按照深度优先搜索输出顶点,要求该算法时间复杂性为O(n+e),且除邻接多表本身所占空间之外只用O(1)辅助空间。

四、实验步骤
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序
五、实验结果
1.源代码如下:
实验日期:_______________ 实验指导老师:
2.运行界面截图如下:
六、小结
1、在创建邻接多重表时,由于邻接多重表的数据类型为字符型,键盘输入总是很难控制。

这时可以通过人为设置函数过滤去键盘输入中的空格。

2、在邻接多重表上,各种基本操作的实现和邻接表相似。

3、在邻接多重表中,所有依附于同一顶点的边串联在同一链表中。

数据结构 实验

数据结构 实验

数据结构实验数据结构实验1. 实验目的通过本次实验,掌握数据结构的基本概念,了解常见的数据结构和其应用。

2. 实验内容本次实验主要包括以下内容:1. 数组:了解数组的概念、特点和基本操作;掌握数组的存储方式和访问方法;基于数组实现常见数据结构(如栈、队列)。

2. 链表:理解链表的概念及其不同类型(如单向链表、双向链表);学习链表的插入、删除和查找操作;比较链表和数组的优缺点。

3. 树:了解树的基本概念及其特点;学习树的存储方式和遍历方法;掌握二叉树的特点和基本操作(如插入、删除、查找)。

4. 图:理解图的基本概念和相关术语;学习图的存储方式和遍历方法;掌握图的常见算法(如深度优先搜索、广度优先搜索)。

3. 实验步骤根据实验内容,按以下步骤进行实验:3.1 数组1. 了解数组的概念和特点,例如数组是一种线性表数据结构,用于存储连续的元素。

2. 学习数组的基本操作,如创建数组、访问数组元素、修改数组元素的值。

3. 理解数组的存储方式,例如元素在内存中是连续存储的。

4. 实现栈和队列的基本功能,并使用数组作为底层数据结构。

3.2 链表1. 理解链表的概念及其不同类型,如单向链表和双向链表。

2. 学习链表的插入、删除和查找操作,例如在链表中插入一个节点、删除一个节点、查找指定值的节点。

3. 比较链表和数组的优缺点,例如链表的插入和删除操作效率更高,但访问元素的效率较低。

4. 实现链表的基本功能,如创建链表、插入节点、删除节点、查找节点。

3.3 树1. 了解树的基本概念和特点,如树由节点和边组成,每个节点最多有一个父节点和多个子节点。

2. 学习树的存储方式,如链式存储和数组存储。

3. 掌握二叉树的特点和基本操作,如二叉树是每个节点最多有两个子节点的树结构。

4. 实现二叉树的基本功能,如插入节点、删除节点、查找节点。

3.4 图1. 理解图的基本概念和相关术语,如图由顶点和边组成。

2. 学习图的存储方式,如邻接矩阵和邻接表。

数据结构实验报告4

数据结构实验报告4

数据结构实验报告——实验4学号::得分:______________一、实验目的1、复习线性表的逻辑结构、存储结构及基本操作;2、掌握顺序表和(带头结点)单链表;3、了解有序表。

二、实验容1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现:(1)OrderInsert(&L, e, int (*compare)(a, b))//根据有序判定函数compare,在有序表L的适当位置插入元素e;(2)OrderInput(&L, int (*compare)(a, b))//根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;(3) OrderMerge(&La, &Lb, &Lc, int (*compare)())//根据有序判定函数compare,将两个有序表La和Lb归并为一个有序表Lc。

2、(必做题)请实现:(1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0;(2)两个升幂多项式的相加。

三、算法描述(采用自然语言描述)1.创建带头节点的链表,输入两个有序表数据La Lb归并两个有序表得有序表Lc输出三个有序表输入需插入数据e将e插入有序表Lc输出插入e后的Lc2.创建链表按指数升序输入多项式得序数和指数输出多项式按指数升序输入第二个多项式得序数和指数两个多项式相加输出第二个多项式和两个多项式得和四、详细设计(画出程序流程图)1.2.五、程序代码(给出必要注释)1.#include<stdio.h>#include<malloc.h>typedef struct LNode{int date;struct LNode *next;} LNode,*Link;typedef struct LinkList{Link head;//头结点int lenth;//链表中数据元素的个数} LinkList;int compare (LinkList *L,int e)//有序判定函数 compare {int Lc=0;Link p;p=L->head;p=p->next;while(p!=NULL){if(e>p->date){p=p->next;Lc++;}elsereturn Lc;}return Lc;}void OrderInsert (LinkList *L,int e,int (*compare)())//根据有序判定函数compare,在有序表L 的适当位置插入元素e;{Link temp,p,q;int Lc,i;temp=(Link)malloc(sizeof(LNode));temp->date=e;p=q=L->head;p=p->next;Lc=(*compare)(L,e);if(Lc==L->lenth){while(q->next!=NULL){q=q->next;}q->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;q=q->next;}q->next=temp;temp->next=p;}++L->lenth;}void OrderMerge (LinkList *La,LinkList *Lb,int (*compare)())//根据有序判定函数 compare ,将两个有序表 La 和 Lb 归并为一个有序表{int i,Lc=0;Link temp,p,q;q=La->head->next;while(q!=NULL){p=Lb->head;temp=(Link)malloc(sizeof(LNode));temp->date=q->date;Lc=(*compare)(Lb,q->date);if(Lc==Lb->lenth){while(p->next!=NULL){p=p->next;}p->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;}temp->next=p->next;p->next=temp;}q=q->next;++Lb->lenth;}}LinkList *Initialize (LinkList *NewList){int i;Link temp;NewList=(LinkList *)malloc((2+1)*sizeof(LinkList));for(i=0; i<2+1; i++){temp=(Link)malloc(sizeof(LNode));temp->date=0;temp->next=NULL;(NewList+i)->head=temp;(NewList+i)->lenth=0;}return NewList;}void Insert (LinkList *NewList){int a,i;char c;printf("在第1个表中插入数据,输入“ N ”再对下个表插入数据 \n");for(i=0; i<2; i++){while(1){scanf("%d",&a);c=getchar();if(c=='N'){if(i<2-2)printf("在第 %d个表中插入数据,输入“ N ”再对下个表插入数据 \n",i+2); else if(i==2-2)printf("在第 %d个表中插入数据,输入“ N ”结束。

数据结构实验报告

数据结构实验报告

数据结构实验报告数据结构实验报告1-引言本实验旨在深入理解数据结构的基本知识,并通过实践掌握相关算法和数据结构的应用。

本报告详细描述了实验的背景、目的、实验环境、实验内容和实验结果分析等内容。

2-实验背景介绍数据结构的概念和作用,解释为什么数据结构在计算机科学中至关重要。

同时,介绍本次实验所涉及的具体数据结构和算法,如数组、链表、栈、队列、二叉树等。

3-实验目的明确本次实验的目标,如掌握数据结构的基本操作,理解不同数据结构的适用场景,评估不同算法的时间和空间复杂度等。

4-实验环境描述实验所使用的软硬件环境,包括计算机配置、操作系统、编程语言和相关的开发工具等。

5-实验内容详细描述实验的具体步骤和要求,包括以下几个部分:5-1 数据结构的创建和初始化:例如,创建一个数组或链表,并初始化数据。

5-2 数据结构的插入和删除操作:例如,在数组中插入一个元素或删除一个元素。

5-3 数据结构的遍历和搜索:例如,遍历树的节点或搜索链表中指定的元素。

5-4 数据结构的排序和查找:例如,对数组进行排序或在有序链表中查找指定元素。

5-5 实验的额外要求:例如,优化算法的实现、分析不同数据结构的性能等。

6-实验结果分析对实验的结果进行详细的分析和解释,包括各个数据结构和算法的性能比较、时间复杂度和空间复杂度的评估等。

7-结论总结本次实验的主要内容和收获,归纳实验结果,并对实验过程中遇到的问题和不足进行反思和改进。

附件:随报告一同提交的附件包括:源代码、实验数据集等相关文件。

法律名词及注释:1-版权:指作品的创作权、发表权和署名权等综合权利。

2-侵权:指未经权利人允许,在未向权利人支付报酬的情况下,使用受版权保护的作品的行为。

3-知识产权:包括著作权、商标权、专利权等,是指人们在创造性劳动中创造出的精神财富所享有的权利。

数据结构实验四实验报告

数据结构实验四实验报告

桂林电子科技大学2014-2015学年 第2学期数据结构 实验报告实验名称 实验四 树辅导教师意见:成绩 教师签名:院 系 计算机科学与工程学院 专业 软件工程学 号 1300330129 姓名 张涛 同 作 者 实验日期2015 年 06 月 26 日一、实验目的1.了解树二、实验具体内容1、实验题目1:(1)题目 树(2)分析实验代码:#include<iostream>#include<stdio.h>#include<conio.h>using namespace std;typedef struct btnode {int data;btnode *Lchild,*Rchild;}*Btnode;void Creat(Btnode & t) {int ch; cin>>ch;if(ch==0) t=NULL;else {btnode *p=new btnode;p->data=ch; t=p;Creat(t->Lchild);Creat(t->Rchild);} }void Preorder(Btnode & p) {if(p!=NULL) {cout<<p->data<<",";Preorder(p->Lchild);Preorder(p->Rchild); } } void Midorder(Btnode & p) {if(p!=NULL) {Midorder(p->Lchild);cout<<p->data<<",";Midorder(p->Rchild); } } void Folorder(Btnode & p) {if(p!=NULL) {Folorder(p->Lchild);Folorder(p->Rchild);cout<<p->data<<","; }} void main() {btnode *head=new btnode;cout<<"请输入数据:";Creat(head);cout<<"前序遍历:";Preorder(head);cout<<endl;cout<<"中序遍历:";Midorder(head);cout<<endl;cout<<"后序遍历:";Folorder(head);getch(); }三、实验小结。

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

数据结构-实验4

数据结构-实验4

《数据结构》实验报告年级_2012级__ 学号_ 姓名 __ 成绩______专业_计算机科学与技术实验地点___指导教师__实验项目实验四串实验性质设计性实验日期:一、实验目的:1、掌握串的定义及其基本操作的实现。

2、掌握链表及其基本操作的实现。

3、通过上机实践进一步加深对串的顺序存储方式及链式存储方式的理解。

4、通过上机实践加强利用数据结构解决实际应用应用问题的能力。

二、实验内容与要求:1、实验题目一:顺序串的定义及其操作算法的实现要求:编程实现串的类型定义及串的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。

2、实验题目二:文本加密和解密要求:掌握每一种串操作的一般函数的实现及其应用。

三、实验问题描述一个文本串可用事先给定的字母映射表进行加密。

例如,设字母映射表为:abcdefghijklmnopqrstuvwxyzngzqtcobmuhelkpdawxfyivrsj则字符串“encrypt”被加密为“tkzwsdf”。

设计一个程序将输入的文本串进行加密后输出,然后进行解密输出。

四、实验步骤1.实验问题分析这里用到了c语言里的while 语句、for语句、if语句以及指针2.功能(函数)设计void Encrypt(char *pszSrc, char *pszEncrypt){char *p1;char *p2;int i=0;int j=0;p1=(char *)CharArray1;p2=(char *)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc, 100);}五、实验结果(程序)及分析#include<iostream>using namespace std;const char CharArray1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};const char CharArray2[26]={'n','g','z','q','t','c','o','b','m','u','h','e','l','k','p','d','a','w','x','f','y','i','v','r','s','j'};void Encrypt(char*pszSrc,char*pszEncrypt){char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p1+j)){*(pszEncrypt+i)=*(p2+j);break;}else{;}}i++;}*(pszEncrypt+i)='\0';}void Decrypt(char*pszSrc,char*pszDecrypt) {char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入一行已加密的字符串:\n"; fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p2+j)){*(pszDecrypt+i)=*(p1+j);break;}else{;}}i++;}*(pszDecrypt+i)='\0';}int main(){char*pszSrc;char*pszDest;int select;int i=0;int j=0;if((pszSrc=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}if((pszDest=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}while(1){cout<<"请选择加密或解密(1.加密2.解密0.退出):";cin>>select;if(1==select){Encrypt(pszSrc,pszDest);cout<<"加密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(2==select){Decrypt(pszSrc,pszDest);cout<<"解密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(0==select){break;}else{cout<<"你没有输入正确的选择,请重新选择:";}}delete[]pszSrc;delete[]pszDest;return0;}六、结论与分析在本次实验中掌握了串的各种操作,以及其实际作用,掌握串的定义及其基本操作的实现和掌握链表及其基本操作的实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验四1.实验要求置换-选择排序的实现【问题描述】对文件中的记录的关键字采用外部排序的置换-选择算法实现。

【实验要求】设计置换-选择排序的模拟程序。

(1)记录存储在文件中。

(2)采用多路归并算法实现。

(3)采用置换-选择算法实现。

2实验描述外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),外部排序1(其中k为归并路数,n为归并段的个数)。

增加k和减小n都可以达到减小归并趟数的目的。

置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。

它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)。

置换-选择排序是在树形选择排序的基础上得来的,它的特点是:在整个排序(得到初始归并段)的过程中,选择最小(或最大)关键值和输入、输出交叉或并行进行。

它的主要思路是:用败者树从已经传递到内存中的记录中找到关键值最小(或最大)的记录,然后将此记录写入外存,再将外存中一个没有排序过的记录传递到内存(因为之前那个记录写入外存后已经给它空出内存),然后再用败者树的一次调整过程找到最小关键值记录(这个调整过程中需要注意:比已经写入本初始归并段的记录关键值小的记录不能参见筛选,它要等到本初始段结束,下一个初始段中才可以进行筛选),再将此最小关键值记录调出,再调入新的记录.......依此进行指导所有记录已经排序过。

内存中的记录就是所用败者树的叶子节点。

开发环境:VC6.0。

3.置换-选择排序的实现//A是从外存读入n个元素后所存放的数组template <class Elem>void replacementSelection(Elem * A, int n, const char * in, const char * out){ Elem mval; //存放最小堆的最小值Elem r; //存放从输入缓冲区中读入的元素FILE * iptF; //输入文件句柄FILE * optF; //输出文件句柄Buffer<Elem> input; //输入bufferBuffer<Elem> output; // 输出buffer//初始化输入输出文件initFiles(inputFile, outputFile, in, out);//初始化堆的数据,读入n个数据initMinHeapArry(inputFile, n, A);//建立最小值堆MinHeap<Elem> H(A, n, n);//初始化inputbuffer,读入部分数据initInputBuffer(input, inputFile);for(int last = (n-1); last >= 0;){mval = H.heapArray[0]; //堆的最小值sendToOutputBuffer(input,output,iptF,optF, mval);input.read(r); //从输入缓冲区读入一个记录if(!less(r, mval)) H.heapArray[0] = r;else {//否则用last位置记录代替根结点,把r放到lastH.heapArray[0] = H.heapArray[last];H.heapArray[last] = r;H.setSize(last);last--;}if (last!=0)H.SiftDown(0);}endUp(output,inputFile,outputFile);}4详细设计设计思想:1. 初始化最小堆:目的是提高RAM中排序的效率(a) 从缓冲区读M个记录放到数组RAM中(b) 设置堆尾标志:LAST =M -1(c) 建立一个最小值堆2. 重复以下步骤,直至堆空(结束条件)(即LAST < 0)(a) 把具有最小关键码值的记录(根结点)送到输出缓冲区(b)设R是输入缓冲区中的下一条记录1. 如0果R的关键码不小于刚输出的关键码值,则把R放到根结点2. 否则,使用数组中LAST位置的记录代替根结点,然后把R放到LAST位置。

设置LAST =LAST-1(c)重新排列堆,筛出根结点算法结束后,RAM中也填满了不能处理的数据,直接建成堆,留待下一顺串来处理大小是M的堆,最小顺串的长度为M的记录至少原来堆中的那些记录将成为顺串的一部分最好情况下,如输入已经被排序,有可能一次就把整个文件生成为一个顺串平均长度2M文件保存,读取函数#define MAXKEY INT_MAX#define RUNEND_SYMBOL INT_MAX#define w 6#define M 10#define N 24typedef int KeyType; // 定义关键字类型为整型typedef int InfoType; // 定义其它数据项的类型// 记录类型typedef struct{KeyType key;InfoType otherinfo;}RedType;typedef int LoserTree[w];typedef struct{RedType rec;KeyType key;int rnum;}RedNode, WorkArea[w];主函数int main(){RedType a[N]={{51, 1},{49, 2},{39, 3},{46, 4},{38, 5},{29, 6},{14, 7},{61, 8},{15, 9},{30,10},{ 1,11},{48,12},{52,13},{ 3,14},{63,15},{27,16},{ 4,17},{13,18},{89,19},{24,20},{46,21},{58,22},{33,23},{76,24} };RedType b; // 中介FILE *fi, //输入文件*fo; //输出文件LoserTree ls; // 败者树WorkArea wa; // 内存工作区int i, k, j = RUNEND_SYMBOL;char s[3],fname[4];fo = fopen("ori","wb");fwrite(a, sizeof(RedType), N, fo);fclose(fo);fi = fopen("ori","rb");printf("大文件的记录为:\n");for(i = 1; i <= N; i++){fread(&b,sizeof(RedType),1,fi);print(b);if(i % M == 0)printf("\n");}printf("\n\n");rewind(fi);fo = fopen("out","wb");// 用置换-选择排序求初始归并段Replace_Selection(ls, wa, fi, fo);fclose(fo);fclose(fi);fi = fopen("out","rb");printf("初始归并段文件的记录为:\n");i = 1;do{k = fread(&b, sizeof(RedType), 1, fi);if(k == 1){print(b);if(b.key == j)printf("\n\n");}}while(k == 1);printf("\n");rewind(fi);k = 0;while(!feof(fi)){itoa(k,s,10);strcpy(fname,"f");strcat(fname,s);fo = fopen(fname,"wb");do{i = fread(&b,sizeof(RedType),1,fi);if(i == 1){fwrite(&b,sizeof(RedType),1,fo);if(b.key == j) // 1个归并段结束{k++;fclose(fo);break;}}}while(i==1);};fclose(fi);printf("共产生%d个初始归并段文件\n", k);system("pause");return 0;}5 程序编码#include <stdio.h>#include <malloc.h>#include <limits.h>#include <stdlib.h>#include <string.h>#define MAXKEY INT_MAX#define RUNEND_SYMBOL INT_MAX #define w 6#define M 10#define N 24typedef int KeyType;typedef int InfoType;typedef struct{KeyType key;InfoType otherinfo;}RedType;typedef int LoserTree[w];typedef struct{RedType rec;KeyType key;int rnum;}RedNode, WorkArea[w];void Select_MiniMax(LoserTree ls,WorkArea wa,int q){int p, s, t;t = (w+q)/2;p = ls[t];for(; t > 0;){if(wa[p].rnum < wa[q].rnum || wa[p].rnum == wa[q].rnum && wa[p].key < wa[q].key){s=q;q=ls[t];ls[t]=s;}t = t/2;p = ls[t];}ls[0] = q;}void Construct_Loser(LoserTree ls, WorkArea wa, FILE *fi){int i;for(i = 0; i < w; ++i)wa[i].rnum = wa[i].key = ls[i] = 0;for(i = w - 1; i >= 0; --i){fread(&wa[i].rec, sizeof(RedType), 1, fi);wa[i].key = wa[i].rec.key; // 提取关键字wa[i].rnum = 1; // 其段号为"1"Select_MiniMax(ls,wa,i); // 调整败者树}}void get_run(LoserTree ls,WorkArea wa,int rc,int *rmax,FILE *fi,FILE *fo){int q;KeyType minimax;while(wa[ls[0]].rnum == rc){q = ls[0];minimax = wa[q].key;fwrite(&wa[q].rec, sizeof(RedType), 1, fo);fread(&wa[q].rec,sizeof(RedType),1,fi);if(feof(fi)){wa[q].rnum = *rmax+1;wa[q].key = MAXKEY;}else{wa[q].key = wa[q].rec.key;if(wa[q].key < minimax){*rmax = rc+1;wa[q].rnum = *rmax;}elsewa[q].rnum = rc;}Select_MiniMax(ls, wa, q);}}void Replace_Selection(LoserTree ls, WorkArea wa, FILE *fi, FILE *fo){int rc, rmax;RedType j;j.key = RUNEND_SYMBOL;// 初建败者树Construct_Loser(ls, wa, fi);rc = rmax =1;while(rc <= rmax){get_run(ls, wa, rc, &rmax, fi, fo);j.otherinfo=rc;fwrite(&j,sizeof(RedType),1,fo);rc = wa[ls[0]].rnum;}}void print(RedType t){printf("(%d,%d) ",t.key,t.otherinfo);}int main(){RedType a[N]={{51, 1},{49, 2},{39, 3},{46, 4},{38, 5},{29, 6},{14, 7},{61, 8},{15, 9},{30,10},{ 1,11},{48,12},{52,13},{ 3,14},{63,15},{27,16},{ 4,17},{13,18},{89,19},{24,20},{46,21},{58,22},{33,23},{76,24} };RedType b; // 中介FILE *fi, //输入文件*fo; //输出文件LoserTree ls; // 败者树WorkArea wa; // 内存工作区int i, k, j = RUNEND_SYMBOL; char s[3],fname[4]; // 文件名fo = fopen("ori","wb");fwrite(a, sizeof(RedType), N, fo); fclose(fo);fi = fopen("ori","rb");printf("大文件的记录为:\n");for(i = 1; i <= N; i++){fread(&b,sizeof(RedType),1,fi);print(b);if(i % M == 0)printf("\n");}printf("\n\n");。

相关文档
最新文档