华科05-03年计算机考研复试机试

 

【1】输入一个数列以0为结束标志,建立链式线性表,查找其中最大的数并输出删除释放节点,然后对剩余的进行排序,并输出释放节点。

参考代码:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. typedef struct LinkNode{//链表结点结构体定义;   
  4.         int data;  
  5.         struct LinkNode *next;    
  6. }LinkNode,*SqList;  
  7.   
  8. void createList(SqList &L){//创建单链表的函数;   
  9.      SqList p=L,q,s;  
  10.      int value;  
  11.      scanf("%d",&value);  
  12.      if(value==0)return;  
  13.      L->data=value;  
  14.      s=NULL;  
  15.      while(1){  
  16.          int v;  
  17.          scanf("%d",&v);  
  18.          if(v==0)  
  19.               return;     
  20.          q=(SqList)malloc(sizeof(LinkNode));  
  21.          q->data=v;  
  22.          q->next=s;  
  23.          p->next=q;  
  24.          p=q;  
  25.      }  
  26.      L=L->next;  
  27. }  
  28.   
  29. void display(SqList L){//输出单链表;  
  30.      SqList p=L;  
  31.      while(p->next!=NULL){  
  32.           printf("%d->",p->data);   
  33.           SqList q=p->next;  
  34.           free(p);//释放结点;   
  35.           p=q;           
  36.      }  
  37.      printf("%d",p->data);   
  38.      free(p);//释放结点;   
  39.      printf("/n");  
  40. }  
  41.   
  42. int getMax(SqList L){//获取最大结点值;   
  43.     int MaxNum=0;  
  44.     SqList p=L;  
  45.     while(p!=NULL){  
  46.         if(p->data>MaxNum)MaxNum=p->data;    
  47.         p=p->next;           
  48.     }  
  49.     return MaxNum;  
  50. }  
  51.   
  52. void freeMax(SqList &L){//释放此链表中值最大的结点;  
  53.        
  54.      if(L!=NULL){   
  55.          SqList p,q;  
  56.          p=L;  
  57.          q=L->next;  
  58.          if(p->data==getMax(L)){  
  59.               free(p);  
  60.               L=q;                    
  61.          }  
  62.          else{  
  63.               while(q!=NULL){  
  64.                    if(q->data==getMax(L)){  
  65.                          p->next=q->next;  
  66.                          free(q);     
  67.                          break;                
  68.                    }  
  69.                    p=q;  
  70.                    q=q->next;                 
  71.               }  
  72.          }  
  73.      }   
  74. }  
  75.   
  76. void sortList(SqList &L){//对链表结点进行排序;   
  77.      SqList p,q;  
  78.      p=L;  
  79.      while(p->next!=NULL){  
  80.           q=p->next;  
  81.           while(q!=NULL){  
  82.                if(p->data>q->data){  
  83.                      int temp;  
  84.                      temp=p->data;  
  85.                      p->data=q->data;  
  86.                      q->data=temp;                
  87.                }    
  88.                q=q->next;         
  89.           }    
  90.           p=p->next;        
  91.      }  
  92. }  
  93.   
  94. int main(){  
  95.     SqList L;  
  96.     L=(SqList)malloc(sizeof(LinkNode));  
  97.     printf("创建链表:/n");  
  98.     createList(L);  
  99.     int maxnumber;   
  100.     maxnumber=getMax(L);  
  101.     printf("链表中结点的最大值:%d/n",maxnumber);  
  102.       
  103.     freeMax(L);  
  104.     printf("释放值最大的结点后的链表:/n");  
  105.     //  
  106.     sortList(L);  
  107.     printf("对剩余结点进行排序后:/n");  
  108.     display(L);  
  109.     //printf("所创建的链表:/n");  
  110.     //display(L);  
  111.     system("pause");  
  112. }  

 

【2】输入一个先序遍历数列以0为结束标志,建立二叉遍历树,并对其进行逆中序遍历,释放空间。

参考代码:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. typedef struct BiTNode{//二叉树数据结构定义;   
  4.     int data;  
  5.     BiTNode *lchild,*rchild;      
  6. }BiTNode,*BiTree;  
  7.   
  8. BiTree CreateTree(){//创建二叉树;   
  9.     int value;  
  10.     BiTree t;  
  11.     scanf("%d",&value);  
  12.     if(value==0)return NULL;  
  13.     else{  
  14.          t=(BiTree)malloc(sizeof(BiTNode));  
  15.          t->data=value;  
  16.          t->lchild=CreateTree();  
  17.          t->rchild=CreateTree();  
  18.          return t;  
  19.     }     
  20. }   
  21.   
  22. void ReInOrder(BiTree t){//逆中序遍历二叉树;   
  23.      if(t!=NULL){  
  24.           ReInOrder(t->rchild);  
  25.           printf("%d ",t->data);  
  26.           ReInOrder(t->lchild);     
  27.           free(t);      
  28.      }  
  29. }  
  30.   
  31. int main(){  
  32.     BiTree t;  
  33.     printf("请按序输入二叉树结点的值(以0为标志结束):/n");  
  34.     t=CreateTree();  
  35.     printf("逆中序遍历二叉树:/n");  
  36.     ReInOrder(t);  
  37.     system("pause");  
  38. }  

数据测试:

华科05-03年计算机考研复试机试_第1张图片

【3】给出年分m和一年中的第n天,算出第n天是几月几号(提示中给出了判断闰年的方法),按 yyyy-mm-dd的格式打印出来;

参考代码:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int ping[12]={31,28,31,30,31,30,31,30,31,30,31,30};  
  4. int run[12]={31,29,31,30,31,30,31,30,31,30,31,30};  
  5. int main(){  
  6.     int m,n,flag,i,day,days;  
  7.     while(scanf("%d %d",&m,&n)!=EOF){  
  8.           if(m%400==0)flag=1;  
  9.           else if(m%4==0&&m%100!=0)flag=1;  
  10.           else flag=0;  
  11.           if(flag==1){//是闰年   
  12.                days=0;  
  13.                for(i=0;i<12;i++){  
  14.                    days+=run[i];  
  15.                    if(days>=n){     
  16.                        break;  
  17.                    }            
  18.                }   
  19.                if(i<12){  
  20.                    days=days-run[i];  
  21.                    day=n-days;  
  22.                    printf("%d-%d-%d/n",m,i+1,day);       
  23.                }    
  24.                else printf("illegal input!/n");      
  25.           }   
  26.           else if(flag==0){//是平年;   
  27.                days=0;  
  28.                for(i=0;i<12;i++){  
  29.                    days+=ping[i];  
  30.                    if(days>=n){     
  31.                        break;  
  32.                    }            
  33.                }   
  34.                if(i<12){  
  35.                    days=days-ping[i];  
  36.                    day=n-days;  
  37.                    printf("%d-%d-%d/n",m,i+1,day);       
  38.                }    
  39.                else printf("illegal input!/n");      
  40.           }           
  41.     }  
  42.     system("pause");  
  43. }  

数据测试:

华科05-03年计算机考研复试机试_第2张图片

 

【4】职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。

代码:

 

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.   
  4. struct node{//职工信息数据结构;   
  5.        int id;//职工号;   
  6.        char name[20];//姓名   
  7.        int age;//年龄;   
  8. }emp[1000];  
  9.   
  10. int cmp(const void *a,const void *b){//比较函数;   
  11.     return (*(struct node *)a).age-(*(struct node *)b).age;  
  12. }  
  13.   
  14. int main(){  
  15.     int n,i;  
  16.     printf("请输入职工数及其各职工的职工号、姓名、年龄:/n");  
  17.     scanf("%d",&n);  
  18.     for(i=0;i<n;i++){  
  19.           scanf("%d %s %d",&emp[i].id,emp[i].name,&emp[i].age);             
  20.     }  
  21.     qsort(emp,n,sizeof(node),cmp);  
  22.     printf("年龄最小的三位职工是:/n");  
  23.     for(i=0;i<3;i++){  
  24.            printf("%d %s %d/n",emp[i].id,emp[i].name,emp[i].age);            
  25.     }  
  26. }  

数据测试:

华科05-03年计算机考研复试机试_第3张图片

 

 

【5】n个人排一圈123报数,报到3的人退到圈外,直到剩最后一个人为止。

代码:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. typedef struct node{//链表结点数据结构定义;   
  4.        int data;  
  5.        struct node *next;  
  6. }LNode,*LinkList;  
  7.   
  8. void Josephus(int n,int k,int m){//约瑟夫环问题;n:人数,k:开始计数位置,m:数到几退出一个人;   
  9.      LinkList p,q,r;//p指向表头;   
  10.      int i,cnt;  
  11.      p=(LinkList)malloc(sizeof(LNode));  
  12.      p->data=1;  
  13.      p->next=NULL;  
  14.      q=p;  
  15.      for(i=2;i<=n;i++){//创建单循环链表;   
  16.           r=(LinkList)malloc(sizeof(LNode));  
  17.           r->data=i;  
  18.           r->next=NULL;  
  19.           q->next=r;  
  20.           q=q->next;               
  21.      }  
  22.      q->next=p;  
  23.      for(i=1;i<k;i++){  
  24.          q=p;//q始终指向前驱;   
  25.          p=p->next; //p移到开始的结点;              
  26.      }  
  27.      cnt=1;  
  28.      while(q->next!=q){  
  29.           cnt++;  
  30.           q=p;  
  31.           p=p->next;  
  32.           if(cnt%m==0){//将要退出一个人;   
  33.                 printf("%d ",p->data);  
  34.                 q->next=p->next;  
  35.                 p=p->next;  
  36.                 cnt++;         
  37.           }            
  38.      }  
  39.      printf("%d/n",q->data);  
  40. }  
  41.   
  42. int main(){  
  43.     int n,k;  
  44.     printf("请输入人数n、从谁开始数k:/n");  
  45.     scanf("%d %d",&n,&k);  
  46.     Josephus(n,k,3);  
  47.     system("pause");  
  48. }  

数据测试:

 

华科05-03年计算机考研复试机试_第4张图片

【7】建立二叉树,并中序遍历。

代码:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. typedef struct node{  
  4.      int data;  
  5.      node *lchild,*rchild;     
  6. }BTNode,*BiTree;  
  7.   
  8. BiTree createBiTree(){//创建二叉树;   
  9.      int value;  
  10.      BiTree T;  
  11.      T=(BiTree)malloc(sizeof(BTNode));  
  12.      scanf("%d",&value);  
  13.      if(value!=0){  
  14.           T->data=value;  
  15.           T->lchild=createBiTree();  
  16.           T->rchild=createBiTree();   
  17.           return T;        
  18.      }  
  19.      else{  
  20.           return NULL;  
  21.      }  
  22. }  
  23.   
  24. void InOrderTraverse(BiTree T){//中序遍历二叉树;   
  25.      if(T!=NULL){    
  26.            InOrderTraverse(T->lchild);  
  27.            printf("%d ",T->data);     
  28.            InOrderTraverse(T->rchild);  
  29.            free(T);  
  30.      }                    
  31. }  
  32.   
  33. int main(){  
  34.     BiTree T=createBiTree();  
  35.     InOrderTraverse(T);  
  36.     system("pause");  
  37. }  

 

数据测试:

华科05-03年计算机考研复试机试_第5张图片

 

 

 

 

 【8】生成一个长度为21的数组,依次存入121;建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每个结点中;将上述链表变为单向封闭(循环)链表;从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。
分三个文件,一个main; 一个.h; 一个.c 文件

参考代码:

count21.h文件:

view plain print ?
  1. #ifndef COUNT_21_H_INCLUDED  
  2. #define COUNT_21_H_INCLUDED  
  3. #define NUM 21//链表节点数;   
  4. typedef struct node{//链表结点数据结构定义;   
  5.      int data;  
  6.      struct node *next;     
  7. }LNode,*LinkList;  
  8.   
  9. LinkList CreateList();//创建单循环链表;    
  10. #endif  

count21.c文件:

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include"Count21.h"  
  4. LinkList CreateList(){//建立单循环链表;   
  5.       LinkList L,p,q;  
  6.       int i;  
  7.       L=(LinkList)malloc(sizeof(LNode));  
  8.       p=L;  
  9.       L->data=1;  
  10.       L->next=NULL;  
  11.       for(i=2;i<=NUM;i++){  
  12.            q=(LinkList)malloc(sizeof(LNode));  
  13.            q->data=i;  
  14.            q->next=NULL;  
  15.            p->next=q;  
  16.            p=p->next;                 
  17.       }  
  18.       p->next=L;//构成循环链表;  
  19.       return L;     
  20. }  

main.c文件:

 

view plain print ?
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include"Count21.h"  
  4. int main(){  
  5.     LinkList L,p,q;  
  6.     L=CreateList();  
  7.     p=L;//p指向当前节点;  
  8.     q=L;   
  9.     while(q->next!=L){  
  10.           q=q->next;              
  11.     }//q指向前驱;   
  12.     int cnt=1;  
  13.     while(q->next!=q){  
  14.          cnt++;  
  15.          q=p;  
  16.          p=p->next;               
  17.          if(cnt%17==0){  
  18.               printf("%d ",p->data);  
  19.               q->next=p->next;  
  20.               p=p->next;  
  21.               cnt++;           
  22.          }  
  23.     }  
  24.     printf("%d/n",p->data);  
  25.     system("pause");  
  26. }  

数据测试:

华科05-03年计算机考研复试机试_第6张图片

你可能感兴趣的:(华科05-03年计算机考研复试机试)