数据结构实验十三

合集下载

《数据结构》实验报告

《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。

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

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

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

数据结构实验报告

数据结构实验报告

数据结构实验报告数据结构实验报告引言:数据结构是计算机科学中的重要概念,它研究如何组织和存储数据,以便更高效地进行操作和处理。

在本次实验中,我们将探索几种常见的数据结构,并通过实际操作来加深对其原理和应用的理解。

一、线性表线性表是最简单的数据结构之一,它由一系列具有相同数据类型的元素组成,这些元素按照线性的顺序排列。

我们在实验中使用了顺序表和链表两种实现方式。

1.1 顺序表顺序表是一种基于数组的实现方式,它将元素按照顺序存储在连续的内存空间中。

我们通过实验发现,顺序表在随机访问和插入删除操作方面具有较好的性能,但当元素数量超过数组容量时,需要进行扩容操作,而且插入和删除元素时需要移动其他元素,效率较低。

1.2 链表链表是一种基于指针的实现方式,它将元素存储在不连续的内存空间中,并通过指针将这些元素连接起来。

链表在插入删除操作方面具有较好的性能,但随机访问元素时需要遍历整个链表,效率较低。

我们通过实验发现,单向链表和双向链表在不同场景下有不同的应用优势。

二、栈和队列栈和队列是两种常见的线性数据结构,它们都具有特定的操作规则。

2.1 栈栈是一种后进先出(Last In First Out,LIFO)的数据结构,类似于现实生活中的弹夹。

我们通过实验发现,栈在递归、表达式求值和括号匹配等场景下有广泛的应用。

2.2 队列队列是一种先进先出(First In First Out,FIFO)的数据结构,类似于现实生活中的排队。

我们通过实验发现,队列在模拟系统、任务调度和缓冲区管理等场景下有广泛的应用。

三、树和图树和图是两种非线性的数据结构,它们通过节点和边的连接关系来表示数据之间的关系。

3.1 树树是一种层次结构的数据结构,它由根节点和若干子树组成。

我们通过实验发现,二叉树、平衡二叉树和堆在搜索、排序和优先级队列等场景下有广泛的应用。

3.2 图图是一种由节点和边组成的数据结构,它可以表示各种复杂的关系。

我们通过实验发现,图在社交网络、路径规划和最小生成树等场景下有广泛的应用。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。

具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。

2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。

3、提高程序设计的规范性和可读性,培养良好的编程习惯。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。

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

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

实现链表的创建、插入、删除、遍历等操作。

(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。

实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。

2、队列的实现用循环队列或链式队列实现队列。

实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。

(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。

实现二叉树的创建、插入、删除节点等操作。

2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。

(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。

实现图的创建、添加边等操作。

2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。

四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。

在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。

数据结构实验报告c语言版

数据结构实验报告c语言版

数据结构实验报告c语言版数据结构实验报告(C语言版)引言:数据结构是计算机科学中的重要概念,它关注如何在计算机中存储和组织数据以便有效地访问和操作。

本实验报告将介绍在C语言中实现的一些常见数据结构及其应用。

一、线性表线性表是最基本的数据结构之一,它是一种有序的数据元素的集合。

在C语言中,可以使用数组或链表来实现线性表。

数组具有固定大小的优点,但插入和删除操作较为复杂。

链表则可以动态地分配内存,但访问元素需要遍历整个链表。

二、栈和队列栈和队列是两种特殊的线性表。

栈是一种后进先出(LIFO)的数据结构,可以使用数组或链表实现。

常见的应用包括函数调用、表达式求值等。

队列是一种先进先出(FIFO)的数据结构,同样可以使用数组或链表实现。

它常用于任务调度、消息传递等场景。

三、树树是一种非线性的数据结构,它由节点和边组成。

树的每个节点可以有零个或多个子节点,其中一个节点被称为根节点。

常见的树结构包括二叉树、二叉搜索树、平衡二叉树等。

树的应用广泛,例如文件系统、数据库索引等。

四、图图是由节点和边组成的非线性数据结构,它可以用来表示各种实体之间的关系。

图可以是有向的或无向的,可以是带权重的或无权重的。

图的常见应用包括社交网络、路由算法等。

在C语言中,图通常使用邻接矩阵或邻接表来表示。

五、排序算法排序算法是数据结构中的经典问题之一。

常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

每种排序算法都有其特点和适用场景,选择合适的排序算法可以提高程序的效率。

六、查找算法查找算法是在数据集中查找指定元素的过程。

常见的查找算法包括线性查找、二分查找、哈希查找等。

线性查找适用于无序数据集,而二分查找适用于有序数据集。

哈希查找通过散列函数将关键字映射到存储位置,可以快速定位元素。

七、实验总结通过本次实验,我们学习了C语言中常见的数据结构及其应用。

线性表、栈和队列是最基本的数据结构,树和图则提供了更灵活的数据组织方式。

数据结构 实验报告

数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

操作系统为 Windows 10。

三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。

对链表进行排序,如冒泡排序或插入排序。

2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。

利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。

3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。

进行二叉树的插入、删除节点操作。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先遍历和广度优先遍历。

四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。

数据结构的实验报告

数据结构的实验报告

一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。

二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。

2)向顺序表插入元素:在顺序表的第i个位置插入元素x。

3)从顺序表删除元素:从顺序表中删除第i个位置的元素。

4)查找顺序表中的元素:在顺序表中查找元素x。

5)顺序表的逆序操作:将顺序表中的元素逆序排列。

(2)链表1)创建链表:创建一个带头结点的循环链表。

2)在链表中插入元素:在链表的第i个位置插入元素x。

3)在链表中删除元素:从链表中删除第i个位置的元素。

4)查找链表中的元素:在链表中查找元素x。

5)链表的逆序操作:将链表中的元素逆序排列。

2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。

2)入栈操作:将元素x压入栈中。

3)出栈操作:从栈中弹出元素。

4)获取栈顶元素:获取栈顶元素。

5)判断栈是否为空:判断栈是否为空。

(2)队列1)队列的初始化:创建一个队列,初始化为空。

2)入队操作:将元素x入队。

3)出队操作:从队列中出队元素。

数据结构实验十三

数据结构实验十三

数据结构实验十三引言概述:数据结构实验十三是本学期数据结构课程的最后一个实验,旨在匡助学生巩固所学的数据结构知识,并通过实践提升编程能力。

本实验内容涵盖了树的相关操作,包括树的遍历、查找、插入和删除等。

通过完成本实验,学生将进一步加深对树这一数据结构的理解,提高对算法的运用能力。

一、树的遍历1.1 前序遍历前序遍历是指先访问根节点,然后递归地前序遍历左子树和右子树。

在实验中,学生需要编写前序遍历的算法,并正确输出遍历结果。

1.2 中序遍历中序遍历是指先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。

学生需要实现中序遍历算法,并验证其正确性。

1.3 后序遍历后序遍历是指先递归地后序遍历左子树和右子树,然后访问根节点。

学生需要编写后序遍历算法,并输出正确的遍历结果。

二、树的查找2.1 二叉搜索树查找二叉搜索树是一种特殊的二叉树,左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值。

学生需要实现二叉搜索树的查找算法,确保能够正确找到指定节点。

2.2 平衡二叉树查找平衡二叉树是一种高效的二叉搜索树,能够保持树的平衡,减少查找的时间复杂度。

学生需要编写平衡二叉树的查找算法,并验证其查找效率。

2.3 B树查找B树是一种多路搜索树,能够减少磁盘I/O操作,提高查找效率。

学生需要实现B树的查找算法,并比较其与其他树结构的查找效率。

三、树的插入3.1 二叉搜索树插入学生需要编写二叉搜索树的插入算法,确保插入后树仍然保持二叉搜索树的性质。

3.2 平衡二叉树插入平衡二叉树在插入节点后需要进行平衡操作,以保持树的平衡性。

学生需要实现平衡二叉树的插入算法,并验证其正确性。

3.3 B树插入B树的插入操作相对复杂,需要考虑节点的分裂和合并等情况。

学生需要编写B树的插入算法,并确保插入后树仍然符合B树的定义。

四、树的删除4.1 二叉搜索树删除二叉搜索树的删除操作需要考虑节点的替换和子树的重组等情况。

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

一、实验目的
1.掌握什么是哈希表和哈希函数。

2.掌握哈希表的构建和哈希查找。

二、实验环境
1.硬件:每个学生需配备计算机一台。

操作系统:DOS或Windows:
2.软件:DOS或Windows操作系统+Turbo C;
三、实验要求
1.设计一个哈希表。

哈希函数用除留余数法构造,用线性探测再散列处理冲突。

2.学生成绩报告单。

任给任一学生学号即可打印出该生的成绩报告单。

3.学生学号可以不按照顺序。

四、实验内容
1.在自己的U盘的“姓名+学号”文件夹中创建“实验13”,本次实验的所有程序和数据都要求存储到本文件夹中。

2.现在某个学院有20名同学,每个同学记录包括:班级、学号、姓名和语文、数学、外语等三门课程成绩(学号为了2位整数)。

3.以学号为主关键字,用除留余数法构造哈希函数(请先考虑除数P的选择原则是什么?),用线性探测再散列处理冲突构建哈希表。

4.输入任何一个学生学号,输出该学生的信息。

5.说明线性探测再散列处理的优缺点,用链地址法在实现。

五、代码如下
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define EQ(a,b) (a==b)
int hashsize[]={3,11,19,29,37};
//哈希表容量递增表,一个合适的素数序列,这里选择是三个元素,不做更多的纠缠int m;//m的选择必须是不大于表长的最大素数
//数据元素定义
typedef struct {
int number;
char Class[10];
char name[10];
int chinese;
int math;
int english;
}student;
//哈希表
typedef struct{
student *elem; //数据元素存储基址,动态分配数组
int count; //当前数据元素的个数
int sizeindx; //当前的容量
}hashtable;
//hash函数
unsigned Hash(int k){
return k%m; //除留余数法,除以的是一个不大于表长最大素数
}
//增量序列函数
int d(int i){
return i;//线性探测再散列
}
//冲突处理方法
void ylx_collision(int k,int *p,int i){ *p=(Hash(k)+d(i))%m;
}
//初始化函数
void ylx_InitHashTabke(hashtable * H){
int i;
H->count=0;
H->sizeindx=0;
m=hashsize[0];
H->elem=(student*)malloc(m*sizeof (student)); //分配内存
if(!H->elem)
exit(0);
for(i=0;i<m;i++)
H->elem[i].number=0;//表示还未开始添加数据
}
//查找函数
int ylx_search(hashtable h,int num,int *p,int *c){
//在开放的哈希表中查找关键字为num 的元素,假如成功,以p指示待查的数据元素
//在表中的位置,并且返回状态,否则以p指示插入的位置,c记录冲突的位置,以供插入的时候参考
*p=Hash(num);//求出哈希地址
while(h.elem[*p].number!=0&&!EQ(n um,h.elem[*p].number)){//该位置有记录,并且不等于等待查数据
(*c)++;//冲突加一
if(*c<m){
ylx_collision(num,p,*c);//求下一个探查地址
}else break;
}
if(EQ(num,h.elem[*p].number))
return 1;
else return 0;
}
//对函数需要声明,下面需要用到
void ylx_recreateHashTable(hashtable * h);
//插入函数,查找不成功,就插入元素到哈希表中,假如冲突过大,则重新建立哈希表int ylx_InsertHash(hashtable *h,student e){
int p,c=0;
if(ylx_search(*h,e.number,&p,&c)) {
return -1;
}
else
if(c<hashsize[h->sizeindx]/2){
h->elem[p]=e;
++h->count;
return 1;
}
else {//还未找到,但是冲突已经过大了
ylx_recreateHashTable(h);//重建
return 0;
} }
//重建哈希表函数
void ylx_recreateHashTable(hashtable * h){
int i,count=h->count;
student * p,*elem=(student*)malloc(count*sizeof (student));
//动态生成存放哈希表的原有数据的
存储空间
p=elem;
for(i=0;i<m;i++){
if((h->elem+i)->number!=0)
*p++=*(h->elem+i);
}
h->count=0;
h->sizeindx++;
m=hashsize[h->sizeindx];
h->elem=(student*)realloc(h->elem
,m*sizeof(student));//以新的存储容量
存储表
//还未填写记录的标志
for(i=0;i<m;i++)
h->elem[i].number=0;
//将原有的数据重新填写进去
for(p=elem;p<elem+count;p++)
ylx_InsertHash(h,*p);
free(elem);//释放空间
}
///按照哈希地址遍历哈希表
void ylx_traversehash(hashtable h){ int i;
printf("哈希地址:
0~~~~~~~%d\n",m-1);
for(i=0;i<m;i++){
if(h.elem[i].number!=0){
printf("学号:%d 班级:%s 姓名:%s 语文:%d 数学:%d 英语:%d ",h.elem[i].number,h.elem[i].Class,h. elem[i].name,h.elem[i].chinese,h.elem [i].math,h.elem[i].english);
}
}
}
void main(){
printf("开始输入数据:\n");
printf("请输入您所需要的数据的个数:\n");
int n;
scanf("%d",&n);
hashtable h;
ylx_InitHashTabke(&h);
for(int i=0;i<n;i++){
student ss;
printf("请输入插入的记录的学号,班级,姓名,语文成绩,数学成绩,和英语成绩\n");
scanf("%d%s%s%d%d%d",&ss.number,s s.Class,,&ss.chinese,&ss.math, &ss.english);
ylx_InsertHash(&h,ss);
}
ylx_traversehash(h);
}
六、运行结果截图
七、实验总结与体会
本次实验需要我们理解哈希函数和哈希表,掌握各种哈希函数和冲突解决办法,还需要我们掌握什么是哈希表和哈希函数,掌握哈希表的构建和哈希查找。

相关文档
最新文档