东北大学842考研

2014-d-二-3

// 未确认 int visit[maxSize]; int stack[maxSize]; int j=0; int u,pre;//第二个结点、用于指向出栈前的结点 int len; void dfs(AGraph *G,int v) { ArcNode *p;//边结点 visit[v]=1;//标记访问 stack[++j]=v;//新访问结点入栈 if(v==u)//找到一条联通路径 { if(j-1==len)//判断路径长度是否符合规定 { //输出路径 } visit[v]=0; pre=v; --j;//u顶点先出栈 for(k=j;k>0;k--) { p=G->adjlist[stack[k]].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0&&p-adjvex!=pre) { dfs(G,p->adjvex); } p=p->next; } } } p=G->adjlist[v].firstarc; while(p!=NULL) { if(visit[p->adjvex]==0) { dfs(G,p->adjvex); } p=p->next; } }

2014-c-三-2

#include <stdio.h>#define maxSize 100 int main() { char str[maxSize];//字符串 char *p;//字符指针 int b=0,s=0;//定义大小写数量 p=str; scanf("%s",str); //统计个数注意等号 while(*p!='\0') { if(*p>='A'&&*p<='Z') ++b; if(*p>='a'&&*p<='z') ++s; p++; } printf("小写字符个数%d\n",s); printf("大写字符个数%d\n",b); p--;//此时指针在\0位置,前移一个位置 while(p>=str) { if(*p>='A'&&*p<='Z') { printf("%c",*p); } p--; } }

2014-c-三-3

//改进算法 void fun(int a[][maxSize],int row,int col) { int i,j,k,min,min_j,flag; for (i=0;i<row;++i) { min=a[i][0]; min_j=0; for (j=0;j<col;++j)//找行最小值 { if(a[i][j]<min_j) { min=a[i][j]; //记录本行最小值 min_j=j; //记录最小数列标 } } flag=1; //判断最小数在列上是否为最大值 for (k=0;k<row;++k) { if(min<a[k][min_j])//如果有一个数比行最小值大证明不是鞍点 { flag=0; break; } } if(flag) { printf("鞍点坐标:%d,%d且值为:",i,min_j,min); break; } } } //此算法过于复杂,不需要记录最大行坐标数组,改进算法的行最小列最大与此相反,原理相同 #include #include#define maxSize 100 /** 算法思想: 找到每一行的最大值,用数组记录此时最大值坐标 根据坐标循环判断是否为此列的最小值 **/ int main() { //构造数据 int m,n; scanf("%d,%d",&m,&n); int p[maxSize][maxSize]; int i,j,k; int h_max[maxSize]; //行最大值数组 for (i=0;i<m;i++) { for (j=0;j<n;j++) { printf("请输入%d行%d列:\n",i,j); scanf("%d",&p[i][j]); } } for (i=0;i<m;i++) { for (j=0;j<n;j++) printf("%d\t",p[i][j]); printf("\n"); } //查找行最大值元素,将最大值的列坐标记录下来 for (i=0;i<m;i++) { h_max[i]=0; //先取第i行第0列为最大值 for (j=0;j<n;j++) { if(p[i][j]>p[i][h_max[i]]) { h_max[i]=j; //记录行最大值的列坐标 } } printf("第%d行最大值为第%d列\n",i, h_max[i]); } //判断行最大值是否为列最小值 for (i=0;i<m;i++) { int t = h_max[i]; int v_min = p[i][t]; int flag; for (k=0;k<m;k++) { if(p[k][t]>=v_min)//注意要有等号!!! flag=1; else { flag=0; break; //不是最小值立即跳出循环 } } if(flag==1) printf("满足条件的是%d行%d列元素,值为%d\n",i,t,v_min); } }

2015-d-二-1

/** 算法思想:如果有序有两种情况1.递增2.递减,注意有相邻相等情况 从前之后两两比较相邻节点差值 **/ #include <stdio.h>#include <stdlib.h>//链表结构体 typedef struct lNode { int data; struct LNode *next; }LNode; // 返回值0:无序 1:有序 // init 、flag 0:两个值相等 1:递增 -1:递减 int isOrder(LNode *l) { LNode *p,*q; int flag,init;//init为第一个结点标记 flag为循环中标记 p=l;//p指向开始结点 q=p->next;//q指向p的下一个结点 while(p->data==q->data&&q->next!=NULL)//恰好两个比较的值相等 { p=p->next; q=p->next; } if(p->data>q->data) init=-1;//递减 else if (p->data<q->data) init=1;//递增 else { init=0;//从头至尾都相等 return 1; } while(q) { if(p->data>q->data) flag=-1;//递减 else if (p->data<q->data) flag=1;//递增 else flag=0;//说明此时链表中元素均相等 if(flag+init==0) return 0;//无序 p=p->next; q=q->next; } return 1; } //链表建立,测试数据 LNode* create() { LNode *c,*s,*r; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=6; r=s; c=s; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=6; r->next=s; r=r->next; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=5; r->next=s; r=r->next; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=4; r->next=s; r=r->next; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=1; r->next=s; r=r->next; s=(LNode*)malloc(sizeof(LNode)); s->next=NULL; s->data=1; r->next=s; r=r->next; return c; } int main() { LNode *l = create();; printf("%d",isOrder(l)); }

2015-d-二-2

//天勤p141原题 typedef struct { BTNode *p; int lno; }st; int maxNode(BTNode *b) { //新队列初始化 st que[maxSize]; int front,rear; front=rear=0; //辅助变量 int lno,i,j,n=0,max=0; BTNode *q; if(b!=NULL) { ++rear; que[rear].p=b; que[rear].lno=1; while(front!=rear) { ++front; q=que[front].p; lno=que[front].lno; if(q->lchild!=NULL) { ++rear; que[rear].p=q->lchild; que[rear].lno=lno+1; } if(q->rchild!=NULL) { ++rear; que[rear].p=q->rchild; que[rear].lno=lno+1; } } for(i=1;i<=lno;i++) { for(j=1;j<=rear;++j) if(que[j].lno==i) ++n; if(max<n) max=n; } return max; } return 0; }

2015-d-二-3

/** 算法思想: 采用迪杰斯特拉算法,找出v0到其余各个节点的最小路径。 遍历输出最小路径为k的节点 **/ // 邻接矩阵 typedef struct Graph { char vexs[MAX]; // 顶点集合 int vexnum; // 顶点数 int edgnum; // 边数 int matrix[MAX][MAX]; // 邻接矩阵 }Graph; /* * 参数说明: * G -- 图 * vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。 * prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。 * dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。 */ void dijkstra(Graph G, int vs, int prev[], int dist[]) { int i,j,k; int min; int tmp; int flag[MAX]; // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。 // 初始化 for (i = 0; i < G.

2015-c-二-1

#include <stdio.h>//功能函数 int total(int n) { if(n==1) return 1; else{ return total(n-1)+n+1; } } //主函数 int main() { int n; scanf("%d",&n); printf("%d",total(n)); }

2015-c-二-2

#include <stdio.h>typedef struct Date { int year; int month; int day; }Date; int calculate(Date d) { int n=0; switch(d.month-1) { case 11:n+=30; case 10:n+=31; case 9:n+=30; case 8:n+=31; case 7:n+=31; case 6:n+=30; case 5:n+=31; case 4:n+=30; case 3:n+=31; case 2:n+=28; case 1:n+=31; } return n; } int main() { int year,month,day,num; Date d; //输入数据 printf("按格式输入:年,月,日\n"); scanf("%d,%d,%d",&year,&month,&day); //向结构体传数据 d.year=year; d.month=month; d.day=day; //计算天数不考虑是否闰年 num = calculate(d)+day; //判断是否是闰年 if((year%4==0&&year%100!=0)||year%400==0) { //判断月份是否大于2 if(month>2) num=num+1; } printf("%d月%d日是%d年的第%d天\n",month,day,year,num); }

2015-c-二-3

#include <stdio.h>#define maxSize 100 //字符串复制函数 str_copy(char *str,char *kid,int k) { char *p;//原始字符串指针 char *q;//新字符串指针 p=str+k-1;//指向第k个字符 q=kid; while(*p!='\0') { *q=*p; q++; p++; } *q='\0'; } //主函数 int main() { char str[maxSize]; char kid[maxSize]; int k; scanf("%s",str); scanf("%d",&k); str_copy(str,kid,k);//调用复制函数 printf("%s\n",str); printf("%s\n",kid); }