数据结构与算法
数据结构与算法
dancheng_work
在时间允许的情况下,源码是最好的开发文档。
展开
-
八皇后问题
#include #include #define max 8int queen[max], sum=0; /* max为棋盘最大坐标 */void show(){ /* 输出所有皇后的坐标 */ for(int i = 0; i < max; i++){ printf("(%d,%d) ", i, queen[i]); } printf("\n")转载 2017-02-06 20:36:12 · 302 阅读 · 0 评论 -
大数相加
大数想加的代码及用法:#include #include #include using namespace std;void add(string s1,string s2){ int a[1000],b[1000],c[1000]; int i , j , len1 = s1.length() , len2 = s2.length() , jw =原创 2016-08-15 07:39:17 · 472 阅读 · 0 评论 -
判断一个数和这个数的重组对8是否能整除的题
小猫很无聊,竟然开始研究数字的整除了,有这样一个问题。给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。输入格式:多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。输出格式每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。实现代码:#include "iostream"#include "原创 2016-08-15 07:57:29 · 829 阅读 · 0 评论 -
循环队列操作代码
#include #include typedef struct Queue{ int *a; int front; int rear;}QQ;int n; void init(QQ *pQ); //定义一个队列 bool add(QQ *pQ,int val); //入队bool原创 2016-08-18 11:08:11 · 581 阅读 · 0 评论 -
任意进制转化为十进制
int int_pow(int x,int y) //幂函数 即x^y{ int i,result=1; for(i=0;i result*=x; return result;} int xtod(char num[],int jz) //字符串num是其他进制的数,jz代表num是几进制的数{ int原创 2016-08-18 11:43:59 · 1037 阅读 · 0 评论 -
将十进制转换为任意进制的数
void dtox(int dnum,int jz) //dnum是传入的十进制数 jz是想要变为几进制{ char xnum[100]; //保存目标进制的各位数 int i=0,j=0; while(dnum>=jz) { if(dnum%jz {原创 2016-08-18 11:47:51 · 962 阅读 · 0 评论 -
递归知识
递归满足的三个条件 1.递归必须得有一个明确的终止条件 2.该函数所处理的数据规模必须在递减 3.这个转化必须是可解的 递归和循环的比较:循环可以转换为递归,但递归不一定可以转化为循环 递归: 优点:易于理解 缺点:速度慢,存储空间大 循环: 优点:速度快,原创 2016-08-18 21:15:54 · 283 阅读 · 0 评论 -
双向链表
这个是双向链表的创建与其问题问题是: 创建一个链ABCDEFGHIJKLMNOPQRSTUVWXYZ ,输入3 得到答案为D->E->F->G->H->I->J->K->L->M->N->O->P->Q->R->S->T->U->V->W->X->Y->Z->A->B->C输入-3答案为X->Y->Z->A->B->C->D->E->F->G->H->I->J->K->原创 2016-08-28 09:14:58 · 372 阅读 · 0 评论 -
简单二叉树操作
二叉树的先序、中序、后序操作#include #include typedef struct Tree{ char a; struct Tree * LeftTree; struct Tree * RigthTree;}T;T * Creat(); //生成一个二叉树void PreShowTree(T * pT); /原创 2016-08-21 21:39:25 · 241 阅读 · 0 评论 -
约瑟夫问题类
编号为1`N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个按顺时针方向自1开始顺序报数,报道M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个开始从1报数,如此下去,直至所有人全部出列为止。 #include #include typedef struct Huan原创 2016-08-23 15:01:22 · 353 阅读 · 0 评论 -
对链表的操作
对链表的操作函数:void creat(); //创建链表bool insert(); //插入链表void search(); //查询链表bool del(); //删除链表void output();原创 2016-08-15 13:08:28 · 601 阅读 · 0 评论 -
对数组的操作方法
在 .h 文档中写下这个,调用这个 .h 头文件就可以用着个数组操作了数组操作各函数与各个函数的功能:void init(S *pArr,int length) 初始化一个数组bool add(S *pArr,int val)原创 2016-08-13 17:42:31 · 493 阅读 · 0 评论 -
求一个字符串数组的实际长度
一个字符串数组char num[] 求其实际长度:for(int i=0;;i++){ if(num[i]=='\0' break; else n++;}这个n就是字符串的实际长度原创 2016-08-05 12:43:29 · 1392 阅读 · 0 评论 -
编写算法交换二叉树中所有节点的左右子树
实现代码如下://root是根节点void swap(){ BiNode queue[100], temp; int first = 0, last = 0; queue[first++] = root; while(first != last){ root = queue[last++]; temp = root->lchild; root->lchild = root原创 2016-12-16 10:04:07 · 25763 阅读 · 3 评论 -
分数运算
分数的四则运算一、分数的表示和化简:1.分数的表示struct Fraction{ int up, down;};2.分数的化简Fraction reduction(Fraction result){ if(result.down < 0){ result.up = -result.up; result.down = - res原创 2016-12-21 16:47:44 · 378 阅读 · 0 评论 -
最大公约数和最小公倍数实现
最大公约数:int gcd(int a, int b){ return !b ? a : gcd(b, a % b);}最小公倍数:a * b / gcd(a, b);建议写:a / gcd(a, b) * b;原创 2016-12-21 16:31:04 · 349 阅读 · 0 评论 -
c++实现图的操作(增删改查、遍历、最小生成树)
如果嫌复制粘贴麻烦,可以到我的资源下载:http://download.csdn.net/detail/dancheng1/9708649 这个下下来直接可以使用。 这些代码直接就可以复制粘贴进行操作(编译器:不支持 vc++6.0)需要建立的文件有:GraphBian.cppGraphDian.cppPrimNum.cppgraph.hgraph.cpp...原创 2016-12-10 19:54:44 · 1325 阅读 · 1 评论 -
分数的四则运算
#include #include //分数的表示和化简struct Fraction{ int up, down;}; //求最大公约数 int gcd(int a, int b){ return !b ? a : gcd(b, a % b);}//分数的化简Fraction reduction(Fraction result){ if(result.down < 0){原创 2016-12-01 10:37:07 · 300 阅读 · 0 评论 -
2-路归并
#include #include using namespace std;const int maxn = 100;void merge(int A[], int L1, int R1, int L2, int R2){ //二分思想实现两个增序序列变为一个增序系列 int i = L1, j = L2; int temp[maxn], index = 0;原创 2016-11-30 20:30:20 · 252 阅读 · 0 评论 -
判断数是否为回文数
需要传的参数是数组和数组的个数bool Judge(int z[], int num){ for(int i = 0; i <= num / 2; i++){ if(z[i] != z[num - 1 - i]){ return false; } } return true; }原创 2016-11-07 18:50:14 · 336 阅读 · 0 评论 -
C++中cin、cin.get()、cin.getline()、getline()、gets()用法
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)1、cin 2、cin.get() 3、cin.getline() 4、getline() 5、gets() 6、getchar() 附:cin.ignore();cin.get()//跳过一转载 2016-11-07 10:34:13 · 330 阅读 · 0 评论 -
判断链表是否有环的两种方式和创建有无环的方法
#include #include typedef struct Huan{ int a; struct Huan * next;}H;//从这开始是有无环链表的创建方法:H * creatH(int n , int m) //创建一个带有环的链表, n是总链节数, m是在何处开始有的环 {原创 2016-08-24 20:56:58 · 622 阅读 · 0 评论 -
算法设计:数组左移k个位子实现代码
设计一个时间复杂度为O(n)的算法,实现将A[n]中所有元素循环左移k个位置:实现代码:#include using namespace std;int main(){ int A[7] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 }; int n = 7 ;/* int n;原创 2016-09-18 18:41:19 · 3144 阅读 · 0 评论 -
利用栈实现二进制转换为八、十、十六进制
#include #include #include using namespace std;/*-----------------------------栈的建立-------------------------------*/ typedef struct Stack{ int * a; int base; //栈低 i原创 2016-08-29 10:25:53 · 2533 阅读 · 0 评论 -
算法设计:将一个数组分为奇数、偶数左右两个部分,要求时间复杂度为O(n)
已知数组A[n]中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为O(n)。代码实现部分:#include using namespace std;int main(){ int n; cout cin>>n;原创 2016-09-18 19:37:18 · 10940 阅读 · 1 评论 -
希尔排序法
希尔排序法:#include /*** 对于希尔排序ShellSort函数中* d 是每次对比大小的宽度* x 是记录每次的基础值,再去变其他跨度值 * i、j是计数的 */void ShellSort(int * a, int n){ int d, i, j, x; d = n / 2; while(d >= 1)原创 2016-09-28 19:49:43 · 317 阅读 · 0 评论 -
合并排序
合并排序就是将两个或多个有序表合并成一个有序表:#include #include void MergeStep(int * a, int * r, int s, int m, int n) //相邻有序段合并 { int i, j, k; k = s; i = s; j = m + 1; while(i {原创 2016-09-29 18:56:32 · 352 阅读 · 0 评论 -
试编写在无头结点的单链表上实现线性表的插入操作的算法,并和带头结点的单链表上的插入操作的算法进行比较
//无头结点,头指针为 head void LinkList::Insert(int i, DataType x){ p = head; int count = 1; if(i == 1) { s = new Node; s->data = x; s->next = head;原创 2016-10-05 10:08:29 · 8361 阅读 · 0 评论 -
试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法
//对数组的倒置void SeqList::inversion(){ int i = 0, j = length - 1; DataType temp; while(i { temp = data[i]; data[i++] = data[j]; data[j--] = temp; }原创 2016-10-05 10:34:12 · 27440 阅读 · 1 评论 -
假设在长度大于1的循环链表中,即无头结点也无头指针,s为指向链表中的某个结点的指针,试编写算法删除结点s的前驱结点
结构体: struct DulNode{ int a; struct DulNode * next;};/*中间是建循环链表和对链表其他操作的代码*///前提是s结点是循环链表中的一个结点 void del(struct DulNode * s){ struct DulNode *q, *p1, *p2; //原创 2016-10-18 10:41:20 · 23124 阅读 · 11 评论 -
已知一单链表中的数据元素含有三类字符:字母、数字和其他字符。是编写算法,构造三个循环链表,使每个循环链表中只含同一类字符
结构体: struct NodeInt{ int num; struct NodeInt * next;}; struct NodeChar{ char character; struct NodeChar * next;};struct NodeDouble{ double dou; struct NodeD原创 2016-10-18 11:00:28 · 15964 阅读 · 2 评论 -
利用栈进行进制转换,二进制转换为十进制
#include #include #include using namespace std;/*-----------------------------栈的建立-------------------------------*/ typedef struct Stack{ int * a; int base; //栈低 i原创 2016-08-28 13:25:54 · 636 阅读 · 0 评论 -
约瑟夫类问题
17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。实现代码:#include #includ原创 2016-08-24 07:36:14 · 885 阅读 · 0 评论 -
约瑟夫问题
编辑据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2原创 2016-08-23 14:53:59 · 345 阅读 · 0 评论 -
利用后缀做计算器,运算
#include #include #include #include using namespace std;#define STACK_INIT_SIZE 20#define STACKINCREMENT 10#define MAXBUFFER 10typedef double ElemType;typedef struct{原创 2016-09-28 11:49:39 · 348 阅读 · 0 评论 -
设单链表以非递减有序排列,设计算法实现在单链表中删除值相同的多余结点
先对链表进行排序在删除数相等的结点:已知单链表的无头节点head void sortDel() //排序+删除 { pStu p, q, temp1; int temp; p = head; for( p ; NULL != p->Next ; p = p->Next ) {原创 2016-10-18 11:35:37 · 15750 阅读 · 2 评论 -
判断带头结点的双循环链表是否对称
头结点:headbool BL(){ bool isOK = false; struct DulNode * start, * p; int len = 1; start = head->next; p = start->next; while(p != start) { len++;原创 2016-10-18 11:42:55 · 5802 阅读 · 1 评论 -
假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
#include using namespace std;template struct Node{ DataType a; Node * next;}; template class LinkQueue{ public: LinkQueue(); ~LinkQueue(); void ad原创 2016-10-25 11:23:13 · 29802 阅读 · 4 评论 -
素数 的两种判断方法
正常的判断函数:bool is_prime(int n){ int i; if(n { return false; } for(i=2;i*i { if(n % i== 0) { return false; } }原创 2016-08-18 09:14:25 · 862 阅读 · 0 评论 -
递归实现阶乘
由递归实现阶乘int fact(int f) //求这个数的阶乘 { int result = 1; for( int i = 2; i result *= i; return result;}原创 2016-08-18 11:23:37 · 559 阅读 · 0 评论