/** 算法思想:由二叉树的遍历特点,指针总是由上层走向下层,一直走到最底层 然后返回上层。设置变量记录层数,当指针走向下层时层数加一 返回上层时,层数减一。如果找到指定结点,输出层数。 **/ int l = 1; void leno (BTNode *p,char x) { if(p!=NULL) { if(p->data==x) printf("%d",l); ++l; leno(p->lchild,x); leno(p->rchild,x); --l; } }
/** 算法思想: 从任意一个结点开始,进行深度优先搜索,输出访问过的结点。 连通分量加一,再选取未被访问过的节点进行深度优先搜索。 直到所有结点都被访问完。 **/ #define maxSize 100 int visit[maxSize]; void conCom(AGraph *G) { int i; int count=0; for(i=0;i<G->n;i++) { if(visit[i]==0) { DFS(G,i); count++; } } printf("%d",count); } void DFS(AGraph *G,int v) { ArcNode *p;//边指针 visit[v]=1;//标记访问 printf("%d",v); p=G->adjlist[v].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0) { DFS(G,p->adjvex); p=p->nextarc; } } }
/** 算法思想:1.从头至尾遍历双链表,找到data值为x的节点 2.将此节点频度加一,将此节点在链表中删除 3.从右至左找到第一个频度比他大的节点,插入到此节点后面 **/ typedef struct DLNode { int data; int freq; struct DLNode *prior; struct DLNode *next; }DLNode; void locate( DLNode *l,int x) { DLNode *p,*q; p=l->next;//l即为头结点 while(p!=l) { if(p->data == x) { q=p;//p指针暂存查找到的这个节点 q->freq = q->freq+1;//访问频度加一 //先将q在原位置删除,因为我们要从后往前找到插入点, //必须先删除,避免他位置不变,重复插入的情况 q->prior->next=q->next; q->next->prior=q->prior; //从这个点开始,向表头方向查找q的插入点 while(p!=l) { if(q->freq<p->freq)//从右至左找到第一个比q的频度大的结点 { //将q插入到此位置的后面 q->next = p->next; p->next->prior=q; p->next=q; q->prior=p; } p=p->prior;//p指针前移 } } p=p->next; } }
找出指定字符在字串中首次出现的位置
// 在编写这个程序的时候遇到的问题: /** scanf("%s",str); 输入完成时会有一个\n被压栈存储,导致第二个scanf失效 解决方案: 1. scanf("%s]",str); fflush(stdin);//清空缓冲区 2. scanf("%s",str);//用getchar将\n取出 char test = getchar(); printf("%d",test); 3.gets(str);// 串中有空格等: 1.字符串里面可能有空格、制表符等空白字符,如果直接用%s是不可以的 2.gets()可以实现,但是gets不安全,控制难度大。 3.scanf("%[^\n]%*c",str); //%*c的作用是读入\n,否则后面读入的将一直是\n 、%*c表示读入不存储注意c不可以换成其他字符 //^表示"非",即读入其后面的字符就结束读入 **/ // 参考链接: // http://blog.csdn.net/hao5743/article/details/6939661 // http://blog.sina.com.cn/s/blog_60cbc1700100ohil.html // http://blog.csdn.net/why850901938/article/details/51298656 // 本题答案: #include #define MaxSize 100 int search_pos(char *str,char c) { int i = 1;//用于标记位置 while(*str) { if(*str==c) return i; str++;//指针下移 i++;//标记加一 } return 0; } int main() { char str[MaxSize],x; int pos; printf("请输入字符串\n"); gets(str);//考试应该可以写 //scanf("%[^\n]%*c",str);//%*c表示输入但不存储 标准写法 printf("请输入要查找的字符\n"); scanf("%c",&x); pos = search_pos(str,x); if(pos == 0) printf("此字符不存在于字符串中\n"); else printf("查找成功此字符在字符串的第%d个位置\n",pos); } 另一种思路:先输入字符再输入字符串,可以完美解决 #include int main(){ char str[100]; printf("输入字符\n"); char c = getchar(); //char x = getchar(); //printf("%d",x); printf("输入字符串\n"); scanf("%s",str); printf("%d",str[0]); } 补充: #include int main(){ // 同时使用scanf输入两个字符串可以 /** char str[100], a[100]; printf("输入字符串\n"); scanf("%s",str); printf("输入字符串\n"); scanf("%s",a); **/ //先输入字符(getchar、scanf均可)后输入字符串可以 /** char str[100], a; printf("输入字符\n"); scanf("%c",&a); printf("输入字符串\n"); scanf("%s",str); **/ //先输入字符串(scanf输入),后输入字符不可以但是使用gets()可以 char str[100], a; printf("输入字符串\n"); //scanf("%s",str); gets(str); printf("输入字符\n"); scanf("%c",&a); //总结:不能使用scanf先输入字符串再输入字符,其他情况均可 }
#include <stdio.h> int main() { int i,j,l;//中间变量 int n;//项数 int s=0;//总和 printf("请输入项数n的值\n"); scanf("%d",&n); for(i=1;i<=n;i++) { int k =1;//每次开始的值 int m =1;//每次累乘和 for(j=1;j<i;j++) k=k+j;//求出每项开始值 for(l=k;l<k+i;l++) m=m*l;//每项累乘 s=s+m; } printf("前%d项和为:%d\n",n,s); }
#include <stdio.h> //定义学生结构体,包含学生编号和成绩两部分 typedef struct Competitor { double grade; int number; } Competitor; double get_grade(int n) { int sum = 0; int min,max;//定义总分,最高分,最低分 int s;//老师打分 int i;//循环控制变量 double average;//定义平均分 printf("现在对编号为%d的选手打分\n",n); for(i=0;i<8;i++) { printf("请第%d位老师打分:\n",i+1); scanf("%d",&s); //第一个老师打的分赋值 if(i==0) { max=s; min=s; } //找最高分最低分 if(max<s) max=s; if(min>s) min=s; sum = sum + s; } sum = sum - min - max;//去掉最高分、去掉最低分 average = sum/6.0; printf("编号为%d的选手平均分为%f\n",n,average); return average; } int main() { Competitor c[5];//20位太多了,5位测试 int i; int j; for(i=0;i<5;i++) { int n; printf("请输入学生编号:"); scanf("%d",&n); c[i].
算法思想: 输入一个数x,将其对n取余(n从2开始),如果余数为零,m=m/n,重复操作。如果余数不为零,n++,直到找到能够被其整除的数。
非递归算法
#include <stdio.h>int main() { int n, i, c;//需要分解的自然数 scanf("%d", &n); i = 2; c = n; printf("%d=", n); while(n != 1) { if(n%i == 0) { printf("%s%d", c == n ? "" : "*", i); n /= i; } else ++i; } } 递归算法实现
#include <stdio.h> void num_break(int c,int n,int i) { if(n!=1)//n==1,证明分解完毕 { if(n%i==0) { printf("%s%d", c == n ? "" : "*", i); n/=i; num_break(c,n,i); } else num_break(c,n,++i); } } int main() { num_break(140,140,2); }
#include <stdio.h>#include <stdlib.h>#include <string.h>//逆置指针字符串 void invert(char *str,int len) { char * p1 = str; char * p2 = str + len - 1; while(p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } } int main() { char str1[] = "5689";//字符串1 char str2[] = "356";//字符串2 int len1 = strlen(str1);//取字符串1的长度 int len2 = strlen(str2);//取字符串2的长度 invert(str1,len1);//逆置 invert(str2,len2); //结果字符串动态分配 char *result; result = (char*)malloc(len1 + len2); //初始化结果字符串 for(int k = 0; k < len1 + len2; k++) { result[k] = '0'; } for(int i=0;i<len1+len2;i++) { printf("%c",result[i]); } printf("\n"); for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { int pos = i + j;//待写入位置 int tmp = (str1[i] - '0') * (str2[j] - '0') + (result[pos] - '0'); result[pos] = tmp % 10 + '0'; //将余数写入对应位置 //产生的进位 int carry = tmp / 10; //当进位大于0,则更新下一位,一直更新,直到进位为0 while(carry > 0) { //下一个位置的数真值加上进位得到tmp tmp = result[pos + 1] - '0' + carry; //下一个位置等于tmp对10求余数 result[pos + 1] = tmp % 10 + '0'; //计算进位 carry = tmp / 10; //移动位置 pos++; } for(int i=0; i<len1+len2;i++) { printf("%c",result[i]); } printf("\n"); } } /** char *str1= "5689"(静态存储区) char str[] = "5689"(栈区) (char*)malloc(len1 + len2)(堆区); **/ invert(result,len1+len2); for(int i=0; i<len1+len2;i++) { printf("%c",result[i]); } return 0; }
#include <stdio.h>#include <stdlib.h>//向量 typedef struct Vector { int x; int y; }Vector; //坐标点 typedef struct Point { int x; int y; }Point; //判断两向量是否共线,不共线即可构成三角形 int triangle(Vector v[]) { if(v[0].x*v[1].y == v[1].x*v[0].y) return 0;//共线、不能构成三角形 else return 1; } //将三点坐标转换为两个向量的坐标 void change(Point p[],Vector v[]) { v[0].x = p[0].x-p[1].x; v[0].y = p[0].y-p[1].y; v[1].x = p[0].x-p[2].x; v[1].y = p[0].y-p[2].y; } int main() { int n;//坐标点总数 int i,j,k;//循环变量 Point m[3];//三个点 Vector l[2];//两个向量 printf("请输入坐标点个数:\n");//输入坐标点个数 scanf("%d",&n); Point *p = (Point*)malloc(sizeof(Point)*n);//分配点存储空间 for(i=0;i<n;i++) { printf("请输入第%d个坐标:\n",i); scanf("%d,%d",&p[i].
// 先序遍历树中每个节点 int visit( int T[],int n,int id) { if(id > n) return 0; printf("%d",id); visit(T,n,id*2); visit(T,n,id*2+1); } //打印全部祖先结点 int print_ancestor(int T[],int n) { int parent = 0; parent = n/2; while(parent >0) { printf("%d",parent); parent = parent/2; } }