
C数据结构
被选召的孩子
细雨骑驴入剑门
展开
-
两种链表的合并运算(一种带头结点的,一种不带头结点)
一,不带头结点的两个链表的合并运算#include#includetypedef int ElenTyp;typedef struct LNode{ int data; struct LNode *next;}LNode, *LinkList;void create(LinkList &La, int n){ int i; LNode *p原创 2015-11-25 02:36:51 · 554 阅读 · 0 评论 -
算法学习之旅,初级篇(9)--字符串逆序
介绍给你一个字符串,请将其第k个字符开始的长度为L的子串进行逆序。分析就是将第k个字符到第k+L个字符交换位置,主义是否超出字符串总长度。代码#include#include#includeint main(){char m_str[200],m_char;int k,len,L;printf("请输入一个字符串:\n");scanf("%s",原创 2017-08-12 11:33:00 · 973 阅读 · 0 评论 -
算法学习之旅,初级篇(10)--回文字符串
介绍如果一个字符串从中间或者某一个字符处断开,离断开点的距离相同的字符如果是相同的或者是大小写关系的话,我们就称这种字符串为“”回文串“”。给你一个字符串,该字符串是否是回文串。分析将字符串逆序后,比较。代码#include#include#includeint main(){char m_str[200],m_lst[200],m_char;int l原创 2017-08-12 11:53:50 · 455 阅读 · 0 评论 -
算法学习之旅,初级篇(11)--凯撒的密码
介绍凯撒时代充满了动荡和危险,凯撒为了保证在战争中传递秘密消息,发明了一种密码。他在所有的信件中将所有的字符按字母顺序向后移动了5个位置(比如说,原文中是A,那么密信中就为F),密信中字母和原文中字母的对应关系如下:密文:ABCDEFGHIJKLMNOPQRSTUVWXYZ原文:VWXYZABVDEFGHIJKLMNOPQRSTU只有字母被替换,而且所有字母都是大写的。分析原创 2017-08-12 16:37:00 · 642 阅读 · 0 评论 -
算法学习之旅,初级篇(12)--最小公倍数
介绍有多个测试用例,每行两个正整数x,y,x*y每行输出一个测试用例的结果,即x与y的最小公倍数。分析从两个数的最小数遍历到两个数的乘积值,中间对两个数取余都为0,则满足最小公倍数的条件。代码#include#includeint main(){int m_first,m_second,m_num;printf("请输入两个数:\n");while(原创 2017-08-12 17:09:09 · 642 阅读 · 0 评论 -
算法学习之旅,初级篇(13)--素数判定
介绍给一个整数n,判定他是否为素数。分析只有1和其本身因数的数就是素数,或者叫质数。代码#include#include#includebool isSu_first(int num){int i;if(num==2)return true;if(numreturn false;for(i=2;iif(i>=num)return原创 2017-08-12 18:05:59 · 378 阅读 · 1 评论 -
算法学习之旅,初级篇(14)--素数的个数
介绍给定两个非负整数a,b,其中0分析可以直接枚举出来。代码#include#include#includebool isSu_third(int num){int i,k;if(num==2)return true;if(numreturn false;k=sqrt(num*1.0);for(i=3;iif(i>k)retu原创 2017-08-12 22:20:05 · 856 阅读 · 0 评论 -
算法学习之旅,初级篇(15)--分数加减法
介绍给你两个分数,计算两者和及差。分析直接模拟两个分数相加的过程就可以了,注意要约分。代码#include#includeint Divisor(int m_a,int m_b)//求最大公约数{int a,divisor;if(m_a>m_b){a=m_a;m_a=m_b;m_b=a;}for(int i=1;iif(m_a%i原创 2017-08-12 22:54:47 · 510 阅读 · 0 评论 -
算法学习之旅,初级篇(16)--合法的整数
介绍语言中的10进制整数常量定义如下(简化版):常量的开头可以有“”+“”或“”-“”号,也可以没有;至少有一位数字位,除非数字为0,否则第一个数字必须为1到9的数字;如果有符号的话,符号与数字之间可以有0个或多个空格。常量的前后可能会有若干空格。请写一个程序判断给定的整数是否符合这个定义。分析直接按照定义规则检测就好了。代码#include#inclu原创 2017-08-13 11:54:54 · 712 阅读 · 0 评论 -
算法学习之旅,初级篇(17)--质因数分解
介绍任意一个正整数可以分解成唯一的质因数的乘积,给出正整数,请计算出它的质因数分解式。分析从最小的质因数开始找,一直找到乘积为该正整数。代码#include#include#includevoid main(){int m_num,i;printf("请输入一个数字:\n");while(scanf("%d",&m_num)!=EOF){pr原创 2017-08-15 14:16:11 · 1641 阅读 · 0 评论 -
算法学习之旅,初级篇(18)--哥德巴赫猜想
介绍哥德巴赫猜想是指任何一个大于5的偶数等于两个素数之和。给你一个整数,请验证哥德巴赫猜想。分析枚举6到n的数,可以被两个素数表示。代码#include "stdio.h"#include "math.h"#includebool IsPrime(int x){int t;for(t=2;tif(x%t == 0) return f原创 2017-08-15 17:24:31 · 894 阅读 · 0 评论 -
算法学习之旅,初级篇(19)--替换空格
介绍请实现一个函数,把字符中的各个空格替换成“%00”,例如“hekko world! ”,则输出为"hello%00world!%00"。分析一。可以直接把字符串扫一遍,遇到空格就用%00代替,但是这样的话每次遇到空格都要移动字符。二。可以一次性把后面的字符移动到正确的位置,在空格出直接加上%00.代码#include#include#includeusing原创 2017-08-15 22:21:14 · 354 阅读 · 0 评论 -
算法学习之旅,初级篇(20)--队列的实现
介绍使用c语言实现队列。分析 队列功能有初始化,入队,出对,判断是否为空,队列长度,队头队尾元素获得。代码#include#includetypedef int QElemType;#define OK 1#define ERROR 0typedef struct QNode{QElemType data;struct QNode *原创 2017-08-15 23:04:50 · 357 阅读 · 0 评论 -
算法学习之旅,中级篇(4)-–快速排序
介绍 通过一趟遍历把要排序的数据分割成独立的两部分,其中一部分所有数据比另外的一部分所有数据都小。然后再按此方法对这两部分数据进行快速排序,整个排序过程可以递归进行。 分析 快速排序是找出一个元素作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值都不小于基准值,如此作为基准的位置就确定了。 首先找基准元素,然后递归快排。 代码#include<stdio.原创 2017-08-23 22:41:25 · 321 阅读 · 0 评论 -
算法学习之旅,中级篇(5)-–递归之杨辉三角
介绍 杨辉三角的最本质特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。 分析 每行的第一个 和最后一个元素的值为1,设第x行的第y个元素为c(x,y),递归结束条件为x等于y或y等于1,否则c(x,y)=c(x-1,y)+c(x-1,y-1)。 代码#include<stdio.h>#include<math.h>#include<stdlib.h>//递原创 2017-09-02 20:43:16 · 569 阅读 · 0 评论 -
算法学习之旅,中级篇(6)-–递归之斐波拉契数列
介绍 斐波拉契数列,又称黄金分割数列,指的是这样一个数列:0,1,1,2,3,5,8,13,21,34。 分析 本质特征是A[n]=A[n-1]+A[n-2],n>2 代码#include<stdio.h>#include<stdlib.h>//递归写法int f(int n){ if(n==1 || n==2) return 1; else原创 2017-09-02 20:47:30 · 522 阅读 · 0 评论 -
算法学习之旅,中级篇(7)-–递归之汉诺塔
介绍 诺塔(又称河内塔)问题是源于印度一个古老的传说的益智玩具。 大梵天在创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片圆盘,大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 分析 1,先将A上n-1个盘通过C移动到B 2,再将A剩下的一个盘移动到C 3,最后将B盘上的n原创 2017-09-02 21:05:33 · 533 阅读 · 0 评论 -
算法学习之旅,中级篇(8)-–分治之二分搜索(递归)
介绍 给定已按升序排好序的n个元素,从这n个元素中找到一个特定的元素。 分析 分治法是将一个规模为n的问题分解为k个规模较小的子问题,二分搜索则采用的分治的思想,但是在搜索时要保证数据是排好序的。 代码#include<iostream>#include<algorithm>using namespace std;// 递归写法int Bifind(int a[],int f,int原创 2017-09-02 21:13:40 · 575 阅读 · 0 评论 -
算法学习之旅,初级篇(8)--有多少个1
介绍请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位是1,因此得出结果为2。分析我想的是直接对2取余数,和1比较,然后除以2,右移,记录1的个数就好了。代码#include#includeint main(){int m_num;int m_first=0;int count=0;printf("请输原创 2017-08-12 10:57:31 · 316 阅读 · 0 评论 -
算法学习之旅,初级篇(7)--数字塔
介绍有多个输入测试用例,每个用例一行,是一个1-9的整数,输入为0则结束。请输出一个数字塔,若输入是3,则输出的数字塔为: 1 22233333分析用n记录行数,每行的空格是n-i个,i为当前行的数字值,数字数位2*i-1。代码#include#includeint main(){int n;while(scanf("原创 2017-08-12 10:32:12 · 671 阅读 · 0 评论 -
稳定排序和不稳定排序
首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序转载 2017-08-18 22:24:49 · 272 阅读 · 0 评论 -
两种链表的合并运算(一种带头结点的,一种不带头结点)
二:不带头结点的两个链表的合并#include#includetypedefint ElemType;typedefstruct LNode{ int data; struct LNode *next;}LNode,*LinkList; void create(LinkList &La,int n){ int原创 2015-11-25 21:19:42 · 717 阅读 · 0 评论 -
算法学习之旅,初级篇(21)--栈的实现
介绍使用c实现栈的功能。分析实现入栈,出栈,初始化,获得栈顶元素。代码#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 100#define OK 1#define ERROR -1typedef int SElemType; typedef struct{SE原创 2017-08-16 12:29:33 · 311 阅读 · 0 评论 -
算法学习之旅,初级篇(22)--循环队列
介绍用c实现循环队列。分析实现初始化 ,入队,出队的操作。代码#define MAXQSIZE 100#define OK 1#define ERROR -1#include#includetypedef int QElemType;typedef struct{QElemType *base;int front;int rear;}原创 2017-08-16 12:49:44 · 527 阅读 · 2 评论 -
算法学习之旅,初级篇(23)–合并两个有序链表
介绍输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增序列的。 分析 第一种,是可以通过函数嵌套调用,返回值小的指针。 第二种,是通过循环遍历两个链表。 代码#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;typedef struct ListNode{原创 2017-08-17 08:28:37 · 413 阅读 · 0 评论 -
算法学习之旅,初级篇(27)-–逆转一个链表
介绍 定义一个函数,输入一个链表的头结点,反转该链表并输出反转链表的头结点。 分析 如果要反转链表,就要把next指针指向prev指针。所以移动时,需要保存next,prev以及当前的链表指针。 代码#include<stdio.h>#include<iostream>#include<stdlib.h>using namespace std;typedef struct ListN原创 2017-08-17 08:46:56 · 382 阅读 · 0 评论 -
算法学习之旅,初级篇(28)-–从尾到头打印链表
介绍 定义一个函数,从尾节点开始打印输出链表。 分析 可以用递归的方式,到尾节点了在开始打印输出数据。也可以生成一个新的链表从头节点插入,然后输出。也可以用栈来保存遍历的链表节点,然后弹栈输出。 代码#include<stdio.h>#include<iostream>#include<stdlib.h>using namespace std;typedef struct ListN原创 2017-08-17 10:04:26 · 232 阅读 · 0 评论 -
算法学习之旅,初级篇(29)-–链表中倒数第k个节点
介绍 输入一个链表,输出该链表中倒数第k个节点,为了符合大多数人的习惯,从一开始计数。即链表的尾节点是倒数第一个节点。 分析 可以遍历两次链表,第一次记录链表的长度,第二次算出倒数第K个节点的顺数位置,然后输出。也可以用两个指针相隔k-1个节点,当最后一个指针指向尾节点时,前一个指针就指向的是倒数第k个节点,这样就只遍历了一遍链表。 代码#include<stdio.h>#include<原创 2017-08-17 10:21:58 · 293 阅读 · 0 评论 -
算法学习之旅,初级篇(30)-–删除链表内节点
介绍 给定单向链表的头指针和第几个节点,定义一个函数在o(1)时间删除该节点。 分析 先遍历找到节点指针,然后进行删除 代码#include<stdio.h>#include<stdlib.h>typedef struct ListNode{ int value; ListNode *next;}ListNode;void DeleteNode(ListNode*原创 2017-08-17 17:12:33 · 282 阅读 · 0 评论 -
算法学习之旅,初级篇(1)--大小写转换
介绍 给一个字符串,将其中的英文字母的大小写进行转换。输入:第一行是一个整数N,表示样例的个数,以后每行一个字符串。字符串可能由英文字母,数字,各种标点(包括空格)组成,长度不超过200。输出:每行输出一个转换后的结果。分析读取一个字符串,使用for循环一个一个字符进行判断,若为小写,则把其ASCII码减去32变成大写,若为大写则加上32,即可得到相应的大小写字母。原创 2017-08-11 14:24:53 · 687 阅读 · 0 评论 -
算法学习之旅,初级篇(2)--水仙花数
介绍如果一个三位数的每个数位的三次方和就是本身,那么我们称这种数为“”水仙花数“”,比如100~200之间的“”水仙花数“”只有153。分析输入两个三位数n,m,找出n~m之间的“”水仙花数“”,并输出,若不存在,则输出“”NO“”。代码#include#include//#includebool isYes(int n){int first=0;int原创 2017-08-11 14:45:33 · 757 阅读 · 0 评论 -
算法学习之旅,初级篇(3)--海明距离
介绍海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数。比如2转换到3需要翻转1位,所以2到3的海明距离是1。给你两个正整数x和y,(x,y分析把两个十进制数转化成相应的二进制数,然后比较,若不相同则k加1,最后输出结果k。代码#include#includeint main(){int a_first,m_a;int b_first,m_b原创 2017-08-11 14:58:45 · 3692 阅读 · 0 评论 -
算法学习之旅,初级篇(4)--哈密尔顿距离
介绍有两个点P(x1,y1),Q(x2,y2),定义其哈密尔顿距离D=|x1-x2|+|y1-y2|,请计算给定两个点的哈密尔顿距离。分析没什么分析T.T。代码#include#include#includeint main(){int m_x1,m_x2,m_y1,m_y2;printf("请输入点x1的坐标:\n");scanf("%d %d原创 2017-08-11 15:13:00 · 3738 阅读 · 0 评论 -
算法学习之旅,初级篇(5)--数码平方和
介绍一个整数各个数码的平方和的个位数称为它的分类值。给你一个区间[a,b],和一个数码n,请求这个区间内多少数的分类值为n。分析从a枚举到b,如果其中有一个整数满足条件,则k加1,最后输出结果k。代码#include#includeint main(){int m_a,m_b,m_n,m_num,m_c;int f=0;int k=0;printf(原创 2017-08-11 15:43:03 · 647 阅读 · 0 评论 -
算法学习之旅,初级篇(6)--统计字符
介绍给一个字符串(大写),请找出出现次数最多的大写英文字母。分析读入一串字符,采用哈希映射思想,把A-Z映射到哈希表中保存其出现的次数,最后直接输出结果。代码#include#includeint main(){int sum[27],len,m_i;for(int i=0;i sum[i]=0;char m_str[2000],m_a;int原创 2017-08-11 16:33:27 · 329 阅读 · 0 评论 -
算法学习之旅,中级篇(1)-–选择排序
介绍 在要排序的一组数中,选出最小的,或者最大的一个数与第一个位置的数交换,然后在剩下的数当中再找最小,或者最大的与第二个位置的数交换。 以此类推。。。 直到第n-1个元素和第n个元素比较为止。 分析 第一躺:从n个数中找出最小的数与第一个数交换位置。 第二趟:从第二个数开始的n-1个数找到最小的数与第二个数交换位置。 以此类推。。。 第i躺:从第i个数开始到n-i+1个数中选出最小原创 2017-08-18 22:10:14 · 281 阅读 · 0 评论 -
算法学习之旅,中级篇(2)-–插入排序
介绍 每次从无序表中取出第一个元素,把它插入到有序表中的合适位置。 分析 第一趟:比较前两个数的大小,然后把其中最小的插入排在第一个位置。 第二趟:比较第三个数与前两个数的大小,大的数后移,知道遇到小的,便插入到较小数的后面,数不再移动。 依次进行,进行了N-1躺后,就完成了整个排序过程。 代码#include<iostream>using namespace std;void pr原创 2017-08-18 22:15:51 · 525 阅读 · 0 评论 -
算法学习之旅,中级篇(3)-–冒泡排序
介绍 重复遍历数列,一次比较两个数,顺序有误就交换位置。 分析 首先,比较相邻的元素,如果不符合定义的排序规则(比如从小到大,如果后一个数比前一个数小,就是不符合定义的排序规则),就交换两个数的位置。 然后,对每一对相邻的元素做相同的比较操作,从开始第一对到倒数一对。最后的元素会是最小或者最大的数。 最后,对所有的元素都进行相同的比较操作,知道没有任何一个数需要比较后,冒泡排序就完成了。原创 2017-08-18 22:22:58 · 314 阅读 · 0 评论 -
顺序表基本操作
#include<iostream>#include<stdio.h>#define MaxSize 100using namespace std;typedef int ElemType;typedef struct{ ElemType data[MaxSize]; int length;}SqList;//const int count = 10;...原创 2018-02-26 10:39:34 · 263 阅读 · 0 评论