《資料結構題集》2.12
阿新 • • 發佈:2019-01-05
核心程式碼:
int common_prefix(List LA,List LB) //找到最大字首的下標
int compare(List LA,List LB,int prefix) //然後進行比較
int common_prefix(List LA,List LB) { int i; int j = 0; int length; length = ( LA.length - LB.length ) ? LA.length : LB.length; for(i = 0;i<length;i++) { if(LA.elem[i] == LB.elem[i]) j++; } return j; }
int
compare(List LA,List LB,int prefix)
{
if(LA.length == prefix && LB.length == prefix)
return 0;
if(LA.elem[prefix] < LB.elem[prefix])
return 1;
if(LA.elem[prefix] > LB.elem[prefix])
return 2;
else
return OK;
}
我看了一下網上別人的答案,覺得更簡潔一些,它是一趟掃描下來的,列在下面:
int compare(List LA,List LB) { int i = 0; while(i<LA.length && i < LB.length) { if(LA.elem[i] > LB.elem[i]) return 2; else if(LA.elem[i] < LB.elem[i]) return 1; else i++; } if(i < LA.length) return 2; else if(i < LB.length) return 1; else return 0; }
對返回值的說明
switch(choose)
{
case 0:
printf("A = B\n");
break;
case 1:
printf("A < B\n");
break;
case 2:
printf("A > B\n");
break;
default:
printf("no compare!!!\n");
}
全部程式碼
#include<stdio.h> #include<stdlib.h> #define ERROR -1 #define OK 1 #define LIST_INT_SIZE 100 #define LISTINCREMENT 10 typedef struct { int * elem; int length; int size; }List; int InitList(List *L) { (*L).elem = (int *)malloc(LIST_INT_SIZE * sizeof(int)); if(!(*L).elem) exit(ERROR); (*L).length = 0; (*L).size = LIST_INT_SIZE; return OK; } int InsertList(List * L,int i,int e) { int * newbase,*q,*p; //int list1[5] = {3,5,7,9,11}; if(i<1 || i>(*L).length+1) return ERROR; if( (*L).length > (*L).size) { newbase = (int *)realloc((*L).elem, (LISTINCREMENT + (*L).size ) * sizeof(int)); if(!newbase) exit(ERROR); (*L).elem = newbase; (*L).size = LISTINCREMENT + (*L).size; } q = (*L).elem + i -1; //也就是插入點後面的元素都要往後挪一位 for( p = (*L).elem + (*L).length-1 ;p>=q;--p) { *(p+1) = *p; } *q = e; ++ (*L).length; return OK; } int define_create(List *L,int n) { int i,j; int e; InitList(L); printf("please enter %d elements: ",n); scanf("%d",&e); InsertList(L,1,e);//if don't write like this divided,we can't get the result. for(i = 1;i<n;i++) //modify { scanf("%d",&e); // for(j = 0;j<(*L).length;j++) // if(e <= *((*L).elem + j) ) // break; //InsertList(L,j+1,e); //like this add order InsertList(L,i+1,e); } return OK; } void ListTraverse(List L,void(*visit)(int *)) { int * q; q = L.elem; //for(;(q ++)!= NULL;) for(int i = 1;i<=L.length;i++) { visit(q++); } printf("\n"); } void visit(int * c) { printf(" %d ", *c ); } int common_prefix(List LA,List LB) { int i; int j = 0; int length; length = ( LA.length - LB.length ) ? LA.length : LB.length; for(i = 0;i<length;i++) { if(LA.elem[i] == LB.elem[i]) j++; } return j; } int compare(List LA,List LB,int prefix) { if(LA.length == prefix && LB.length == prefix) return 0; if(LA.elem[prefix] < LB.elem[prefix]) return 1; if(LA.elem[prefix] > LB.elem[prefix]) return 2; else return OK; } int main(int argc, char const *argv[]) { int n; int choose; List LA,LB; int prefix; printf("please enter the List A number: "); scanf("%d",&n); define_create(&LA,n); printf("please enter the List B number: "); scanf("%d",&n); define_create(&LB,n); ListTraverse(LA,visit); ListTraverse(LB,visit); prefix = common_prefix(LA,LB); choose = compare(LA,LB,prefix); switch(choose) { case 0: printf("A = B\n"); break; case 1: printf("A < B\n"); break; case 2: printf("A > B\n"); break; default: printf("no compare!!!\n"); } return 0; }