2017年电子科技大学820计算机复试自己编写C复试答案

1、单链表逆序(考频:5次)——不用输入就在函数内生成

函数内生成数据如下:
Head=malloc(sizeof(struct LNode));
Head->next=NULL;
For(i=5;i>=0;i--)
{
P=malloc(sizeof(struct LNode));
P->val=i;
P->next=head->next;
Head->next=p;//头插法建立数据
}

#include <stdio.h>
#include<malloc.h>
struct LNode
{
    int val;
    struct LNode *next;
}LNode[5]={{1,NULL},{2,NULL},{3,NULL},{4,NULL},{5,NULL}};
//建立单链表
void reverse(struct LNode *Head)
{
    struct LNode *p,*q;
    p=Head->next;
    Head->next=NULL;
    while(p)//注意这里,重点在这里!
    {
        q=p->next;
        p->next=Head->next;
        Head->next=p;
        p=q;
    }
    p=Head->next;
    while(p)
    {
        
        printf("%-4d",p->val);
        p=p->next;
        
    }
    printf("\n");
    
}
void main()
{
    int i,e,n;
    struct LNode *p,*Head,*q;
    Head=(struct LNode *)malloc(sizeof(struct LNode));
    p=Head;
    printf("输入建立单链表所需的整数个数:");
    scanf("%d",&n);
    printf("输入%d个数据,以回车键隔开:\n",n);
    for(i=0;i<n;i++)
    {
        q=(struct LNode *)malloc(sizeof(struct LNode));
        scanf("%d",&e);
        q->val=e;
        p->next=q;
        p=q;
    }
    p->next=NULL;//至关重要的一步!!!
    p=Head->next;
    printf("建立单链表的结果如下\n");
    while(p)
    {
        
        printf("%-4d",p->val);
        p=p->next;
        
    }
    printf("\n");
/*    for(i=0;i<5;i++)
    {
        printf("%-7d",LNode[i].val);
    }
    printf("\n");
    */
    printf("单链表逆序结果如下:\n");
    reverse(Head);
}
2、计算1-x+x^2/2!-x^3/3!+...+x^n/n!,x是单浮点数,n是整数(考频:3次)
#include <stdio.h>
void main()
{    
    
    int j,n,flag=-1;
    float x,sum1=1,sum2=1,sum=1;
    printf("请输入求和用到的x和n,用英文逗号隔开\n");
    scanf("%f,%d",&x,&n);
    if(n==0)//等于和赋值弄错了!!!
    {
        printf("求和的值为1.0\n");
        return;
    }
    
    for(j=1;j<=n;j++)
    {
        
        sum1*=x;
        sum2*=j;
        sum+=flag*(sum1/sum2);
        flag=-flag;
    }
    printf("求和的值=%f\n\n",sum);

}
3、数质因数分解(考频:2次)
#include<stdio.h>
#define N 20
int isPrime(int n)
{
    int i=2;
    while(n%i!=0)
        i++;
    if(i==n)
        return 1;
    else
        return 0;
}
void main()
{
    int num,i,a[N],j=-1;
    printf("请输入需要分解的正整数:\n");
    scanf("%d",&num);
    printf("%d=",num);
    if(num<=0)
    {
        printf("输入数据错误!请重新输入!\n");
        return;
    }
    while(num>=4)
    {
    for(i=2;i<=num;i++)
    {
        if(num%i==0&&isPrime(i))
        {
            a[++j]=i;
            num/=i;
            break;
        }
    }
    }
    if(num>1)
    {
    a[++j]=num;
    }
    for(i=0;i<=j;i++)
    {
        printf("%d",a[i]);
        if(i<j)
            printf("*");
    }
    printf("\n");
}
4、字符串逆序,不申请新的数组空间
#include <stdio.h>
#include <string.h>
#define N 100
void reverse(char str[])
{
    int len,i;
    char temp;
    len=strlen(str);
    for(i=0;i<(len/2);i++)//次数这里出错,相当于没有交换
    {
        temp=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=temp;
    }
//    str[i]='\0';        结束符一直在

}

void main()
{
    char    str[N],*res;
    printf("请输入字符串:\n");
    scanf("%s",str);
    reverse(str);
    printf("逆序的结果如下:\n%s\n",str);
}
5、file1的内容全部复制到file2中,且在file2的每一行都要加上行号,最后返回file1中的字符个数。
#include <stdio.h>
#include <stdlib.h>
/*
void main()
{
    FILE *fp1,*fp2;
    fp1=fopen("c:\\1.txt","r");//重要,不存在不会创建新文件!!!
    if(fp1!=NULL)
        printf("成功打开\n");
}
*/

/*
#define MAX 1000
void main()
{
    FILE *fp1,*fp2;
    char c='\n';
    fp1=fopen("1.txt","r");
    fp2=fopen("2.txt","w");

    while(!feof(fp1))
    {
        char       temp[MAX];
        fgets(temp,MAX,fp1);//每次都读到换行符结束,换行符算一位,字符串最后面一定是'\0',有换行符则加在'\0'前面,'\n'==10==换行符
        fputs(temp,fp2);
    }
    fclose(fp1);
    fclose(fp2);
    
}*/


void main()
{
    FILE *fp1,*fp2;
    char temp;
    int  counts=0,row=1;
    fp1=fopen("file1.txt","r");
    fp2=fopen("file2.txt","w+");

    while(!feof(fp1))
    {
        temp=fgetc(fp1);
        if(temp!=32&&temp!='\n'&&temp!=EOF)//32代表'',10代表'\n'
        {
            ++counts;
        }        
        if(temp!='\n')
        {
            fputc(temp,fp2);        

        }
        else
        {
            fprintf(fp2,"    行号为:%d",row++);
            fprintf(fp2,"\n");
        }
            
    }
    fprintf(fp2,"    行号为:%d",row);
    fclose(fp1);
    fclose(fp2);
    printf("file1.doc文件中的字符总数为:%d\n",counts);
}

5、分数四则运算
#include<stdio.h>
long gcd(long m,long n)
{
    while(n)
    {
        long t=m%n;
        m=n;
        n=t;
    }
    return m;
}
void count(char flag,long up1,long up2,long down1,long down2)
{
    long t;
    switch(flag)
    {
        case '+':
            up1=up1*down2+up2*down1;
            down1=down1*down2;
        break;
        case '-':
            up1=up1*down2-up2*down1;
            down1=down1*down2;
        break;
        case '*':
            up1=up1*up2;
            down1=down1*down2;
        break;
        case '/':
            up1=up1*down2;
            down2=down1*up2;
        break;
    }
    t=gcd(up1,down1);
    if(up1==down1)
        printf("1\n");
    else
        printf("%d/%d\n",up1/t,down1/t);
}
int main()
{
    long up1,up2,down1,down2;
    char flag;
    printf("请输入两个正分数\n");
    while(~scanf("%ld/%ld%c%ld/%ld",&up1,&down1,&flag,&up2,&down2))
    {
        count(flag,up1,up2,down1,down2);
    }
    return 0;
}

7、编写一个函数,使之能完成以下功能:利用递归方法找出一个数组中的最大值和最小值,要求递归调用函数的格式如下:
MinMaxValue(arr,n,&max,&min),其中arr是给定的数组,n是数组的个数,max、min分别是最大值和最小值。
#include "stdio.h"
#define N 10

void MinMaxValue(int arr[],int n,int *max,int *min)
{
    if(n>=0)
     {
         if(*max<arr[n]) 
            *max=arr[n];

        if(*min>arr[n]) 
            *min=arr[n];

        MinMaxValue(arr,n-1,max,min);
     }
}

int main()
{
    int max=-32768,min=32767;
    int a[]={1,54,23,65,87,12,54,87,98,233};
    MinMaxValue(a,N-1,&max,&min);
    printf("Max=%d,Min=%d\n",max,min);
    return 0;
}

8、编写一个完整的程序,使之能完成以下功能:一段名为file.c的程序,该程序中含有括号,现要检查程序中的括号是否配对,提示:利用堆栈实现。(15分)
#include <stdio.h>
#define Stack char
#define Max 999
int judge(char p[])
{
    int len=strlen(p);
    int top=-1,i;
    Stack s[Max];
    for(i=0;i<len;i++)
    {
        switch(p[i])
        {
            case '(':
            case '[':
            case '{':
                s[++top]=p[i];//只要是左括号就放进去
                break;
            case ')':
                if(s[top]=='(')
                    top--;
                else return 0;
                break;
            case ']':
                if(s[top]=='[')
                    top--;
                else return 0;
                break;
            case '}':
                if(s[top]=='{')
                    top--;
                else return 0;
                break;
        }
    }
    if(top==-1)
        return 1;
    else
        return 0;
}
void main()
{
    char p[Max];
    FILE * fin;
    if(!(fin=fopen("file.txt","r")))
        printf("failed");
    while(!feof(fin))
    {
        fscanf(fin,"%s",p);
    }
    printf("%d\n",judge(p));
    fclose(fin);
}

9、统计字符串中的数字字符次数,字符串仅由数字字符构成
#include<stdio.h>

void main()
{
    char temp[50];
    char *str;
    int i,counts[10]={0};
    printf("请输入长度不超过50的字符串(只含有数字字符):\n");
    str=temp;
    scanf("%s",str);
    for(i=0;i<50;i++)
    {
        counts[str[i]-'0']++;
    
    }
    for(i=0;i<10;i++)
    printf("数字%d出现的次数--------%d\n",i,counts[i]);
}

10、利用结构数组和指向结构的指针,输出学生最低、最高成绩以及相应的学号(若有相同的分数,要输出多个学号)
#include <stdio.h>
#define N 10

struct student
{
int num;
int score;
}student_info[100],*pS;

void main()
{
int        i,max,min;    
printf("请输入学生学号和成绩,以逗号进行隔开\n");
for(i=0;i<N;i++)
{
    scanf("%d,%d",&(student_info[i].num),&(student_info[i].score));
}

max=min=student_info[0].score;
pS=student_info+1;
for(i=1;i<N;i++,++pS)
{
    if(pS->score>max)
        max=pS->score;
    if(pS->score<min)
        min=pS->score;
}
//printf("最高分为%d,最低分为%d\n",max,min);
pS=student_info;
for(i=0;i<N;i++,++pS)
{
    if(pS->score==max)//又把等号弄错了
    
        printf("最高分为%d,学号为%d\n",pS->score,pS->num);
    
}
pS=student_info;
for(i=0;i<N;i++,++pS)
{
    if(pS->score==min)
    
        printf("最低分为%d,学号为%d\n",pS->score,pS->num);    
}


}
11、删除输入的字符串中的大小写字母和数字,并统计有重复的字符及其重复次数
#include <stdio.h>
#include <string.h>

struct charInfo{
char  val;
int      count;
}strInfo[100];


int delChar(char * str,char c)
{
    int i=0,count=0;
//    len=strlen(str);不算结束符
    while(str[i]!='\0')
    {
    if(str[i]==c)
    {
        memcpy(&str[i],&str[i+1],strlen(&str[i+1])+1);
        ++count;
    }
    else
        ++i;
    }
    return count;
    
}

void main()
{
    char * str,temp[1000];
    int i;
    str=temp;
    for(i=0;i<10;i++)
    {
        strInfo[i].val='0'+i;
        strInfo[i].count=0;
    }
    for(i=0;i<26;i++)
    {
        strInfo[i+10].val='A'+i;
        strInfo[i].count=0;
    }
    for(i=0;i<26;i++)
    {
        strInfo[i+36].val='a'+i;
        strInfo[i].count=0;
    }
    scanf("%s",str);//str本来就是地址
    for(i=0;i<62;i++)
    {
        strInfo[i].count=delChar(str,strInfo[i].val);    
    }
    printf("\n\nresult=%s\n\n\n",str);
    for(i=0;i<62;i++)
    {
        printf("%c出现次数%d\n",strInfo[i].val,strInfo[i].count);
    }
    printf("\n\n");
}
12、小括号匹配
#include <stdio.h>
#define MAX 100
typedef int BOOL;//注意这个分号,bool是c++独有的
#define true 1
#define false 0
BOOL IsPair(FILE *fp)
{
    char    STACK[MAX],temp;
    int        top=-1;

    while(!feof(fp))
    {
        temp=fgetc(fp);
        if(temp=='(')
            STACK[++top]=temp;
        if(temp==')')
        {
            if(STACK[top]=='(')
                --top;
            else
                return    false;
        }
            

    }
    if(top==-1)
        return true;
    else
        return false;

}

void    main()
{
    FILE    *fp;
    fp=fopen("file.txt","r");
    if(IsPair(fp))
        printf("配对成功!\n");
    else
        printf("配对失败!\n");


}
13、身份证生日大小比较
#include <stdio.h>
int cmpBirth(char *st1,char *st2)
{
    int i;
    for(i=0;i<8;i++)
    {
        if(*st1&&*st2&&(*st1==*st2))
        {
            ++st1;
            ++st2;
        }
        else     if(*st1-*st2>0)
                    return 1;
        else 
                    return 0;
        
    }

}
void main()
{
    char str1[20],str2[20];
    char *st1,*st2;
    printf("请输入要进行对比的两个身份证号码,以回车键进行隔开\n");
    scanf("%s",str1);
    scanf("%s",str2);
    if(cmpBirth(str1+6,str2+6))
        printf("第二个人年龄更大一些\n");
    else
        printf("第一个人年龄更大一些\n");
    

}

简洁版答案
int isbothsame(char str1[19], char str2[19])
{
    int low = 6, hight = 13;
    while (low<hight && str1[low] == str2[low])low++;
    return str1[low] - str2[low];
}

14、移动链表最大结点至尾部
#include <stdio.h>
#include <malloc.h>
struct LNode
{
    int data;
    struct LNode * next;
};

struct LNode * CreateLinklist()
{
    struct LNode *p,*Head,*q;
    int    n,i;
    Head=(struct LNode *)malloc(sizeof(struct LNode));
    Head->next=NULL;
    printf("请输入链表结点个数\n");
    scanf("%d",&n);
    q=Head;
    printf("输入数据\n");
    for(i=0;i<n;i++)
    {
        
        p=(struct LNode *)malloc(sizeof(struct LNode));
        scanf("%d",&(p->data));
        q->next=p;
        q=p;
    }
    q->next=NULL;
    printf("输入的链表如下所示\n");
    p=Head->next;
    while(p)
    {
        printf("%-4d",p->data);
        p=p->next;
    }
    return Head;
}
void LNodeFind(struct LNode * Linklist)
{
    struct LNode *p=Linklist->next,*q,*r;
    int        max=p->data,counts=0,flag=1;
    p=p->next;
    while(p)
    {
        if(p->data>=max)
        {
            max=p->data;
            ++counts;
        }
        p=p->next;
    }

    while(counts)
    {
        p=Linklist->next;
        q=Linklist;
        flag=1;//利用flag控制不再寻找最大值结点
        --counts;
        while(p)
        {
            
            if(p->next==NULL)
            {    
                p->next=r;
                p=r;
                p->next=NULL;
            }
            else if(p->data==max&&flag)
            {
                r=p;
                q->next=p->next;                flag=0;
            }
            q=p;
            p=p->next;
        }    
    }

}
void LNodeFind_1(struct LNode *Head)//first one out
{
    struct LNode *p,*q,*r;
    p=q=Head;
    while(p->next!=NULL)
    {
        if(q->next->data<p->next->data)
            q=p;
        p=p->next;
    }
    if(q->next!=p)
    {
        r=q->next;
        q->next=r->next;
        p->next=r;
        p=r;
        p->next=NULL;
    }

}
void main()
{
    struct LNode *Head,*p;
    Head=CreateLinklist();
//    LNodeFind(Head);
    LNodeFind_1(Head);
    printf("\n移动后的结果为\n");
    p=Head->next;
    while(p)
    {
        printf("%-4d",p->data);
        p=p->next;
    }
    printf("\n");
}

简洁版本//好方法,多学习一下
void movemax(node *L)
{
    node *p = L->next, *pre = L, *max = p;
    while (p)
    {
        if (p->data>max->data)max = p;
        pre = p;
        p = p->next;
    }
    int temp = pre->data;
    pre->data = max->data;
    max->data = temp;//交换结点的数值就可以了,没必要交换结点
}
15、编写一个函数,把整数序列分成两个部分,使得左边部分都不大于右边部分,不需要排序。 ( 考察的是快速排序的部分)
#include <stdio.h>
void partition(int A[],int n)
{
    int pivot=A[0];
    int low=0,high=n-1;
    while(low!=high)
    {
        while(low<high&&A[high]>=pivot)
            --high;
            A[low]=A[high];
        while(low<high&&A[low]<=pivot)
            ++low;
            A[high]=A[low];
    }
    A[low]=pivot;
}
void main()
{
    int i,A[5]={10,1,9,7,8};
    partition(A,5);
    for(i=0;i<5;i++)
    printf("%-4d",A[i]);
    printf("\n");

}
16编写一个函数,删除链表中的最小值。(结点node由整型data和节点指针next构成)
void delmin(node *L)
{
    node *p=L->next, *pre=L;
    node *min=p, *minpre=L;
    while(p)
    {
        if(p->data < min->data)
        {
            min = p;
            minpre = pre;
        }

        pre = p;
        p = p->next;
    }
    minpre->next = min->next;
    free(min);
}
17、有两个整数数组A和B,它们分别有m、n个整数。并且都是按非递减序列,现将B数组插入A数组中,使得A数组中各元素不大于B数组中各元素,且还是非递减序列。
#include <stdio.h>
int ArrayOrder(int a[],int b[],int m,int n)
{
    int i,j;
    for(i=0;i<m&&i<n;i++)
    {
        if(a[i]>b[i])
        {
            a[i]=b[i];
        }
    }
    if(m<n)
    {
        for(i=m;i<n;i++)
            a[i]=b[i];
    }
        
    return m<n?n:m;

}
void main()
{
    int a[30],b[30];
    int i,m,n,len;
    printf("请输入两个数组分别的个数,以空格隔开\n");
    scanf("%d %d",&m,&n);
    printf("第一个数组输入:\n");
    for(i = 0;i < m;i ++)
        scanf("%d",&a[i]);
    printf("第二个数组输入:\n");
    for(i = 0;i < n;i ++)
        scanf("%d",&b[i]);
    len=ArrayOrder(a,b,m,n);
    for(i=0;i<len;i++)
    printf("%-4d",a[i]);
    printf("\n");
    for(i=0;i<n;i++)
    printf("%-4d",b[i]);
    printf("\n");
}


18、两个递增有序整数数列链表La和Lb,将他们合并后,变成一个新的链表,要求该链表递减排序。(结点node由整型data和节点指针next构成)
#include <stdio.h>
#include <malloc.h>
#define N 5
struct Node{
    int data;
    struct Node *next;
};
struct Node * CreateLinklist()
{
    struct Node *p,*Head,*q;
    int i,temp;
    Head=(struct Node *)malloc(sizeof(struct Node));
    q=Head;
    printf("建立单链表,输入%d个数据:\n",N);
    for(i=0;i<N;i++)
    {
        scanf("%d",&temp);
        p=(struct Node *)malloc(sizeof(struct Node));
        p->data=temp;
        q->next=p;
        q=p;
    }
    q->next=NULL;
    return Head;
}
struct Node * ReverseLinklist(struct Node * Head)
{
    struct Node *p,*q;
    p=Head->next;
    Head->next=NULL;
    while(p)
    {
        q=p->next;
        p->next=Head->next;
        Head->next=p;
        p=q;
    }
    return Head;
    
}
struct Node * MergeList(struct Node *list1,struct Node *list2)
{
    struct Node * list3,*r,*la=list1->next,*lb=list2->next;
    list3=(struct Node*)malloc(sizeof(struct Node));
    r=list3;
    if(la->data<=lb->data)
    {
        r->next=la;
        r=la;
        la=la->next;
    }
    else
    {
        r->next=lb;
        r=lb;
        lb=lb->next;
    }
    while(la&&lb)
    {
        if(la->data<=lb->data)
        {
            r->next=la;
            r=la;
            la=la->next;
        }
        else
        {
            r->next=lb;
            r=lb;
            lb=lb->next;
        }
    }
    if(la)
        r->next=la;
    else
        r->next=lb;
free(list1);
free(list2);
    return list3;


}
void main()
{
    struct Node *h1,*h2,*h3,*p;
    h1=CreateLinklist();
    h2=CreateLinklist();
    h3=MergeList(h1,h2);
    p=ReverseLinklist(h3);
    p=h3->next;
    while(p)
    {
        printf("%-4d",p->data);
        p=p->next;
    }
    printf("\n");
}




19、对多个字符串进行字典排序
void Sort(char *parr[],int n)
{
    int i, j;
    char *str1, *str2;
    for(i=0; i<n-1; i++)
    {
        for(j=i+1; j<=n-1; j++)
        {
            str1=parr[i];
            str2=parr[j];
            while(*str1 && *str2 && *str1==*str2)str1++,str2++;//重点,*str为字符
            if(*str1-*str2>0)
            {
                char *temp = parr[i];
                parr[i] = parr[j];
                parr[j] = temp;
            }
        }
    }

20、有两字符数组s和t,求t在s中出现第一次的开始位置,如果没有则输出“No”,有则输出开始位置。
int start(char s[],char t[])
{
    int s_length = strlen(s);
    int i;
    char *str1, *str2;
    for(i=0; i<s_length; i++)
    {
        str1 = s+i;
        str2 = t;
        while(*str1 && *str2 && *str1==*str2)str1++,str2++;
        if(*str1-*str2 == *str1)return i;
    }
    printf("NO!\n");
    return -1;

21、编程题,将给定字符串例如”aaa111bbb222#”中的数字全部提取出来,放到给定的数组中。字符串以#结尾。函数形式为void int_find(int arr[], char *pc);溢出以-1作为标志。
#include <stdio.h>
void int_find(int arr[],char *pc)
{
    char *p=pc;
    int i=0;
    while(*p!='#')
    {
        if(*p>='0'&&*p<='9')
            arr[i++]=*p-'0';
        p++;
    }
    arr[i]=-1;
}

void main()
{
    int Num[100],i=0;
    char *str="uestc2015jsj123#";
    int_find(Num,str);
    while(Num[i]!=-1)
    {
        printf("%-4d",Num[i]);
        i++;
    }
    printf("\n");
}

22、编程题,随机输入最多100个整数和浮点数,将整数按从大到小排列,浮点数按从小到大排列(浮点数排序可省略),并输出。如:输入10 12.3 12 5 52.1 3.65 88.6 1.0 输出:12 10 5 1.0 3.65 12.3 52.1 88.6。
#include <stdio.h>

void Intsort(int Num[100],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(Num[i]<Num[j])
            {
                temp=Num[i];
                Num[i]=Num[j];
                Num[j]=temp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%-4d",Num[i]);
    }

}
void Floatsort(float Num[100],int n)
{
    int i,j;
    float temp;
    for(i=n-1;i>0;i--)
    {
        for(j=0;j<i;j++)
        {
            if(Num[j+1]<Num[j])
            {
                temp=Num[j];
                Num[j]=Num[j+1];
                Num[j+1]=temp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%-7.2f",Num[i]);
    }
    printf("\n");
}
void main()
{

    int NumI[100],n;
    float NumF[100],temp;
    int    i,iNum=0,fNum=0;
    printf("要输入的个数\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%f",&temp);
        if(temp==(int)temp)
            NumI[iNum++]=temp;
        else
            NumF[fNum++]=temp;
    }
    Intsort(NumI,iNum);
    Floatsort(NumF,fNum);
}
判断整数和浮点数完美方法
#include <string.h>//strstr()
#include <stdlib.h>//atof,atoi
while (m < n) {
        scanf("%s", buff);
        if (strstr(buff, ".")) 
            fltarr[j++]=atof(buff);
        else 
            intarr[i++] = atoi(buff);        
        m++;
    }

23、编程题,编写完整的程序,构造整数集合,并实现对该集合操作的若干功能:查找集合内的某元素;集合中加入一个新元素;删除集合中某一元素;求两个集合的并集;求两个集合的交集;并给出main函数调用的例子。
注:集合中是不会有重复元素出现的,整数集合其实就是一个整数链表。
typedef struct node {
    int data;
    node *next;
}node ,*set;

//判断某元素是否在集合内
int isexist(struct node *L, int num)
{
    struct node *p = L->next;
    while (p)
    {
        if (p->data == num)return 1;
        p = p->next;
    }
    return 0;
}

//增加一个元素,头插法
void add(struct node *L, int num)
{
    if (isexist(L,num)) {
        struct node *p = (struct node *)malloc(sizeof(struct node));
        p->data = num;
        p->next = L->next;
        L->next = p;
    }
}


//删除集合中某一元素
void del(struct node *a, int num)
{
    struct node *p = a->next, *pre = a;
    while (p)
    {
        if (p->data == num)
        {
            pre->next = p->next;
            free(p);            break;
        }
        pre = p;
        p = p->next;
    }
}


//输出两个集合并集
void intersection(struct node *a, struct node *b)
{
    struct node *p = a->next;
    int flag = 0;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    struct node *q = b->next;
    while (q)
    {
        p = a->next;
        flag = 0;
        while (p)
        {
            if (q->data == p->data)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (!flag)printf("%d ", q->data);
        q = q->next;
    }
}

//输出两个集合交集
void Union(struct node *a, struct node *b)
{
    struct node *p = a->next, *q = b->next;
    while (p)
    {
        q = b->next;
        while (q)
        {
            if (p->data == q->data)
            {
                printf("%d ", q->data);
                break;
            }
            q = q->next;
        }
        p = p->next;
    }
}

void main()
{
    struct node *L = (struct node *)malloc(sizeof(struct node));
    struct node *S = (struct node *)malloc(sizeof(struct node));
    L->next = 0;
    S->next = 0;

    int temp;
    scanf("%d", &temp);
    while (temp != -1)
    {
        add(L, temp);
        scanf("%d", &temp);
    }

    scanf("%d", &temp);
    while (temp != -1)
    {
        add(S, temp);
        scanf("%d", &temp);
    }
    printf("\n并集:");
    intersection(L, S);
    printf("\n交集:");
    Union(L, S);
}

 

免责声明:本站所有的内容均来源于互联网采集或网友投稿提供,不能保证内容的真实性、完整性,仅供个人研究、交流学习使用,不涉及任何商业盈利目的。如果资料有误与官方发布不一致,请与官方最新发布为准,请联系本站管理员予以更改,如果涉及版权等问题,请联系本站管理员予以删除。
维权指引 | 权限说明 | 下载说明 | 内容投诉
考研云分享 » 2017年电子科技大学820计算机复试自己编写C复试答案

1 评论

  1. Simonyh

    请教电子科大的资料看不见哇?

您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论

加入会员,每天进步一点点
·会员权限 ·加网盘群 ·加微信群