2001-c-五

int similar(BTNode *n1,BTNode *n2) { if((n1==NULL)&&(n2==NULL))//都为空 return 1;//相似 else//有一个不空,或都不空 { if((n1==NULL)||(n2==NULL))//有一个不空 return 0; else return similar(n1->lchild,n2->lchild)&&similar(n1->rchild,n2->rchild);//继续判断 } }

2000-d-五

//此算法特别巧妙,此处只为精华版,完整部分链接 http://blog.csdn.net/arcsinsin/article/details/10238505 btree * DeleteBST(btree *b, ElemType x) { if (b) { if (b->data == x) b = DelNode(b); else if (b->data > x) //注意此处的b->lchild、b->rchild 无此句,会出现删除后断链情况 b->lchild = DeleteBST(b->lchild, x); else b->rchild = DeleteBST(b->rchild, x); } return b; } //删除结点,准确的说是调整数值,删除无用结点 btree * DelNode(btree *p) { if (p->lchild) { btree *r = p->lchild; //r指向其左子树; btree *prer = p->lchild; //prer指向其左子树; while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r { prer = r; r = r->rchild; } p->data = r->data; if(prer !

1999-c-五

#include <stdio.h>#define maxSize 100 /** 打开方式"wb"(二进制文件)无法换行 "w"可以换行 "wb+"可读可写 **/ int main() { FILE *fin; char name[maxSize]; char age[maxSize]; char sex[maxSize]; char depart[maxSize]; char salary[maxSize]; if((fin=fopen("file.txt","wb+"))==NULL) printf("open error"); else { fprintf(fin,"%20s","王教授"); fprintf(fin,"%20s","45"); fprintf(fin,"%20s","男"); fprintf(fin,"%20s","计算机"); fprintf(fin,"%20s","80000"); fseek(fin,-20L,SEEK_END); fscanf(fin,"%20s",salary); printf("%s\n",salary); fseek(fin,-40L,SEEK_END); fscanf(fin,"%20s",depart); printf("%s\n",depart); fseek(fin,-60L,SEEK_END); fscanf(fin,"%20s",sex); printf("%s\n",sex); fseek(fin,-80L,SEEK_END); fscanf(fin,"%20s",age); printf("%s\n",age); fseek(fin,-100L,SEEK_END); fscanf(fin,"%20s",name); printf("%s\n",name); } }

2000-c-7

void merge(int arg1[],int n,int arg2[],int m) { int arg3[maxSize]; int i=0,j=0,k=0,l=0; while(i<n&&j<m) { if(arg1[i]<arg2[j]) arg3[k++]=arg1[i++]; if(arg1[i]>arg2[j]) arg3[k++]=arg2[j++]; } if(i<n) while(i<n) arg3[k++]=arg1[i++]; if(j<m) while(j<m) arg3[k++]=arg2[j++]; while(l<k)//复制到arg1中 { arg1[l]=arg3[l]; ++l; } }

1999-c-六

//将指针转化为数组形式进行操作 #include <stdio.h> char *RRSindex (char *str,char *substr) { int i=0;//主串工作指针 int j=0;//子串工作指针 int k=0;//每次开始比较位置 int p=0;//最后一个位置 for(i=0;str[i]!='\0';i++) { k=i;//记录本次比较开始位置 j=0;//每次子串从头开始 while((str[i]!='\0')&&(substr[j]!='\0')&&(str[i]==substr[j])) { i++; j++; } if(substr[j]=='\0')//匹配 { p=k; } } //printf("%d",p); return &str[p]; } int main() { char str[100]="xxx123xxx123xx"; char substr[100]="123"; RRSindex(str,substr); }

1999-c-四

#include <stdio.h> typedef struct student { float grade; struct student *next; } student; struct student *SortLink(struct student *head) { struct student *pre,*p,*pre_m,*m,*n; float min;//最小值 n=NULL;//将指针变为空,用于区别是否为首次插入 while(head->next!=NULL) { pre=head; p=head->next;//工作指针 m=p; pre_m=pre; min=p->grade;//最小值信息初始化 while(p!=NULL) { if(p->grade<min) { min=p->grade; m=p;//保留当前次最小值地址 pre_m=pre; } p=p->next; pre=pre->next; } pre_m->next=m->next;//将最小值结点从当前链表移除 if(n==NULL)//第一个结点 { n=m; } else { m->next=n; n=m;//采用头插法 } } return n; }

1998-c-三

/* 算法思想:打开文件、按格式读入文件、 统计歌名以及演唱者的字符长度、重新拼接写入新文件 */ #include <stdio.h>#define N 10 #define M 3 #define maxSize 100 int main() { FILE *fin,*fout;//定义读入指针以及写指针 char song[maxSize]; char singer[maxSize]; int len1,len2; char str1[maxSize]; char str2[maxSize]; char str3[maxSize]; if((fout=fopen("NewSong.txt","w"))==NULL)//打开失败 printf("open out error"); if((fin=fopen("song.txt","r"))==NULL)//打开失败 printf("open in error\n"); else//打开成功 { while(!feof(fin)) { // fscanf(fin,"%Ns%Ms",song,singer);//此处无法使用宏常量,具体原因不明 fscanf(fin,"%10s%3s",song,singer); fprintf(fout,"%d",strlen(song)); fprintf(fout,"%d",strlen(singer)); fprintf(fout,"%s",song); fprintf(fout,"%s",singer); } fclose(fin); fclose(fout); } }

1996-c-三

#include <stdio.h>#define maxSize 100 int main() { int i=1,j,k,l,d;//循环变量 int n;//平方数 int m=0;//数组下标 int arr[maxSize];//存储平方数集合 int num[10];//暂存数组 int flag=0;//标记 while(1)//生成三位平方数 { n=i*i; if(n>99&&n<1000) arr[++m]=n;//数组下标从1开始 if(n>1000) break; i++; } for(i=1;i<=m;i++)//判断构成三组数不重复 { num[1]= arr[i] / 1 % 10; num[2]= arr[i] / 10 % 10; num[3]= arr[i] / 100 % 10; for(j=i+1;j<=m;j++) { num[4]= arr[j] / 1 % 10; num[5]= arr[j] / 10 % 10; num[6]= arr[j] / 100 % 10; for(k=j+1;k<=m;k++) { num[7]= arr[k] / 1 % 10; num[8]= arr[k] / 10 % 10; num[9]= arr[k] / 100 % 10; flag=0;//重复标记初始化,每次都需初始化 //判断是否重复 for(l=1;l<=9;l++) { for(d=l+1;d<=9;d++) { if(num[l]==num[d]) flag=1; } } if(flag==0) //如果不重复 { printf("%d %d %d\n",arr[i],arr[j],arr[k]); } } } } }

2006-d-四

/** 本题有各种答案,无论是学姐的还是红皮书都是错误的。 正确思想在于采用拓扑排序,也是本题考点。深度优先搜索等无法解决。 **/ typedef struct VNode { char data; int no; int count; ArcNode *firstarc; }VNode;//重新定义邻接表表头结点 int TopSort(AGraph *G) { int i,j ,n=0; int stack[maxSize],top=-1;//定义并初始化栈 ArcNode *p; for(i=1;i<G->n;++i) { if(G->adjlist[i].count==0) stack[++top]=i; } while(top!=-1) { i=stack[top--]; ++n;//计数器加1 G->adjlist[i].no=n;//将整形序号赋值给结点 p=G->adjlist[i].firstarc; while(p!=NULL) { j=p->adjvex; --(G->adjlist[j].count); if(G->adjlist[j].count==0) stack[++top]=j; p=p->nextarc; } } if(n==G->n) return 1; else return 0; }