diff --git "a/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/main.c" "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/main.c" new file mode 100644 index 00000000..fd497bd6 --- /dev/null +++ "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/main.c" @@ -0,0 +1,318 @@ +// +// main.c +// homework7 +// +// Created by Huhongbo on 2017/5/17. +// Copyright © 2017年 Huhongbo. All rights reserved. +// + +#include +#include + +typedef enum +{ + OK, + ERROR, + OVERFLOW +}Status; + +typedef enum +{ + true, + false +}bool; + + +//图的数组存储结构 +#define MAX_VERTEX_NUM 10 +#define VRType int +#define InfoType int +#define VertexType int +#define INFINITY -1 + +typedef struct ArcCell +{ + VRType adj; + InfoType *info; +}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + +typedef struct +{ + VertexType vexs[MAX_VERTEX_NUM]; + AdjMatrix arcs; + int vexnum, arcnum; //图的顶点数和弧数; +}MGraph; + + +//队列的双链存储结构 +#define QElemType int + +typedef struct QNode +{ + QElemType data; + struct QNode *next; + struct QNode *pre; +}QNode, *QueuePtr; + +typedef struct LinkQueue +{ + QueuePtr front; + QueuePtr rear; +}LinkQueue; + +//队列的基本操作 +Status InitQueue(LinkQueue *Q); +Status EnQueue(LinkQueue*Q, QElemType e); +Status DeQueue(LinkQueue*Q, QElemType*e); +bool QueueEmpty(LinkQueue*Q); +Status DestroyQueue(LinkQueue*Q); + +//图的基本操作 +Status LocateVex(MGraph *G, int v1, int v2); +Status CreateUDN(MGraph *G); +int FirstAdjVex(MGraph *G, int u); +int NextAdjvex(MGraph *G, int u, int w); +Status BFSTraverse(MGraph*G, LinkQueue *Q, int a, int b); +Status print(LinkQueue *Q, int a); + +//队列的基本操作 +Status InitQueue(LinkQueue *Q) +{ + Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); + if (!Q->front) + { + return ERROR; + } + Q->front->next = Q->rear->next = NULL; + return OK; +} + +Status EnQueue(LinkQueue*Q, QElemType e) +{ + QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); + if (!p) + { + return ERROR; + } + else + { + p->data = e; + p->next = NULL; + p->pre = Q->front; + Q->rear->next = p; + Q->rear = p; + return OK; + } +} + +Status DeQueue(LinkQueue*Q, QElemType*e) +{ + if (Q->front == Q->rear) + { + return ERROR; + } + Q->front = Q->front->next; + *e = Q->front->data; + return OK; +} + +bool QueueEmpty(LinkQueue*Q) +{ + if (Q->front == Q->rear) + { + return true; + } + else + { + return false; + } +} + +Status DestroyQueue(LinkQueue*Q) +{ + while (Q->front) + { + Q->rear = Q->front->next; + free(Q->front); + Q->front = Q->rear; + } + return OK; +} +//图的基本操作 + +Status LocateVex(MGraph *G,int v1,int v2) +{ + int i; + int j; + int m = 0; + int n = 0; + for (i = 0; i <= G->vexnum; i++) + { + if (G->vexs[i]==v1) + { + m = i; + break; + } + } + for (j = 0; j <= G->vexnum; j++) + { + if (G->vexs[j] == v2) + { + n = j; + break; + } + } + G->arcs[i][j].adj = 1;//两点之间有连线,弧值为1; + G->arcs[j][i] = G->arcs[i][j]; + return OK; +} + +//构建图 +Status CreateUDN(MGraph *G) +{ + int i; + int j; + //根据用例直接赋值。 + G->vexnum = 9; + G->arcnum = 12; + for (i = 1; i <= G->vexnum; i++) + { + G->vexs[i] = i;//构建顶点向量; + } + for (i = 0; i <= G->vexnum; i++)//初始化邻接矩阵; + { + for (j = 0; j <= G->vexnum; j++) + { + G->arcs[i][j].adj = INFINITY; + G->arcs[i][j].info = NULL; + } + } + //构建邻接矩阵; + LocateVex(G, 1, 2); + LocateVex(G, 1, 3); + LocateVex(G, 1, 4); + LocateVex(G, 1, 7); + LocateVex(G, 2, 3); + LocateVex(G, 4, 5); + LocateVex(G, 4, 6); + LocateVex(G, 5, 6); + LocateVex(G, 6, 8); + LocateVex(G, 7, 8); + LocateVex(G, 7, 9); + LocateVex(G, 8, 9); + + return OK; +} + +//找出第一个邻接点 +int FirstAdjVex(MGraph *G, int u) +{ + int i; + for (i = 1; i <= G->vexnum; i++) + { + if (G->arcs[u][i].adj == 1) + { + return i; + } + } + return -1; +} + +//找出下一个邻接点 +int NextAdjvex(MGraph *G, int u, int w) +{ + int i; + for (i = w + 1; i <= G->vexnum; i++) + { + if (G->arcs[u][i].adj == 1) + { + return i; + } + } + return -1; +} +//广度优先遍历图,求两点a,b间的最短路径; +Status BFSTraverse(MGraph*G, LinkQueue *Q,int a,int b) +{ + + int v; + int u = 0; + int w = 0; + bool visited[MAX_VERTEX_NUM]; + for (v = 1; v <= G->vexnum; v++) + { + visited[v] = false; //标记数组,标记图中已访问的点 + } + + EnQueue(Q, a); //a先入队列; + while (QueueEmpty(Q)!= true) + { + DeQueue(Q, &u); + for (w = FirstAdjVex(G, u); w >=0; w = NextAdjvex(G, u, w)) + { + if (visited[w] == false)//判断w是否已经访问过 + { + visited[w] = true; + EnQueue(Q, w); + } + if (w == b) + { + break; + } + } + if (w == b) + { + break; + } + } + return OK; +} + +Status print(LinkQueue *Q,int a) +{ + if (Q->rear->data == a) + { + printf("%d->%d\n", a, a); + return OK; + } + + int i = 0; + int j; + int num[MAX_VERTEX_NUM] = { 0 }; + while (Q->rear->data!=a)//倒序进入数组 + { + num[i] = Q->rear->data; + Q->rear = Q->rear->pre; + i++; + } + printf("%d", a); + for (j = i - 1; j >= 0; j--) + { + printf("->%d", num[j]); + } + + + printf("\n"); + return OK; +} +int main() +{ + int i; + int j; + + MGraph Graph; + CreateUDN(&Graph); + for (i = 1; i <= Graph.vexnum; i++) + { + for (j = 1; j <= Graph.vexnum; j++) + { + LinkQueue Q; + InitQueue(&Q); + printf("%d<->%d:", i, j); + BFSTraverse(&Graph, &Q, i, j); + print(&Q, i); + DestroyQueue(&Q); + } + } + +} diff --git "a/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2761.png" "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2761.png" new file mode 100644 index 00000000..f8c669b2 Binary files /dev/null and "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2761.png" differ diff --git "a/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2762.png" "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2762.png" new file mode 100644 index 00000000..13c497c1 Binary files /dev/null and "b/2017-1/hh-bo/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232\346\210\252\345\233\2762.png" differ diff --git "a/2017-1/hh-bo/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/main.c" "b/2017-1/hh-bo/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/main.c" new file mode 100644 index 00000000..cb1d8891 --- /dev/null +++ "b/2017-1/hh-bo/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/main.c" @@ -0,0 +1,250 @@ +// +// main.c +// hw9 +// +// Created by Huhongbo on 2017/6/7. +// Copyright © 2017年 Huhongbo. All rights reserved. +// + +#include +#include +#include + +#define Max 25 + +//打印数组 +void display(int *p, int n, int s1, int s2) +{ + int i; + if (s1 != 0 && s2 != 0) + { + printf("\n总比较次数: %d\n", s1); + printf("\n总移动记录次数: %d\n", s2); + printf("\n二者次数之和: %d\n", s1 + s2); + printf("\n排序结果: \n\n"); + } + for (i = 0; i < n; i++) + { + printf("%d ", p[i]); + } + printf("\n"); +} +//生成随机数组 +int Create(int *p) +{ + int i,n,t; + do + { + t= rand() % 20 + 1; + } + while (t <= 0); + n = t; + for (i = 0; i < n; i++) + { + do + { + t = rand() % 100 + 1; + } + while (t <= 0); + p[i] = t; + } + return n; +} +//交换函数 +void swap(int a,int b) +{ + int t; + t=a; + a=b; + b=t; +} +//起泡排序 +void BubbleSort(int *p, int n) +{ + int i,j; + int s1=0,s2=0; + + for (i = 0; i < n; i++) + { + for (j = 0; j < n - 1&&(++s1); j++) + if (p[j] < p[j + 1]) + { + swap(p[i],p[i+1]); + s2+=3; + } + } + printf("\n"); + printf("起泡排序\n"); + display(p, n, s1, s2); + printf("\n"); +} +//直接插入排序 +void insertSort(int *p, int n) +{ + int i,j,t; + int s1 = 0;//总比较次数 + int s2 = 0;//总移动次数 + for (i = 1; i < n; i++) + { + + if ( p[i] > p[i - 1]&&(++s1) ) + { + t= p[i]; + for (j = i - 1; (s1++), j >= 0; j--) + { + p[j + 1] = p[j]; + s2++; + } + p[j + 1] = t; + } + } + printf("\n"); + printf("直接插入排序\n"); + display(p, n, s1, s2); + printf("\n"); +} +//希尔排序 +void ShellSort(int *p, int n) +{ + int i; + int s1 = 0; + int s2 = 0; + i = (n - 1) / 2; + for (i = n / 2; i > 0; i = i / 2) + { + int x, y,t; + for (x = i; x < n; x++) + { + if ((++(s1)) && p[x] >p[x - i]) + { + t = p[x]; + (s1)++; + for (y = x - i; (++(s1)) && t> p[y] && y >= 0; y -= i) + { + p[y + i] = p[y]; + (s2)++; + } + p[y + i] = t; + } + } + + } + printf("\n"); + printf("希尔排序\n"); + display(p, n, s1, s2); + printf("\n"); +} + +//快速排序--划分算法 +int Partition(int *q, int n, int low, int high, int *s1, int *s2) +{ + int m; + m = q[low]; + while (low < high) + { + while (low < high&&q[high] <= m&&++(*s1) ) + { + --high; + (*s2)++; + } + q[low] = q[high]; + while ( low < high && q[low] >= m&&++(*s1)) + { + ++low; + (*s2)++; + } + q[high] = q[low]; + } + q[low] = m; + return low; +} +//快速排序--递归 +void QSort(int *q, int n, int low, int high, int *s1, int *s2) +{ + int p; + if (low < high) + { + p = Partition(q, n, low, high, s1, s2); + QSort(q, n, low, p - 1, s1, s2);//对左区间进行递归 + QSort(q, n, p + 1, high, s1, s2);//对右区间进行递归 + } +} +//快速排序 +void QuickSort(int *q, int n) +{ + int sum1 = 0; + int sum2 = 0; + QSort(q, n, 0, n - 1, &sum1, &sum2); + printf("\n"); + printf("快速排序\n"); + display(q, n, sum1, sum2); + printf("\n"); +} + +//简单选择排序 +void SelectSort(int *p, int n) +{ + int i, j; + int s1 = 0; + int s2 = 0; + for (i = 0; i < n; i++) + { + for (j = i + 1; j < n; j++) + { + if ( p[i] < p[j]&&(++s1)) + { + swap(p[i],p[j]); + s2+=3; + } + } + } + printf("\n"); + printf("简单选择排序\n"); + display(p, n, s1, s2); + printf("\n"); +} +int main() +{ + int i; + srand(time(0)); + int list[Max]; + int copylist[Max]; + int length = Create(list);//制造需要打印的数组 + printf("打印初始数组\n\n"); + display(list, length, 0, 0); + printf("\n"); + for(i=0;i +#include + +//树的结构定义 +typedef struct treeNode +{ + int data; + struct treeNode *left; + struct treeNode *right; + +}treeNode; + +//最小元素查找 +treeNode* FindMin(treeNode *node) +{ + if (node == NULL) + { + return NULL; + } + if (node->left) + return FindMin(node->left); + else + return node; +} + +//最大元素查找 +treeNode* FindMax(treeNode *node) +{ + if (node == NULL) + { + return NULL; + } + if (node->right) + return FindMax(node->right); + else + return node; +} + +//插入数据 +treeNode * Insert(treeNode *node, int data) +{ + if (node == NULL) + { + treeNode *temp; + temp = (treeNode *)malloc(sizeof(treeNode)); + temp->data = data; + temp->left = temp->right = NULL; + return temp; + } + if (data >(node->data)) + { + node->right = Insert(node->right, data); + } + else if (data < (node->data)) + { + node->left = Insert(node->left, data); + } + return node; +} + +//删除数据 +treeNode * Delete(treeNode *node, int data) +{ + treeNode *temp; + if (node == NULL) + { + printf("Element Not Found"); + } + else if (data < node->data) + { + node->left = Delete(node->left, data); + } + else if (data > node->data) + { + node->right = Delete(node->right, data); + } + else + { + if (node->right && node->left) + { + temp = FindMin(node->right); + node->data = temp->data; + node->right = Delete(node->right, temp->data); + } + else + { + temp = node; + if (node->left == NULL) + node = node->right; + else if (node->right == NULL) + node = node->left; + free(temp); + } + } + return node; + +} + +//查找数据 +treeNode * Find(treeNode *node, int data) +{ + if (node == NULL) + { + return NULL; + } + if (data > node->data) + { + return Find(node->right, data); + } + else if (data < node->data) + { + return Find(node->left, data); + } + else + { + return node; + } + +} + + + +//先序遍历 +void PrintPreorder(treeNode *node) +{ + if (node == NULL) + { + return; + } + printf("%d ,", node->data); + PrintPreorder(node->left); + PrintPreorder(node->right); +} + +//建立二叉树 +treeNode* createTree(treeNode *node, int *a,int n) +{ + for (int i = 0; i < n;i++) + node=Insert(node, a[i]); + return node; +} + +int main() +{ + //建立二叉树并插入测试数据 + treeNode *root = NULL; + int s[] = { 8,10,14,3,1,6,4,7,5,19,22,30 }; + int n = 12; + root=createTree(root, &s,n); + PrintPreorder(root); + printf("\n"); + //待查找关键字 + int a[] = { 13,8,5,20,6 }; + treeNode * temp; + for (int i = 0; i < 5; i++) + { + temp = Find(root, a[i]); + printf("查找节点:"); + printf("%d\n", a[i]); + if (temp == NULL) + { + printf("该元素不存在,插入该节点,重新打印树\n"); + Insert(root, a[i]); + PrintPreorder(root); + printf("\n"); + } + else + { + printf("该元素存在,删除该节点,重新打印树\n"); + Delete(root, a[i]); + PrintPreorder(root); + printf("\n"); + } + } + +} diff --git "a/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/BSTOutput.txt" "b/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/BSTOutput.txt" new file mode 100755 index 00000000..356f58e1 --- /dev/null +++ "b/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/BSTOutput.txt" @@ -0,0 +1,18 @@ +建立二叉树: +8 3 1 6 4 5 7 10 14 19 22 30 +查找节点:13 +该元素不存在,插入该节点,重新打印树 +8 3 1 6 4 5 7 10 14 13 19 22 30 +查找节点:8 +该元素存在,删除该节点,重新打印树 +10 3 1 6 4 5 7 14 13 19 22 30 +查找节点:5 +该元素存在,删除该节点,重新打印树 +10 3 1 6 4 7 14 13 19 22 30 +查找节点:20 +该元素不存在,插入该节点,重新打印树 +10 3 1 6 4 7 14 13 19 22 20 30 +查找节点:6 +该元素存在,删除该节点,重新打印树 +10 3 1 7 4 14 13 19 22 20 30 +Program ended with exit code: 0 \ No newline at end of file diff --git "a/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/main.c" "b/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/main.c" new file mode 100644 index 00000000..f6f5a9e1 --- /dev/null +++ "b/2017-1/hh-bo/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232/main.c" @@ -0,0 +1,185 @@ +// +// main.c +// homework8 +// +// Created by Huhongbo on 2017/5/21. +// Copyright © 2017年 Huhongbo. All rights reserved. +// +#include +#include + +//树的结构定义 +typedef struct treeNode +{ + int data; + struct treeNode *left; + struct treeNode *right; + +}treeNode; + +//最小元素查找 +treeNode* FindMin(treeNode *node) +{ + if (node == NULL) + { + return NULL; + } + if (node->left) + return FindMin(node->left); + else + return node; +} + +//最大元素查找 +treeNode* FindMax(treeNode *node) +{ + if (node == NULL) + { + return NULL; + } + if (node->right) + return FindMax(node->right); + else + return node; +} + +//插入数据 +treeNode * Insert(treeNode *node, int data) +{ + if (node == NULL) + { + treeNode *temp; + temp = (treeNode *)malloc(sizeof(treeNode)); + temp->data = data; + temp->left = temp->right = NULL; + return temp; + } + if (data >(node->data)) + { + node->right = Insert(node->right, data); + } + else if (data < (node->data)) + { + node->left = Insert(node->left, data); + } + return node; +} + +//删除数据 +treeNode * Delete(treeNode *node, int data) +{ + treeNode *temp; + if (node == NULL) + { + printf("Element Not Found"); + } + else if (data < node->data) + { + node->left = Delete(node->left, data); + } + else if (data > node->data) + { + node->right = Delete(node->right, data); + } + else + { + if (node->right && node->left) + { + temp = FindMin(node->right); + node->data = temp->data; + node->right = Delete(node->right, temp->data); + } + else + { + temp = node; + if (node->left == NULL) + node = node->right; + else if (node->right == NULL) + node = node->left; + free(temp); + } + } + return node; + +} + +//查找数据 +treeNode * Find(treeNode *node, int data) +{ + if (node == NULL) + { + return NULL; + } + if (data > node->data) + { + return Find(node->right, data); + } + else if (data < node->data) + { + return Find(node->left, data); + } + else + { + return node; + } + +} + + + +//先序遍历 +void PrintPreorder(treeNode *node) +{ + if (node == NULL) + { + return; + } + printf("%d ", node->data); + PrintPreorder(node->left); + PrintPreorder(node->right); +} + + +int main() +{ + treeNode *root = NULL; + root = Insert(root, 8); + root = Insert(root, 10); + root = Insert(root, 14); + root = Insert(root, 3); + root = Insert(root, 1); + root = Insert(root, 6); + root = Insert(root, 4); + root = Insert(root, 7); + root = Insert(root, 5); + root = Insert(root, 19); + root = Insert(root, 22); + root = Insert(root, 30); + printf("建立二叉树:\n"); + PrintPreorder(root); + printf("\n"); + //待查找关键字 + int a[] = { 13,8,5,20,6 }; + treeNode * temp; + for (int i = 0; i < 5; i++) + { + temp = Find(root, a[i]); + printf("查找节点:"); + printf("%d\n", a[i]); + if (temp == NULL) + { + printf("该元素不存在,插入该节点,重新打印树\n"); + Insert(root, a[i]); + PrintPreorder(root); + printf("\n"); + } + else + { + printf("该元素存在,删除该节点,重新打印树\n"); + Delete(root, a[i]); + PrintPreorder(root); + printf("\n"); + } + } + +} diff --git "a/2017-1/hh-bo/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/main.c" "b/2017-1/hh-bo/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/main.c" new file mode 100644 index 00000000..dd2ef3d9 --- /dev/null +++ "b/2017-1/hh-bo/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/main.c" @@ -0,0 +1,243 @@ +// +// main.c +// hw10 +// +// Created by Huhongbo on 2017/6/14. +// Copyright © 2017年 Huhongbo. All rights reserved. +// + +#include +#include +#include +typedef int Status; +typedef int KeyType; +typedef int ValueType; +typedef struct _ElemType { + KeyType key; // 关键字 + ValueType val; // 值 +#ifdef CHAINED_HASH + struct _ElemType *next; +#endif +} ElemType; +typedef struct +{ + ElemType *elem; + int count;//当前元素个数 + int sizeindex;//哈希表表长 +}HashTable; + +static int m; +static int hashsize[] = { 11,19,29,37,49 }; +int hashsize_count = 0; +int hash_(KeyType e, int l); +Status RecreateHashTable(HashTable *H); +Status InsertHash(HashTable *H, KeyType e, ValueType v); +Status SearchHash(HashTable H, KeyType e, ValueType v, int* p, int *c); +Status InitHashTable(HashTable *H); +void travel_(int *q, int l); +void TraverHash(HashTable H); +void collision(int *p, int c, KeyType k, int l); + +//制造数组 +Status make(int *q,int l) +{ + int temp; + int length; + int i; + length = l; + for (i = 0; i elem = (ElemType*)malloc(m * sizeof(ElemType)); + if (!(*H).elem) + exit(0);//return 0; // 存储分配失败 + for (i = 0; i < (*H).sizeindex; i++) + { + (*H).elem[i].key =-1; // 未填记录的标志 + (*H).elem[i].val = 0; + } + hashsize_count++; + return 1; +} +//进行插入操作 +Status InsertHash(HashTable *h, KeyType e, ValueType v) +{ + int c = 0;//用于计数冲突次数 + int p;//用于返回插入的位置 + if (SearchHash(*h, e, v, &p, &c)) + { + return -1;//如果已有该元素 返回 + } + else if (c < h->sizeindex / 2)//冲突次数达到则进行扩表 c的值可调 + { + (*h).elem[p].val = v; + (*h).elem[p].key = e; + ++(*h).count; + return 1;//插入成功 + } + else + {//如果哈希表过于小 + printf("哈希表分配过小 重建表\n"); + RecreateHashTable(h); + return 0; + } +} +Status SearchHash(HashTable h, KeyType e, ValueType v, int* p, int *c) +{//如果查找成功 p为所在的下标 否则p为待插入的位置 + *p = hash_(e, h.sizeindex);//返回下标 + while (h.elem[*p].key != -1 && v != h.elem[*p].val) + { + (*c)++; + if ((*c) < h.sizeindex) + {//如果冲突次数还能继续处理 + collision(p, *c,e,h.sizeindex); + } + else + { + break; + } + } + if (v == h.elem[*p].val) + return 1; + else + return 0; +} +int hash_(KeyType e,int l) +{//除留余数法构造简单的哈希表 + int i = e%l; + return i; +} +void collision(int *p,int c, KeyType k,int l) +{ + *p = (k + c) % l;//线性探索再散列:di = 1,2,3,...,m-1 +} +//打印哈希表 +void TraverHash(HashTable h) +{ + for (int i = 0; i < h.sizeindex; i++) + { + printf("{[%d] : ",i); + printf("%d->%d} ",h.elem[i].key, h.elem[i].val); + } + printf("\n"); +} +//重建哈希表 +Status RecreateHashTable(HashTable *H) +{ + int i, count = (*H).sizeindex;//H中原有记录个数 + ElemType *p, *elem = (ElemType *)malloc(count * sizeof(ElemType));//动态生成存放哈希表H原有数据的空间 + p = elem; + for (i = 0; i < (*H).sizeindex; ++i) + {//将原有的所有记录,保存到elem中 + //*p++ = (*H).elem[i];//将记录依次存入elem + p[i].key = (*H).elem[i].key; + p[i].val = (*H).elem[i].val; + } + (*H).count = 0;//将原有记录数置为0,为下面调用InserHash做准备 + (*H).sizeindex = hashsize[hashsize_count]; + (*H).elem = (ElemType *)realloc((*H).elem, (*H).sizeindex * sizeof(ElemType));//以新的存储容量重新生成空哈希表H + for (i = 0; i <(*H).sizeindex; ++i) + {//初始化新的哈希表 + (*H).elem[i].key = -1;//未填记录 + (*H).elem[i].val = 0; + } + for (i=0;i87} {[1] : 37->63} {[2] : 76->4} {[3] : 41->15} {[4] : -1->0} {[5] : 43->35} {[6] : -1->0} {[7] : -1->0} {[8] : -1->0} {[9] : -1->0} {[10] : -1->0} {[11] : -1->0} {[12] : -1->0} {[13] : 32->51} {[14] : -1->0} {[15] : 72->100} {[16] : -1->0} {[17] : 55->3} {[18] : 36->91} +查找 17 关键字31 查找失败 +查找 9 关键字79 发生冲突的关键字是 79 发生冲突的次数是1 查找失败 +查找 59 关键字44 查找失败 +查找 87 关键字57 查找成功,位于0 +查找 63 关键字37 发生冲突的关键字是 37 发生冲突的次数是2 查找成功,位于1 +查找 15 关键字41 查找成功,位于3 +重建哈希表 +{[0] : -1->0} {[1] : -1->0} {[2] : -1->0} {[3] : 32->51} {[4] : -1->0} {[5] : -1->0} {[6] : -1->0} {[7] : 36->91} {[8] : 37->63} {[9] : -1->0} {[10] : -1->0} {[11] : -1->0} {[12] : 41->15} {[13] : -1->0} {[14] : 43->35} {[15] : 72->100} {[16] : -1->0} {[17] : -1->0} {[18] : 76->4} {[19] : -1->0} {[20] : -1->0} {[21] : -1->0} {[22] : -1->0} {[23] : -1->0} {[24] : -1->0} {[25] : -1->0} {[26] : 55->3} {[27] : -1->0} {[28] : 57->87} +Program ended with exit code: 0 \ No newline at end of file