C语言数据结构课后习题

2.12设A=(a1,…,am)和B=(b1,…,bn)均为顺序表,A’和B’分别为A和B中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分别为A’=(x,z)和B’=(y,x,x,z))。若A’=B’=空表,则A=B;若A’=空表,而B’≠空表,或者两者均不为空,且A’的首元小于B’的首元,则A < B,否则A > B。试写一个比较A、B大小的算法(请注意:在算法中,不要

#define initsize 80

#define listincrement 10

#include<stdio.h>

#include<stdlib.h>

typedef struct{

    double *elem;//存储空间基地址

    int length;//当前长度

    int listsize;//当前的存储容量

} sqlist;//创建顺序表

int compare(sqlist A,sqlist B)

{

    int i=0;

    while(i<=A.length-1&&i<=B.length-1)

    {

        if(A.elem[i]==B.elem[i]){i++;}

        else{i--; break;}//没有进行到顺序表最后一个元素就找到了最大共同前缀,i--指向这个地址

    }

    if(i>A.length-1||i>B.length-1) i--;//while循环结束后,如果AB等长,(i--)=A.length-1;如果A比B长,(i--)=B.length-1

    if(i==A.length-1&&i==B.length-1){return 0;}

    else if((i==A.length-1&&i<B.length-1))return -1;

    else if(i<A.length-1&&i<B.length-1){

        if(A.elem[i+1]>B.elem[i+1]) return 1;

        if(A.elem[i+1]<B.elem[i+1]) return -1;

    }

    else return 1;

}

int main()

{

    sqlist A;int na=0;printf("enter length of A\n");scanf("%d",&na);

    int p=na;

    A.elem=(double*)malloc((na)*sizeof(double));//创建顺序表

    if(!A.elem){printf("wrong\n");}

    A.listsize=initsize;

    printf("enter element for this sqlist\n");

    for(p=0;p<na;p++)

    {

        scanf("%lf",&A.elem[p]);

    }

    A.length=na;

    A.listsize=initsize;//依次给顺序表A的元素赋值

        sqlist B;;int nb=0;printf("enter length of B\n");scanf("%d",&nb);

    p=nb;

    B.elem=(double*)malloc((nb)*sizeof(double));

    if(!B.elem){printf("wrong\n");}

    B.listsize=initsize;

    printf("enter element for this sqlist\n");

    for(p=0;p<nb;p++)

    {

        scanf("%lf",&B.elem[p]);

    }

    B.length=nb;

    B.listsize=initsize;//依次给顺序表B的元素赋值

    switch(compare(A,B))//比较AB大小

    {

        case 1:printf("A>B\n");break;

        case 0:printf("A=B\n");break;

        case -1:printf("A<B\n");break;

        default:printf("wrong\n");break;

    }

    return 0;

}。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值