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大小的算法(请注意:在算法中,不要破坏原表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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值