
C语言----数据结构与算法
文章平均质量分 83
TECH_PRO
Hello,world!
展开
-
双向链表的C语言实现与基本操作(一)
本文的主要目录:一、双向链表的基本概念二、双向链表的简单实现一、双向链表的基本概念双向链表和上一节博客中的单向链表相比,只是在结点元素中多了一个指向前一个结点元素的指针。为什么需要双向链表,因为在实际的工程项目当中,有时候为了提高单向链表访问结点元素的效率,需要在链表结点元素中增加一个指向前驱的指针,提高对链表元素结点的访问速度。一个基本的双向链表结点的C语言表示如下:原创 2017-04-18 15:46:39 · 2146 阅读 · 0 评论 -
(一)数据结构之线性表的简单实现:链表
1、线性表的定义线性表(Linear List):由同类型的数据元素构成的有序序列的线性结构:表中元素个数称为线性表的长度,线性表没有元素时,称为空表,表起始位置称表头,表结束位置称为表尾。2、链表的顺序存储的实现2.1 数据结构表示利用数组的连续存储空间顺序存放线性表的各元素。首先定义链表的基本数据结构如下所示:/* 定义List的基本结构 */ #define MAXSI原创 2017-09-17 17:42:47 · 779 阅读 · 0 评论 -
(二)数据结构之线性表的简单实现:堆栈
1、堆栈的定义具有一定操作约束的线性表,只在一端(栈顶,Top)做插入、删除操作。堆栈的基本操作主要有两类:a、插入数据:入栈(Push);b、删除数据:出栈(Pop)。2、栈的顺序存储实现2.1 栈的基本数据结构/* 定义堆栈的数据结构 */#define MaxSize 10typedef int ElementType;typedef struct _Stack{原创 2017-09-17 18:02:31 · 520 阅读 · 0 评论 -
(三)数据结构之线性表的简单实现:队列
1、队列的简单定义队列:具有一定操作约束的线性表;只能在一端插入,在另一端删除;先进先出:First In First Out(FIFO)。2、队列的顺从存储实现队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素的位置变量rear组成。为了不造成存储空间上的浪费常定义位循环队列。2.1 基本数据结构/* 定义队列的基本数据结果 *原创 2017-09-17 18:13:49 · 590 阅读 · 0 评论 -
(四)数据结构之线性表的简单应用:多项式求和
1、基本思路采用不带头结点的单向链表,按照指数递减的顺序排列各项。算法思路:a、两个指针P1和P2分别指向这两个多项式第一个结点,不断循环:i、P1->expon == P2->expon : 系数相加,如果结果不为0,则作为多项式对应项系数,同时,P1和P2都分别指向下一项。ii、P1->expon > P2->expon : 将P1的当前项存入多项式,并让P1指向下一项原创 2017-09-17 18:24:56 · 2380 阅读 · 0 评论 -
(五)数据结构之静态查找的简单实现:顺序查找和二分查找
1、查找的定义根据某个给定关键字K,从集合R中找出关键字与K相同的记录。查找分为动态查找和静态查找:动态查找,集合中内容是动态变化的;静态查找,集合中内容是固定不变的。本文主要来介绍最基本的静态查找的方法:顺序查找和二分查找。2、具体的实现2.1 基本数据结构/* 定义查找相关数据结构 */#define TABLE_LENGTH 10typedef int ElementTy原创 2017-09-17 18:36:49 · 1967 阅读 · 0 评论 -
(六)数据结构之二叉树的简单实现
1、基本数据结构/* 二叉树的基本数据结构的定义 */typedef char ElementType;typedef struct TreeNode *BinTree;typedef BinTree Position;struct TreeNode{ ElementType Data; BinTree Left; BinTree Right;};采用链式存储方式来存储二叉原创 2017-09-17 18:45:34 · 633 阅读 · 0 评论 -
(七)数据结构之搜索二叉树的简单实现
1、搜索二叉树的简单定义二叉搜索树(BST, Binary Search Tree), 也称二叉排序树或者二叉查找树。定义:a、是一颗二叉树,可以为空,也可以不为空。b、非空左子树的所有键值小于其根结点的键值c、非空右子树的所有键值大于其根结点的键值。d、左、右子树都是二叉搜索树。2、具体实现搜索二叉树是特殊的二叉树,所以这里只实现搜索二叉树特殊的操作,基本操作可以原创 2017-09-17 19:00:56 · 575 阅读 · 0 评论 -
(九)数据结构之简单排序算法实现:冒泡排序、插入排序和选择排序
1、冒泡排序/* 冒泡排序,按照由小到大顺序进行排序 */void Bubble_Sort( ElementType A[], int N ){ int P, i; int flag = 0; /* 定义一个flag来判断带排序序列是否有序或局部有序,提高算法效率 */ for ( P=N-1; P>=0; P-- ) { flag = 0; for( i=0; i<P;原创 2017-09-18 10:03:28 · 1280 阅读 · 0 评论 -
(十)数据结构之希尔排序算法实现
1、希尔排序希尔排序是对插入排序的一种改进,插入排序的实现可以参考这篇文章http://blog.youkuaiyun.com/tech_pro/article/details/78016096。希尔排序具体实现如下:/* 原始希尔排序 */void Shell_sort( ElementType A[], int N ){ int D, P, i; ElementType Tmp; fo原创 2017-09-18 10:09:36 · 824 阅读 · 0 评论 -
(十一)数据结构之归并排序算法实现
1、递归归并排序具体实现如下:/* 递归排序 */void Merge_sort_r( ElementType A[], int N ){ ElementType *TmpA; TmpA = malloc( N * sizeof( ElementType ) ); if ( TmpA != NULL ) { MSort_r( A, TmpA, 0, N-1 ); f原创 2017-09-18 10:14:23 · 760 阅读 · 0 评论 -
(十二)数据结构之快速排序算法实现
1、快速排序方法采用分而治之的方法:从待排序元素随机找到一个,以它为中间点,将所有比它大的放在一边,所有比它小的放在另一边,然后每一边在执行和上面相同的步骤。选取中间点(pivot)很关键,如果碰到和pivot相同的元素则停下来交换。如果数据规模较小:小规模数据的快速排序可能还没有简单排序快,所以可以在程序中设定一个cutoff(阈值),大于它用快速排序,小于它则用简单排序方法比如插入排序原创 2017-09-18 10:20:39 · 1034 阅读 · 0 评论 -
循环队列操作之一:循环队列的表示和实现(C语言版本)
队列(Queue)是一种操作受限的线性表,队列(Queue)只能在表的一端进行插入操作,在另一端进行删除操作。其中,允许插入的一端叫着队尾(tail),允许删除的一端叫做队头(front)。循环队列是对队列的一种改进,它比队列适用的范围更广,例如Linux内核当中的环形缓冲区就是基于循环队列来设计的。本文主要任务是通过C语言来实现一个循环队列的数据结构,以及对循环队列的基本操作。1、循原创 2017-06-12 13:23:02 · 6484 阅读 · 5 评论 -
堆栈的简单实现之二:进制转换方面的简单应用(C语言实现)
十进制数和其他进制数之间通常有很多种转换方式,本文通过对堆栈的使用来实现十进制数和其他进制数之间的转换。如下图所示是十进制转二进制:从上图可以看出十进制数150经过转化后变成二进制数10010110,对结果进行分析可以看出当商为0时,把余数按照倒序组合之后就是转换的二进制数,通过分析发现这点和堆栈的后进先出的工作方式很想。可以想象,通过对给定的十进制数进行转换,把每次的余数压到堆栈原创 2017-06-08 18:32:23 · 2810 阅读 · 0 评论 -
双向链表的C语言实现与基本操作(二)
本文的主要内容目录:一、链表结点元素的添加二、链表结点元素的删除三、链表结点元素的更改四、链表结点元素的查询在上一篇博文中已经对双向链表的实现做了比较详细地阐述,在一篇文章来说一说双向链表的四个基本操作:增、删、改、查。在讲基本操作之前,再来看看链表结点元素的结构体的实现,它是整个数据结构的核心。/* 定义一个表示链表的结构体指针 */struct list {原创 2017-04-19 08:11:20 · 851 阅读 · 0 评论 -
Linux内核中的container_of浅析
本文的主要内容:一、container_of的作用二、container_of的定义三、container_of的简单实现一、container_of的作用一般的我们通过结构体变量的地址可以找到其成员的地址,但是反过来一般是行不通的。在linux内核中就有这样的一个宏:container_of,它可以实现根据结构体成员的地址,找到这个结构体变量的地址,从而对结构体中的其原创 2017-04-19 09:07:38 · 800 阅读 · 0 评论 -
Linux内核中list_head浅析
本文的内容目录:一、list_head的作用二、list_head的定义三、list_head的简单实现一、list_head的作用链表是基本的数据结构,在项目开发过程中经常会使用到。传统的链表的C语言定义大概如下所示:/* 单向链表 */struct list{ [成员定义] struct list *next;};/* 双向链表 */str原创 2017-04-19 10:12:06 · 1173 阅读 · 0 评论 -
单向链表的C语言实现与基本操作
本文的主要内容目录:一、单向链表的C语言实现二、单向链表的基本操作一、单向链表的C语言实现链表作为一种基本的数据结构在程序开发过程当中经常会使用到。对C语言来说链表的实现主要依靠结构体和指针,所以本文相关内容和程序需要有C语言当中指针和结构体的基础。链表是一种线性存储数据的结构,存储内容在逻辑上连续的,在物理上却不一定连续。单向链表的组成包括一个链表头(head)和若干原创 2017-04-17 05:59:16 · 51346 阅读 · 8 评论 -
二叉树的二叉链表的简单实现及操作
本文主要简单的说一说二叉树的二叉链表的简单实现及操作。简单的说一说二叉链表的结点定义,树的创建,结点的插入,子树的销毁、树的拷贝等常用操作。一、创建二叉树、拷贝二叉树本文创建的二叉树采用二叉链表的形式来创建,二叉链表定义的树的结点通常包含一个数据域,两个地址域(分别用来指向左右子树),所以在创建树之前需要定义一个表示结点的结构体,具体实现如下:/* 定义一个结构体用于表示二叉树原创 2017-06-05 21:07:11 · 5721 阅读 · 3 评论 -
排序之一:直接插入排序(C语言实现)
直接插入排序方法:仅有一个记录的表总是有序的,因此,对于有n个记录的表,可以从第二个记录开始直到第n个记录逐个有序的向有序表中进行插入操作,从而得到n个记录按关键字有序的表。实现一个直接插入排序的C语言函数,要求对要排序的元素按照逐渐递增有序。这个函数的具体实现如下:/* 直接插入排序函数的实现 * array[] : 待排序的数组 * length : 待排序的数组的大小原创 2017-06-07 07:50:31 · 1861 阅读 · 0 评论 -
排序之二:希尔排序(C语言实现)
希尔排序的基本思想是:先将整个待排序列分割成若干子序列分别进行进行直接插入排序,等到整个待排序列基本有序时,再对全体记录依次进行直接插入排序。希尔排序也叫缩小增量排序,是1959年由D.L.Shell提出来的。希尔排序的具体实现方法和步骤: a、选择一个步长序列d1,d2,d3,...,dk,其中,di > dj,dk = 1; b、按步长序列个数K对序列进原创 2017-06-07 08:05:12 · 951 阅读 · 0 评论 -
排序之三:简单选择排序(C语言实现)
简单选择排序的算法实现思想是:第一趟,从n个记录当真找出 关键字最小的记录与第一个记录交换;第二趟,从第二个记录开始的n-1个记录中找出关键字最小的记录与第二个记录交换;依次类推,直到整个序列按照关键字有序。下面实现一个简单的选择排序函数(按照逐渐递增方式进行排序):/* 选择排序算法的实现 * array[] : 待排序的数组 * length : 待排序的数组的长度 */原创 2017-06-07 08:14:06 · 9363 阅读 · 1 评论 -
排序之四:冒泡排序(C语言实现)
冒泡排序是一种简单常用的交换排序方法。集体实现的算法思路:将待排序记录中第一个记录与第二个记录做比较,如果第一个记录大于第二个记录,则交换两个记录的位置,然后继续将第一个记录与第三个记录进行比较,做同样的处理,依次类推,直到序列中最后一个记录和第一个记录进行比较,这样就把最小的值排在序列的第一个位置,接下来第二个位置的元素实现和第一个元素相同的操作把第二小的元素放在第二个位置,依次类推,完成整原创 2017-06-07 08:24:14 · 570 阅读 · 0 评论 -
排序之五:快速排序(C语言实现)
快速排序是对冒泡排序进行改进后形成的排序方法。快速排序的基本思想是:取待排序的结点序列中某个结点的值作为控制值,采用某种方式把这个控制值放到适当的位置,使得这个位置的左边的所有结点的值都小于这个控制值,而这个结点位置的右边的所有结点的值都大于这个控制值。快速排序算法的C语言函数实现如下所示:/* 快速排序算法的函数实现 * array[] : 待排序数组 * left : 数原创 2017-06-07 18:41:50 · 1010 阅读 · 0 评论 -
堆栈的简单实现之一:基本操作(C语言实现)
堆栈(Stack)是一种操作受限的线性表,堆栈的插入和删除操作只能在一端进行。堆栈遵循着先进后出或者叫后进先出的原则。在堆栈中,允许插入和删除的一端叫着栈顶(Top),另外一端叫着栈底(Bottom)。栈的基本操作包括:栈的初始化,栈的插入和删除,以及判断栈是否为空或者是否为满等。根据上面所说,来实现一个自己定义的堆栈的基本表示和实现。1、定义堆栈结构本文定义的堆栈采用链式存储原创 2017-06-08 18:07:45 · 7052 阅读 · 0 评论 -
(八)数据结构之最大堆的简单实现
1、什么是堆?堆是一种优先队列。特殊的队列,取出元素的顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。堆的两个特性:a、结构性用数组表示的完全二叉树b、有序性任一结点的关键字是其子树所有结点的最大值(或最小值)2、最大堆的实现2.1 基本数据结构/* 定义最大元素的界限 */#define MAXDATA 10000/* 创建基本的数原创 2017-09-18 09:56:24 · 851 阅读 · 0 评论