随笔分类 - 数据结构
摘要:十进制转换成二进制的时候,如果不用计算器是一件很麻烦的事情,需要不断地除以二然后在计算结果,这是一件很浪费时间的算法,现在我就告诉你们一种最简洁的算法;例1:把十进制133转换成二进制;先计算133由多少个2,4,8,16,32,64····相加所得,133=128+4+1 然后开始进行巧妙地运算,
阅读全文
摘要:net小伙曾在文章【数据结构】双向链表的创建和读取和【数据结构】链式线性表的几种常用用法中写过关于线性表的操作方法,重新阅读发现代码很是稚嫩,现重新整理。 一般情况下我们会使用一个结构体head来作为双向链表的头部,head有两个指针域,一个指向链表的开始,一个指向链表的末尾。双向链表的指针域也有两
阅读全文
摘要:快速排序思想: 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。——百度百科; 通俗一点就是: ①:如果数据是链式的,就声明两个指针low high分别指向链表的首尾,如果数据是数组形式,就声明两个值low high分别表示数组的首尾下标。 ②:若low所指向的值小于等于high指向的值,则high做自减,如...
阅读全文
摘要:插入排序: 1 #include 2 #include 3 #include 4 5 int arry[7] = {49,38,65,97,76,13,27}; 6 7 void show_arry() 8 { 9 int i;10 for(i = 0; i 0 && tmp < arry[j - 1]){23 arry[j] = arry[j - 1];24 arry[j - 1] = tmp;25 j--; 26 }27 } 28 }29 30 void te...
阅读全文
摘要:排序二叉树即在构建二叉树的时候就对二叉树进行排序了,当中序遍历二叉树的时候即可得到一个有序的数列; 排序二叉树的规则就是: 若他的左子树不空,则左子树上所有结点的值均小于它的根结构的值; 若他的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树; 从二叉排序树的定义也可以知道,它前提是二叉树,然后它采用了递归的定义方法,再者,它的结点间满足一定得次序关系,左子树结点一定比其双亲结点小,右子树结点一定比其双亲结点打。 代码实现如下: 1 void Create_Sort_Tree(BiTree **t, int value) 2 { 3 ...
阅读全文
摘要:二叉树的数据结构:1 typedef struct BiTree{2 char item;3 struct BiTree *lchild,*rchild;4 }BiTree; 构建一个二叉树: 为了能让每个结点确认是否有左右孩子,我们要对二叉树进行扩展,变成上图的样子。也就是,将二叉树的每个结点的空指针引出的一个虚节点,其值为一特定值,比如“1”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。 有了扩展二叉树就可以进行二叉树的构建了,笔者选择的是先序构建二叉树: 1 void CreateBiTree(BiTree **T) 2 { 3 char ch; 4...
阅读全文
摘要:头插法逆置单向链表 1 #include 2 #include 3 4 typedef struct node{ 5 int item; 6 struct node *next; 7 }node; 8 9 void list_show(node *);10 11 //创建一个长度为10的链表12 node *creat_node_list()13 {14 node *h,*p,*l;15 int n = 10;16 h = (node *)malloc(sizeof(node));17 h->item = 10;18 h->nex...
阅读全文
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 typedef struct node 6 { 7 int item; 8 struct node *next; 9 }node; 10 11 typedef struct queue 12 { 13 node *front; 14 node *rear; 15 }queue; 16 17 char getfirst() 18 { 19 char value; 20 value = getc...
阅读全文
摘要:如题: 如果有数组a[3] = {1,2,3};要按照排列组合的方式进行排列,输入格式如下: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2, 3,2,1 用递归的方法进行编码:代码如下: 1 #include <stdio.h> 2 3 int n = 0; 4 5 void swap(int *a, int *b) //用于交换数据 6 { 7 int m; 8 m = *a; 9 *a = *b; 10 *b = m; 11 } 12 void perm(int list...
阅读全文
摘要:队列是一种先进先出的数据存储结构,一般操作系统中用的比较多,本文主要介绍对顺序队列的入队列,出队列,遍历队列操作。 定义顺序队列: 我们可以用一个数组来表示一个顺序存储结构,两个整数来分别指向数组的下标,表示队列的头指针和尾指针;typedef struct queue{ int data[MAX]; int front; //头指针 int rear; //尾指针}queue; 定义队列之后首先就是初始化队列: 初始化队列的时候队列一定是空的,队列的头指针和尾指针必须指向数组的首端;queue *init(){ queue *h; ...
阅读全文
摘要:矩阵是线性代数中的一个知识,刚开始学习的时候可能感觉不到它有什么用处,最初的感觉就是对二维数据的操作。其实现实生活中矩阵的用处太大了,设计领域相当的广泛。在此只讨论稀疏矩阵的转置问题; 可能看到矩阵就会想到二维数组,比如这样一个矩阵: 你可能会想到用二维数组来存放此矩阵中的元素,就像这样:int text[][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};这样好像也没有什么不好。我们再来看看这个矩阵,五行五列,可以包含二十五个元素,但是此矩阵只有七个元素。但是我们在存放数据的时候分配了二十五块int...
阅读全文
摘要:题目:求4+4/2-9*3的值;思路: ①:用一个字符型数组存放了表达式《4+4/2-9*3》;1 char val[9] = {'4','+','4','/','2','-','9','*','3'}; ②:定义两个栈,一个存放数字,一个存放符号; 1 //定义存储整型的栈 2 typedef struct node 3 { 4 int data[MAXSIZE]; 5 int top; 6 }SeqStack; 7 //定义存储字符型的栈 8 ty
阅读全文
摘要:栈是一种运算受限的线性表。栈的规则是先进后出。栈的顺序存储跟顺序线性表类似,不过栈的top代表栈顶,而顺序线性表的last代表最后一个元素。进栈用的头插法,插入线性表用的是尾插法;顺序栈顺序栈的定义为:1 typedef struct 2 {3 int data[MAXSIZE];4 int top;5 }SeqStack;创建栈:当栈没有值时就要把top指向-1;表示一个空栈,代码如下:1 //创建栈2 SeqStack *create_s()3 {4 SeqStack *s;5 s = (SeqStack *)malloc(sizeof(SeqStack...
阅读全文
摘要:题目:写一个算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同。 刚看到这个题目给我第一个思路是冒泡排序,可以利用冒泡排序的两层循环找出相同的结点,然后free掉。第一层循环是控制循环的次数,第二层循环是控制第n个值和后面值的比较的次数。循环方面还比较好做,在删除结点的时候碰到了一些问题。因为删除结点的时候就相当于把指针指向的空间释放了,这个时候指针链就会断开,不再是一个连续的链表。为了连接链表,还需要额外定义一个变量,来记录释放结点的前一个节点,然后才可以把释放结点的前一个结点连接到释放结点的后一个结点(有点绕口,看代码就知道了)。 线性表的定义,和创建线性表,读取线性表的..
阅读全文
摘要:双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:1 typedef struct node2 {3 int x;4 struct node *prior,*next;5 }DLNode;双向链表的空间结构如下图所示:双向链表的创建如下: 1 //创建双向链表 2 DLNode *create_DList() 3 { 4 DLNode *p,*h,*l; 5 int n,i,x; 6 h = (DLNode *)malloc(sizeof(DLNode)); 7 h->prior = h; /...
阅读全文
摘要:#include <stdio.h>#include <stdlib.h>#define maxsize 1024#define OK 1#define ERROR 0typedef struct LNode{ int data; struct LNode *next;}LNode;//声明函数void out_l(LNode *l); //输出线性表LNode *create_l(); //创建线性表void insert_l(LNode *l); //插入元素void delete_l(LNode *l); //删除元素int searc...
阅读全文
摘要:①:在线性表中插入数据int insertlist (seqlist *l, int i, int x) //在线性表中插入数据{ int k; if(i < 1 || i > l->last + 1) { printf("插入的位置不合法"); return(ERROR); } if(l->last >= maxsize-1) { printf("线性表已经存满"); } for(k = l->last; k >= i - 1;k--) { l->elem[k + 1] =...
阅读全文
摘要:这是一个很简单的程序,但是写的过程中费了好大劲,主要是因为道行不深。 ①:构造线性表:1 typedef struct2 {3 int elem[maxsize];4 int last; 5 }seqlist; ②:分配空间:la=(seqlist *)malloc(sizeof(seqlist)); //分配空间 ③:输入数据: for(i=0;i<la->last;i++) { scanf("%d",&la->elem[i]); //设置值 不要忘记&符号 }整个程序如下:#include ...
阅读全文
摘要:递归与循环是两种不同的解决问题的典型思路。递归算法: 优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕) 缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。循环算法: 优点:速度快,结构简单。 缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。递归算法 和循环算法总结 1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。 2. 现在的编译...
阅读全文