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;
}。