//采用指针游历的方式求层数遍历 int l; int num=0; int leno(BTNode *p,int x) { if(p!=NULL) { if((l==x||l==x+1)&&p->lchild==NULL&&p->rchild==NULL) ++num; ++l; leno(p->lchild,x); leno(p->rchild,x); --l; } return num; }
同2016-d-二-3
int fun(LNode *l) { int max,min; LNode *p; p=l; max=p->data; min=p->data; //先找出最大值最小值 while(p!=NULL) { if(p->data>max) max=p->data; if(p->data<min) min=p->data; p=p->next; } //判断是否符合要求 while(p->next->next!=NULL&&p->data==p->next->data+p->next-next->data) { p=p->next; } //判断退出循环时p->next->next的值是否为空,不为空证明提前跳出循环 if(p->next->next->data==NULL) { printf("%d",max); return 1; }else{ printf("%d",min); return 0; } }
/** 分为三种情况: 1.链表长度<i:不进行任何操作 2.i+len>链表长度>i:在i处将链表断开 3.链表长度>i,链表长度>i+len:删除后重新连接链表 i的位置分为两种情况: i=1,从首结点开始删除:需考虑l指针修改问题 i不等于1,从中间节点删除:无需考虑 **/ #include <stdlib.h>#include <stdio.h>typedef struct LNode { int data; struct LNode *next; }LNode; //查找指定位置指针 LNode* FindPos(LNode *l,int x) { LNode *p; p=l; int n=1; while(p->next!=NULL) { if(n==x)return p; p=p->next; ++n; } return NULL; } //删除操作 LNode* DelFun(LNode *l,int i,int len) { LNode *p,*n,*m; p=l; int count=0; //统计链表长度 while(p!=NULL) { ++count; p=p->next; } //判断链表是否为空 if(count>0) { if(i>1)//不从首结点开始删 { if(count>i&&count<i+len) { n=FindPos(l,i-1); n->next=NULL; } if(count>i&&count>i+len) { n=FindPos(l,i-1); m=FindPos(l,i+len); n->next=m; } }else{ //从头结点开始删 if(count<=len) l=NULL; if(count>len) { n=FindPos(l,i+len); l=n; } } } return l; } /**用于测试 //创建链表 LNode* create() { LNode *c,*s,*r; c=(LNode*)malloc(sizeof(LNode)); c->next=NULL; c->data=1; r=c; int i; for(i=2;i<=20;++i) { s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=i; r->next=s; r=r->next; } return c; } //打印链表 void printL(LNode *l) { LNode *p; p=l; while(p!
int L=1; void leno(BTNode *p,char x) { if(p!=NULL) { if(p->data==x) cout<<L<<endl; ++L; leno(p->lchild,x); leno(p->rchild,x); --L; } }
/** 算法思想:从一个顶点采用深度优先搜索遍历, 如果能访问到所有结点则该顶点为根。 **/ #define maxSize 100 int visit[maxSize];//标记访问数组 int num=0;//用于统计访问过的节点数 void SearchRoot(AGraph *G) { int i; for(i=0;i<G->n;++i) visit[i]=0;//设置未访问 for(i=0;i<G->n;++i) { DFS(G,i); if(num==G->n) printf("%c",G->adjlist[i].data); for(i=0;i<G->n;++i) visit[i]=0;//设置未访问 num=0; } } void DFS(AGraph G,int v) { ArcNode *p; visit[v]=1; ++num;//用于记录访问过顶点的数量 p=adjlist[v].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0) DFS(G,p->adjvex); p=p->nextarc; } }
#include <stdio.h> int longf(int n,int m) { if(m==0||m>n) return 0; else if(m==1||m==n) return 1; else if (n>m&&m>0) return m+longf(n-1,m)-longf(n-1,m-1); } int main() { int n,m,r; printf("请输入m与n的值:"); scanf("%d,%d",&m,&n); printf("%d",longf(m,n)); }
#include <stdio.h>#define N 3 //返回值1:满足,0:不满足 //注意二维数组必须指定列数 int fun(int a[][N]) { int i,j,s,k; int *p=a; //判断是否有重复数字 for(i=0;i<N*N;i++) { for(j=i+1;j<N*N;j++) if(*(p+i)==*(p+j))return 0; } //判断对角线 s=a[0][0]+a[1][1]+a[2][2]; k=a[2][0]+a[1][1]+a[0][2]; if(s!=k) return 0; //判断行是否满足 for(i=0;i<N;i++) { k=0; for(j=0;j<N;j++) k=k+a[i][j]; if(k!=s) return 0; } //判断列是否满足 for(j=0;j<N;j++) { k=0; for(i=0;i<N;i++) k=k+a[i][j]; if(k!=s) return 0; } return 1; } //用于测试 int main() { int a[3][3]; a[0][0]=2; a[0][1]=9; a[0][2]=4; a[1][0]=7; a[1][1]=5; a[1][2]=3; a[2][0]=6; a[2][1]=1; a[2][2]=8; printf("%d",fun(a)); }
#include <stdio.h>#include <stdlib.h> int main() { char str[50][32];//用于存储从文件中读取的单词 char temp[32];//用于临时存储变量 FILE *in,*out; int i,j,n=0; //判断打开文件是否成功 if((in=fopen(".\\file.txt","r"))==NULL)//文件当前路径 { printf("open error"); exit(-1);//需要 stdlib.h } //读取文件 while(fscanf(in,"%s ",str[n])!=EOF) n++; //关闭文件 fclose(in); //对单词进行排序,采用冒泡法 for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(strcmp(str[j],str[j+1])>0) { strcpy(temp,str[j+1]); strcpy(str[j+1],str[j]); strcpy(str[j],temp); } } } //输出文件 //判断打开文件是否成功 if((out=fopen(".\\file2.txt","w"))==NULL) { printf("open error"); exit(-1);//需要 stdlib.h } for(i=0;i<n;i++) fprintf(out,"%s ",str[i]); fclose(out); }
//本题要求时间最小,辅助空间最小,改自快排 void fun(int a[],int n) { int i=0,j=n-1;//首尾坐标 while(a[i]<0)++i;//找到首个待移动位置 while(a[j]>0)--j;//最后一个待移动位置 temp=a[i]; while(i!=j) { while(j>i&&a[j]>0)--j;//找比0小的位置 if(i<j) { a[i]=a[j]; ++i; } while(i<j&&a[i]<0)++i; if(i<j) { a[j]=a[i]; --j; } } a[i]=temp; } //其他算法,非最优 #include <iostream>#include <stdlib.h> using namespace std; typedef struct Link { int data; struct Link *next; }Link; /** 算法思想: 1.从头至尾扫描链表,找到第一个大于0的结点M 2.继续扫描将小于0的结点插入到M前 **/ void sort(Link *&L) { Link *p,*q,*r,*pre; p=L->next;//带头结点 pre=L; //找到第一个正数 while(p) { if(p->data>0) break; pre=p;//记录前驱结点 p=p->next; } q=pre;//保留M的先前结点 while(p) { if(p->data<0) { r=p; pre->next=p->next;//删除结点 p=p->next; r->next=q->next;//将该结点插入到M前 q->next=r; }else{ pre=p; p=p->next; } } } /** //用于测试 //打印链表 void print_link(Link *l) { Link *p; p=l->next; while(p) { cout<<p->data<<endl; p=p->next; } } int main() { //建立单链表 Link *l,*s,*r; l=(Link *)malloc(sizeof(Link)); l->next=NULL; r=l; s=(Link*)malloc(sizeof(Link)); s->data=-1; s->next=NULL; r->next=s; r=s; s=(Link*)malloc(sizeof(Link)); s->data=1; s->next=NULL; r->next=s; r=s; s=(Link*)malloc(sizeof(Link)); s->data=-1; s->next=NULL; r->next=s; r=s; s=(Link*)malloc(sizeof(Link)); s->data=-5; s->next=NULL; r->next=s; r=s; sort(l); print_link(l); } **/
//获取树高度 int getDepth(BTNode *p) { int ld,rd; if(p->lchild==NULL&&p->rchild==NULL) return 0; else{ ld=getDepth(p->lchild); rd=getDepth(p->rchild); return ld>rd?ld+1:rd+1; } } //找结点获取高度 int get(BTNode *p,int x) { if(p!=NULL) { if(p->data==x) return getPath(p); else{ get(p->lchild,x); get(q->rchild,x); } } }