数据结构(李清云)实验一答案

已知顺序表结构和相关函数定义如下(详见sequlist.h文件),基于该文件完成实验题1~实验题5。

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

/***************************/

/*函数名称:initseqlist()      */

/*函数功能:初始化顺序表   */

/***************************/

void initseqlist(sequence_list *L)

{

    L->size=0;

}

/***************************/

/*函数名称:input()          */

/*函数功能:输入顺序表     */

/***************************/

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}

/***************************/

/*函数名称:inputfromfile()   */

/*函数功能:从文件输入顺序表*/

/***************************/

void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}

/***************************/

/*函数名称:print()          */

/*函数功能:输出顺序表     */

/***************************/

void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}

(1)基于sequlist.h中定义的顺序表,编写算法函数reserve(sequence_list *L),实现顺序表的倒置

(1)#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

void initseqlist(sequence_list *L)

{

    L->size=0;

}

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}

/*void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

}*/

void print(sequence_list *L)

{

    int i;

    for(i=0;i<L->size;i++)

    {

        printf("%5d",L->a[i]);

        if((i+1)%10==0)  printf("\n");

    }

    printf("\n");

}

void reserve(sequence_list *L)

{

    int left,right,temp;

    int i;

    for(left=0,right=L->size-1;left<=right;left++,right--)

    {

        temp=L->a[left];

        L->a[left]=L->a[right];

        L->a[right]=temp;

    }

}

int main()

{

    sequence_list L;

    input(&L);

    print(&L);

    reserve(&L);

    print(&L);

}

(2)编写一个算法函数void sprit(sequence_list *L1, sequence_list *L2, sequence_list *L3),将顺序表L1中的数据进行分类,奇数存放到顺序表L2中,偶数存放到顺序表L3中,编写main()函数进行测试

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

void initseqlist(sequence_list *L)

{

    L->size=0;

}

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}

/*void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

}*/

void print(sequence_list *L)

{

    int i;

    for(i=0;i<L->size;i++)

    {

        printf("%5d",L->a[i]);

        if((i+1)%10==0)  printf("\n");

    }

    printf("\n");

}

void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3)

{

    int i,j,k;

    j=k=0;

    L2->size=0;

    L3->size=0;

    for(i=0;i<=L1->size-1;i++)

    {

        if(L1->a[i]%2==0)

        {

            L3->a[L3->size]=L1->a[i];

            L3->size=L3->size+1;

        }

        else

        {

            L2->a[L2->size]=L1->a[i];

            L2->size=L2->size+1;

        }

    }

}

int main()

{

    sequence_list L1,L2,L3;

    input(&L1);

    sprit(&L1,&L2,&L3);

    print(&L1);

    print(&L2);

    print(&L3);

}

(3)已知顺序表L1和L2中的数据均由小到大排序,请用尽可能快的方法将L1和L2中的数据合并到L3中,使数据在L3中按升序排列。

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

void initseqlist(sequence_list *L)

{

    L->size=0;

}

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}

/*void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

}*/

void print(sequence_list *L)

{

    int i;

    for(i=0;i<L->size;i++)

    {

        printf("%5d",L->a[i]);

        if((i+1)%10==0)  printf("\n");

    }

    printf("\n");

}

void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3)

{

    int i,j;

    L3->size=0;

    for(i=0;i<L1->size;i++)

    {

        L3->a[L3->size]=L1->a[i];

        L3->size=L3->size+1;

    }

    for(i=0,j=L3->size;i<L2->size;i++,j++)

    {

        L3->a[j]=L2->a[i];

        L3->size=L3->size+1;

    }

    int temp,minindex;

    for(i=0;i<L3->size-1;i++)

    {

        minindex=i;

        for(j=i+1;j<L3->size;j++)

            if(L3->a[j]<L3->a[minindex])

            minindex=j;

        if(minindex!=i)

        {

            temp=L3->a[i];

            L3->a[i]=L3->a[minindex];

            L3->a[minindex]=temp;

        }

    }

}

int main()

{

    sequence_list L1,L2,L3;

    input(&L1);

    input(&L2);

    merge(&L1,&L2,&L3);

    print(&L3);

}

4)假设顺序表la与lb分别存放两个整数集合,函数inter(sequence_list *la, sequence_list *lb, sequence_list *lc)的功能是将顺序表la和lb的交集放到顺序表lc中,请将函数补充完整。

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

/*void initseqlist(sequence_list *L)

{

    L->size=0;

}

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}*/

/*void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}*/

void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}

void print(sequence_list *L)

{

    int i;

    for(i=0;i<L->size;i++)

    {

        printf("%5d",L->a[i]);

        if((i+1)%10==0)  printf("\n");

    }

    printf("\n");

}

void inter(sequence_list *la,sequence_list *lb,sequence_list *lc)

{

    lc->size=0;

    int i,j;

    for(i=0;i<la->size;i++)

    {

        for(j=0;j<lb->size;j++)

        {

            if(la->a[i]==lb->a[j])

            {

                lc->a[lc->size]=la->a[i];

                lc->size=lc->size+1;

            }

        }

    }

}

int main()

{

    sequence_list la,lb,lc;

    inputfromfile(&la,"1.txt");

    inputfromfile(&lb,"2.txt");

    print(&la);

    print(&lb);

    inter(&la,&lb,&lc);

    print(&lc);

    return 0;

}

(5)请编写一个算法函数partion(sequence_list *L),尽可能快地将顺序表*L中的所有奇数调整到表的左边,所有偶数调整到表的右边,并分析算法的时间复杂度。

#include <stdio.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef int datatype;

typedef struct{

    datatype a[MAXSIZE];

    int size;

}sequence_list;

/*void initseqlist(sequence_list *L)

{

    L->size=0;

}

void input(sequence_list *L)

{

    datatype x;

    initseqlist(L);

    printf("请输入一组数据,以0作为结束符:\n");

    scanf("%d",&x);

    while(x)

    {

        L->a[L->size++]=x;

        scanf("%d",&x);

    }

}*/

/*void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}*/

void inputfromfile(sequence_list *L,char *f)

{

    int i,x;

    FILE *fp=fopen(f,"r");

    L->size=0;

    if(fp)

    {

        while(!feof(fp))

        {

            fscanf(fp,"%d",&L->a[L->size++]);

        }

        fclose(fp);

    }

}

void print(sequence_list *L)

{

    int i;

    for(i=0;i<L->size;i++)

    {

        printf("%5d",L->a[i]);

        if((i+1)%10==0)  printf("\n");

    }

    printf("\n");

}

void partion(sequence_list *L)

{

    int i,j,temp,index;

    for(i=0;i<L->size-1;i++)

    {

        index=i;

        for(j=i+1;j<L->size;j++)

        {

            if(L->a[i]%2==0&&L->a[j]!=0)

            {

                index=j;

                temp=L->a[i];

                L->a[i]=L->a[index];

                L->a[index]=temp;

            }

        }

    }

}

int main()

{

    sequence_list L;

    inputfromfile(&L,"3.txt");

    print(&L);

    partion(&L);

    print(&L);

    return 0;

}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值