
C语言数据结构
shun_smile
爱运动,爱爬山,爱旅游,爱打羽毛球,梦想是成为一名高级软件工程师。
展开
-
解决哈希冲突的方法
转载自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html1. 开放定址法(再散列法)1.1 线性探测再散列1.2 二次探测再散列1.3 伪随机探测再散列2.再哈希法3.链地址法4.建立公共溢出区5.优缺点比较5.1开放散列(open hashing)/ 拉链法(针对桶链结构)5.2封闭散列(closed hashing)/ 开放定址法通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个转载 2020-05-30 15:59:13 · 770 阅读 · 0 评论 -
归并排序
#include<stdio.h>//归并:把集合拆分成n个有序子集,再合并n有序子集//稳定排序,时间复杂度:(n*log2 n)void merger_sort(int * ptr_array1,int length1,int * ptr_array2,int length2){ int ptr_array[length1+length2]; int ...原创 2018-05-06 10:50:32 · 119 阅读 · 0 评论 -
希尔排序
随便找了一张百度百科的希尔排序的词条图片: 该图片很好的说明了希尔排序的排序原理过程,根据该原理可以写出以下代码:#include<stdio.h>void sort(int * array,int length){ int i; int j; int k; for(i=length/2;i>0;i=i/2) { ...原创 2018-05-06 11:14:30 · 138 阅读 · 0 评论 -
堆排排序
堆排序的时间复杂度为O(nlogn) 构建堆的过程的时间复杂度为n,调堆的时间复杂度为logn#include<stdio.h>//大堆:根节点大于左右节点void Swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp;}//调整最大堆 我的大堆下标是从0开始void adjust_max_heap(...原创 2018-05-06 11:53:47 · 173 阅读 · 0 评论 -
非递归实现树的前序遍历和中序遍历
//这就要用栈来实现 #include <stdio.h>#include <stdlib.h>#include <assert.h>#define MAX_SIZE 100 //栈的最大容量/*访问二叉树三种方式:1.前序遍历:根 左 右2.中序遍历:左 根 右3.后续遍历:左 右 根*///定义树的节点typedef str...原创 2018-05-06 15:56:37 · 237 阅读 · 0 评论 -
有向图邻接矩阵
图:是一种线性结构,由n个点和m条边组成,任意两个点之间可以用连线连接.#include <stdio.h>#include <stdlib.h>#define MAX_VALUE 8888 //初始化数组的默认值,相当于无限大#define MAX_POINT_NUM 10 //最大顶点数typedef int matrix[MAX_POINT...原创 2018-05-06 18:39:04 · 40958 阅读 · 3 评论 -
无向图邻接表
#include <stdio.h>#include <stdlib.h>#define MAX_POINT_NUM 10 //最大顶点数/*图存储方法:1.邻接矩阵(有向图)2.邻接表3.多重邻接表3.十字交叉链表(有向图)*///下面是无向图邻接表的实现的方法//邻接节点类型typedef struct arcnode{ i...原创 2018-05-06 19:52:43 · 14667 阅读 · 0 评论 -
树的深度和广度遍历
#include <stdio.h>#include <stdlib.h>#include <assert.h>#define MAX_SIZE 100 //队列的最大容量/*树:树是一种自定义结构.由n(n>0)个节点组成,有且只有一个节点作为树根.n-1个节点组成一个子树.树是一种递归定义.节点为0的树称为空树树节点由存储数据和指向其...原创 2018-05-06 20:18:49 · 5365 阅读 · 0 评论 -
哈希表(解决循环冲突链表问题)
哈希表 哈希表是基于数组的顺序结构,每一个存储目标都会存在一个key值,哈希表也称为散列表。为解决冲突问题(多个目标用hash函数计算出相同的位置),本代码用了拉链法,另外本代码还解决了字符串插入哈希表循环冲突拉链的问题。#include <stdio.h>#include <stdlib.h>#include <string.h>#de...原创 2018-05-06 21:06:46 · 2286 阅读 · 1 评论 -
系统大小端模式的判定及转换
系统的存储模式有两种:大端模式,和小端模式 大端模式:(Big_endian):字数据的高字节存储在低地址,低字节存储在高地址 小端模式:(Little_endian):字数据高字节存储在高地址,低字节存储在低地址举例子说明一下: 如果a=0x12345678,大端模式输出a 为0x78564321 小端模式输出 0x12345678#include &lt;stdio.h&...原创 2018-05-06 21:57:34 · 499 阅读 · 0 评论 -
C语言整数相加溢出判断的三种方法
C语言有两类整数算术运算,有符号运算与无符号运算,在计算两数的加减乘除运算,往往要考虑溢出的情况例:检查两个非负整型变量a+b是否溢出第一种:if(a+b < 0)complain();这种做法是检查内部寄存器的标志位是否为负第二种: if((unsigned)a +(unsigned)b >INT_MAX)complain();这种做法是强制将a和b都强制转换成无符号整数INT_MA...原创 2018-04-22 20:07:59 · 10279 阅读 · 0 评论 -
快排排序
/*快排(折半排序):从左右两边交叉获取待排序数据,与一个数比较,大放在该数右边,小的放在该数左边.重复按照上述方法进行. 时间复杂度:O(n*log2 n) */#include<stdio.h>#include<string.h>int quick_sort_index(int * array,int left,int right){ int t...原创 2018-05-05 10:26:29 · 240 阅读 · 0 评论 -
位排序
//位排序:在计数 排序基础上,把字节数组折算成位数组,依然用用数组下标作为待排序数处理.根据位操作将位数组元素值1.减少计数排序空间浪费void sort(int *array,int length){ int i; int max=array[0]; for(i=0;i<length;i++) { if(max<array...原创 2018-05-05 10:17:38 · 567 阅读 · 0 评论 -
查找树(平衡二叉树)
查找树:根据树节点存储值排序,成为有序树.根据目标值与根节点比较.如果小于根节点,则比较右子树,如果大于根节点,则比较左子树.等根节点查找成功。构建二叉树时,防止出现特殊只有左 或右孩子二叉树,构建(AVL)平衡二叉树有序树必须满足下面两个条件:1.左节点值小于根节点值2.右节点值大于根节点值3.根据中序遍历 输出一个有序集合#include <stdio.h>#include &l...原创 2018-04-22 22:07:06 · 213 阅读 · 0 评论 -
哈夫曼树
#include <stdio.h>#include <stdlib.h>/*哈夫曼树:是一个有序查找树.符号左节点<=根节点 右节点<=根节点.与查找树区别主要是所有目标数节点作为树终端节点哈夫曼树创建之后,可以给每个终端节点产生一个唯一二进制编码(0,1)如: 终端节点存储值100,如果产生haffman树 生成一个编码值(0011).一般用ha...原创 2018-05-03 23:04:34 · 414 阅读 · 0 评论 -
单链表
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>/*链表:是顺序结构,由多个非连续节点组成.通过节点中指针连接相邻的节点节点:组成链表元素,是一个结构体,由数据域和指针域组成如果节点存储一个指针称为单链表如果节点存储两个指针称...原创 2018-05-03 23:26:14 · 173 阅读 · 0 评论 -
链表栈
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define MAX_SIZE 100/*栈:一种符合栈操作特点结构栈操作特点:先进后出(FILO)栈分为:1.顺序栈(按照栈操作规则操作一个数组)2.链表栈(按照栈操作规...原创 2018-05-03 23:37:54 · 140 阅读 · 0 评论 -
链表队列
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define MAX_SIZE 100/*队列:符合先进先出结构.队列特点:先进先出(FIFO)队列分为:1.顺序队列(按照队列特点操作一个数组)2.链表队列(按照队列特点...原创 2018-05-03 23:44:37 · 150 阅读 · 0 评论 -
树
#include <stdio.h>#include <stdlib.h>/*树:树是一种自定义结构.由n(n>0)个节点组成,有且只有一个节点作为树根.n-1个节点组成一个子树.树是一种递归定义.节点为0的树称为空树树节点由存储数据和指向其子树指针(n>=1)树最大特点控制目标数比较次数,可以实现在O(logn a ,n>=1).提高搜索效率...原创 2018-05-04 11:08:24 · 251 阅读 · 0 评论 -
内存泄露账本(内存泄漏信息检测与输出并处理)
/* 系统给定mallo free 函数只负责内存分配与释放,并没有记录分配信息.通过自定义实现增加记账的作用,记账信息体是一个结构体。根据账本信息列出内存泄漏的内存的起始地址,占用字节大小,并处理那块内存。 */#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include &lt;stdlib.h&gt;#define N...原创 2018-05-06 16:15:37 · 220 阅读 · 0 评论 -
数据结构--排序算法
算法=数据+逻辑.一个算法的好坏关键在逻辑严谨性效率高。计算如何评估算法好坏? 1.理论性评估:拟出算法随着操作数递增,评估效率一个走向 2.实际运算时间:根据设备运行所消耗具体时间值(与设备有关)理论性评估一般是从: 1.时间:执行每条指令时间函数总和,函数成时间复杂度,一般用O(n) 2.空间(内存消耗):代码 数据 动态数据 内存消耗 程序中语句执行时间函数组成: 1....原创 2018-05-05 10:07:35 · 109 阅读 · 0 评论 -
冒泡排序
//前一个与后一个比较,大的交换,继续与后一个比较,每比较一轮最大的数在最后 //时间复杂度 平均:O(n^2)void sort1(int * array,int length){ int i,j; for(i=0;i<length;i++)//控制排序轮数 { for(j=0;j<length-i-1;j++)//控制每轮比较次数 ...原创 2018-05-05 10:09:26 · 122 阅读 · 0 评论 -
交换排序
//交换:第一个数与后面数一一比较,有大小交换,继续用第一个数与后面数比较.一轮之后第一个数最小 //时间复杂度 平均:O(n^2)void sort(int *array,int length){ int i,j; for(i=0;i<length;i++) { for(j=i+1;j<length;j++) ...原创 2018-05-05 10:10:32 · 124 阅读 · 0 评论 -
选择排序
//选择:每一轮从数中选择一个最小的值与待排序数组中的第一个数换 //时间复杂度 平均O(n^2) void sort(int *array,int length){ int i,j; int min_pos; for(i=0;i<length;i++) { int min=array[i]; min_pos=i...原创 2018-05-05 10:13:08 · 135 阅读 · 0 评论 -
插入排序
//插入:每一轮将一个数插入到前面有序数中 //时间复杂度 平均O(n^2)void sort(int *array,int length){ int i,j; for(i=1;i<length;i++) { int tmp=array[i]; j=i-1; while(j>=0 && t...原创 2018-05-05 10:14:47 · 106 阅读 · 0 评论