順序表的兩種合並操作(C語言)


#include <stdio.h>
#include <stdlib.h>

//基本操作函數用到的狀態碼 
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
#define INFEASIBLE -1;
const int OVERFLOW = -2;
const int MaxSize = 1000;  //表中數據元素的最大數量

typedef int Status; 
typedef int ElemType;
//順序表定義
typedef struct {
    ElemType *elem;
    int length;
} SqList; 

//順序表初始化
Status InitList(SqList *list) {
    list->elem=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
    if(!list->elem) {
        return OVERFLOW;
    };
    list->length=0;
    return OK;
};

//順序表遍歷
Status ListTraverse(SqList list){
    int j;
    printf("序號:\t元素值:\n");
    for(j=0;j<list.length;j++){
        printf(" (%d)\t\t %d\n",j+1,list.elem[j]);
    }
    return OK;
}

//初始list創建
Status CreateList(SqList *list,ElemType arrData[],int length){
    int j;
    for(j=0;j<length;j++){
        list->elem[j]=arrData[j];
    }
    list->length=length;
    return OK;
}

//基本操作4:求線性表長
int GetLength(SqList list) {
    if(list.elem){ //線性表存在 
        return list.length;
    };
    return ERROR;
}

//基本操作6:根據結點索引i獲取相應位置元素的內容 
Status GetElem(SqList list,int i,ElemType *elem){
    if(i<1||i>list.length) {
        return ERROR;
    } else { 
        *elem=list.elem[i-1];
        return OK;
    }
} 

//基本操作7:查找與目標元素值相同的元素結點,返回邏輯下標 ,若不存在,返回0 
int LocateElem(SqList list,ElemType elem){
    int i;
    for(i=0;i<list.length;i++){
        if(list.elem[i]==elem) return i+1;
    }
    return 0;
}

//基本操作8:插入結點元素到指定位置。(i為邏輯位置) 
Status ListInsert(SqList* list,int i,ElemType elem){
    if(i<1||i>list->length+1) return ERROR;
    if(list->length==MaxSize) return OVERFLOW;
    int j;
    for(j=list->length-1;j>=i-1;j--){
        list->elem[j+1]=list->elem[j];
    }
    list->elem[i-1]=elem;
    list->length++;
    return OK;
}


//有序表合並,順序表實現,pa,pb,pc分別指向兩表第一個元素
Status MergeList(SqList listA,SqList listB,SqList *listC) {
    //由listA和listB長度初始化listC
    listC->length=listA.length+listB.length;
    listC->elem=(ElemType*)malloc(sizeof(ElemType)*(listC->length));
    ElemType *pa,*pb,*pc,*pa_last,*pb_last;
    pa=listA.elem;
    pb=listB.elem;
    pc=listC->elem;
    
    //獲得listA、listB尾指針
    pa_last=pa+listA.length-1;
    pb_last=pb+listB.length-1;
    //合並操作
    while(pa<pa_last&&pb<pb_last){
        if(*pa<*pb){
            *pc=*pa;
            *pa++;
        } else {
            *pc=*pb;
            *pb++;
        }
        *pc++;
    }
    while(pa<=pa_last){
        *pc=*pa;
        *pa++;
        *pc++;
    }
    while(pb<=pb_last){
        *pc=*pb;
        *pb++;
        *pc++;
    }
    return OK;
}

//線性表合並,順序表實現
Status UnionList(SqList *listA,SqList listB){
    int la_len=GetLength(*listA);
    int lb_len=GetLength(listB);
    int j;
    //遍歷listB中的元素與listA元素比較
    for(j=1;j<=lb_len;j++){
        ElemType e;
        GetElem(listB,j,&e);
        if(!LocateElem(*listA,e)){
            la_len++;
            ListInsert(listA,la_len,e);
        }
    }
    return OK;
}

/**
 * 已知線性表:
 * list1=(1,7,8),list2=(2,4,6,8,10,11)
 * 有序表合並:(這里為兩個非遞減線性表list1,list2;合並為一個非遞減線性表list3);
 * 則:list3=(1,2,4,6,7,8,8,10,11)
 * 線性表合並:(合並結果放入list1,“list1 並= list2”)
 * 則新的:list1=(1,7,8,2,4,6,10,11)
 */

int main(void){
    //定義一個線性表 
    SqList list1,list2,list3;
    //初始化 
    InitList(&list1); 
    InitList(&list2); 
    
    //list1、list2創建
    ElemType waitInserted1[]={1,7,8,};
    ElemType waitInserted2[]={2,4,6,8,10,11};
    int arrLength1=sizeof(waitInserted1)/sizeof(waitInserted1[0]);
    int arrLength2=sizeof(waitInserted2)/sizeof(waitInserted2[0]);
    CreateList(&list1,waitInserted1,arrLength1);
    CreateList(&list2,waitInserted2,arrLength2);
    
    printf("\nlist1:\n");
    ListTraverse(list1);
    printf("\nlist2:\n");
    ListTraverse(list2);
    
    //有序表合並:
    MergeList(list1,list2,&list3);
    printf("\nlist3:\n");
    ListTraverse(list3);
    
    //線性表合並:
    UnionList(&list1,list2);
    printf("\n新list1:\n");
    ListTraverse(list1);
    
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM