数据结构与算法
晨初听雨
这个作者很懒,什么都没留下…
展开
-
贪心+回溯算法之马踏棋盘问题
问题描述:将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64个方格。求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。这个算法的代码大概需要运行十几个小时,有兴趣的小伙伴可以试试,哈哈哈哈。代码如下:#include<stdio.h>int cnt=0;int kin...原创 2018-07-30 00:14:04 · 1585 阅读 · 0 评论 -
面试题—将两个升序排列的链表合并成一个升序链表
将两个升序排列的链表合并成一个有序链表例如: head1->2->3->5->6->7->9->11 head2->2->4->5->7->9合并之后结果为:head->2->2->3->4->5->5->6-&原创 2018-07-03 14:32:53 · 8653 阅读 · 0 评论 -
利用头插法创建一个单向链表以及链表的逆置
#include<stdio.h>#include<stdlib.h>#define N 10//定义结构体单元 typedef struct node{ int data;//结构体数据域 struct node* next;//结构体指针域 }ElemSN;//逆向创建单向链表(头插法)ElemSN *PreCreatLink(int a[],i...原创 2018-07-03 12:40:59 · 774 阅读 · 0 评论 -
删除链表中值重复的结点
设head指向一个非空单向链表,数据域值重复且无序,删除重复结点例如原链表中数据域值为3->2->3->8->4->3->4->9->2->3删除重复值后链表数据域值为3->2->8->4->9代码如下:#include<stdio.h>#include<stdlib原创 2018-07-02 14:54:05 · 1525 阅读 · 0 评论 -
链表结点的删除(有无重复值都适用)
#include<stdio.h>#include<stdlib.h> #define N 10typedef struct node{ int data; struct node* next;}ElemSN;//创建一个单向链表 ElemSN* CreatLink(int a[],int n){ ElemSN *head,*tail,*p; he...原创 2018-07-02 14:14:46 · 221 阅读 · 0 评论 -
链表的遍历(打印链表所有结点的值 ,返回链表的尾结点,输出该链表的结点个数,输出最大值结点的值)
#include<stdio.h>#include<stdlib.h> #define N 10typedef struct node{ int data; struct node* next;}ElemSN;//创建一个单向链表 ElemSN* CreatLink(int a[],int n){ ElemSN *head,*tail,*p; he...原创 2018-07-02 11:42:39 · 6707 阅读 · 1 评论 -
正向创建单向链表(三种方法)及输出各个结点的值
#include<stdio.h>#include<stdlib.h>#define N 10//定义结构体单元 typedef struct node{ int data;//结构体数据域 struct node* next;//结构体指针域 }ElemSN;//正向创建单向链表(方法一,先创建头结点) /*ElemSN* CreatLink(i...原创 2018-07-01 23:57:50 · 2595 阅读 · 0 评论 -
逆向输出一个数组的所有值(递归和非递归)
使用递归和非递归逆向输出一个数组的所有元素非递归实现:例如:数组a为12345;逆质输出后为54321.#include<stdio.h>#include<string.h>#define N 500 //表示宏定义,用500代替下面程序的N,可以根据自己的需要改 int main(void){int i;char a[N+1];gets(a)...原创 2018-04-24 19:41:43 · 1792 阅读 · 0 评论 -
二叉搜索树的创建,和前序遍历,中序遍历,后序遍历(非递归)。
前序遍历的规则:(1)访问根节点(2)前序遍历左子树(3)前序遍历右子树 中序遍历的规则:(1)中序遍历左子树(2)访问根节点(3)中序遍历右子树 后序遍历二叉树的规则:(1)后序遍历左子树(2)后序遍历右子树(3)访问根节点 代码如下:#include<stdio.h>#include<stdlib.h>...原创 2018-08-31 20:18:56 · 948 阅读 · 0 评论 -
面试题—将链表中值为奇数的结点放到值为偶数的结点之前
将链表中值为奇数的结点放到值为偶数的结点之前例如 :3->2->5->8->4->7->6->9->0->1经过处理变为:1->9->7->5->3->2->8->4->6->0代码如下:/*要求将链表中值为奇数的结点放到值为偶数结点之前原创 2018-07-03 13:24:47 · 2717 阅读 · 0 评论 -
面试题—逆序打印链表各节点的值(递归和非递归)
逆序输出链表结点的值例如:head->3->2->5->8->4->7->6->9->0->1输出为 : 1 0 9 6 7 4 8 5 2 3代码如下:#include<stdio.h>#include<stdlib.h>#define N 10type原创 2018-07-12 14:58:35 · 567 阅读 · 0 评论 -
回溯算法,贪心算法之迷宫问题
问题描述:给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。算法描述:1.从入口开始,对下,右,上,左方向依次试探。若有路可走且没走过,则走。若无路可走则回溯回上一步继续试探2.当走到出口时,输出该组路线并回溯回上一步寻找下一条路线代码如下:#include<stdio.h>#define R 7#define C ...原创 2018-07-29 23:49:22 · 3103 阅读 · 1 评论 -
八皇后问题(回溯算法)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。那么什么是回溯算法呢? 可以参考链接 https://baike.so.com/doc/6349194-6562820.html八皇后算法描述:1....原创 2018-07-29 23:29:36 · 813 阅读 · 0 评论 -
哈夫曼树的创建
哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li...原创 2018-07-22 15:53:51 · 771 阅读 · 0 评论 -
贪心算法(装箱问题)
贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。因此能够使用贪心算法的问题必须满足下面的两个性质:1.整体的最优解可以通过局部的最优解来求出;2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。3.局部最优解不一定能得到整体最优解。 贪心算法之装箱问题:有若干个体积为V的箱子,有n个物品体积为v1,v2...原创 2018-07-22 14:42:02 · 5099 阅读 · 0 评论 -
面试题—用选择排序法对单链表进行升序排序
算法描述:定义指针p和q,p用来遍历指针,q为联动指针。 定义pmax和qmax。pmax指向当前链表中值最大的结点,qmax指向值最大结点的前驱结点用指针p遍历链表head找出当前链表中的值最大的结点,用pmax指向该结点。然后利用qmax将该最大值结点从链表head中删除,利用头插法插入链表head1中。 重复操作即可代码如下:结构体定义:typedef struct ...原创 2018-07-13 18:33:11 · 3852 阅读 · 2 评论 -
面试题—查找链表倒数第k个结点
算法描述:定义两个指针,快指针fastp和慢指针slowp。先让两指针同时指到头指针上。然后让快指针先走k步。之后再两指针同时向后跑,当fastp指针跑到NULL时,slowp指向的结点即为倒数第k个结点 结构体类型定义:typedef struct node{int data;struct node *next;}ElemSN; 代码如下:ElemSN* Fi...原创 2018-07-13 12:56:56 · 321 阅读 · 0 评论 -
面试题—查找链表的中间节点
面试中常会被问到这个问题:查找链表的中间节点 对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进行第二遍遍历的时候根据链表长度的一半就能查找到链表的中间节点。这种方法可能比较简单但是时间复杂度为O(2n)。以下我会提供另一种简单方法 其实我们可以定义两个指针,一个快指针fastp,一个慢指针slowp。遍历链表时,慢指针每走一步,快指...原创 2018-07-13 12:12:42 · 697 阅读 · 0 评论 -
面试题—循环链表实现约瑟夫环
约瑟夫环规则如下:1、一群人围在一起坐成 环状(如:N)2、从某个编号开始报数(如:K)3、数到某个数(如:M)的时候,此人出列,下一个人重新报数4、一直循环,直到所有人出列 ,约瑟夫环结束 代码如下:#include<stdio.h>#include<stdlib.h>#define N 10typedef struct node{ ...原创 2018-07-13 11:08:00 · 512 阅读 · 0 评论 -
荷兰国旗问题
问题描述:现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。分析这个问题我们可以将这个问题视为一个数组排序问题。红白蓝分别对应数字0、1、2。红、白、蓝三色小球数量并不一定相同。 1 0 2 0 1 ...原创 2018-11-22 19:51:13 · 212 阅读 · 0 评论