1. 程式人生 > >抽象資料型別線性表的定義與實現

抽象資料型別線性表的定義與實現

最近剛剛上完資料結構的第一章,好久沒有寫線性表了,正好藉著老師的作業溫習一下,主程式實現的就是簡單的list有序合併。不多比比,直接上程式碼

第一部分 de.hpp檔案

//
//  main.cpp
//  test
//
//  Created by 蔡鵬 on 2018/9/4.
//  Copyright © 2018年 蔡鵬. All rights reserved.
//
#ifndef de_hpp
#define de_hpp

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 //儲存空間初始分配量
#define TURE 1
#define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 //不可實施 #define OVERFLOW -2 //溢位elem typedef int ElemType;//ElemType根據實際情況而定,這裡假設為int typedef int Status; typedef struct { ElemType *elem;//陣列儲存資料元素,最大值為MAXSIZE int listsize ;//當前分配的儲存容量 int length;//線性表當前長度 }SqList; void CreateList(SqList *L, ElemType a[], int
n); //利用陣列初始化Sqlist Status InitList(SqList *L); //初始化,動態分配一塊儲存空間 Status DestroyList(SqList *L); //釋放這一段儲存空間(撤銷對應於動態) Status ClearList(SqList *L); Status ListEmpty(SqList L); Status ListLength(SqList L); Status GetElem(SqList L, int i, int *e); Status LocateList(SqList L, int e); //在表中查詢值為e的元素
Status PriorElem(SqList L, int cur_e, int *pri_e); //求當前元素的前驅 Status NextElem(SqList L, int cur_e, int *Nex_e); //求當前元素的後繼 Status ListInsert(SqList *L, int i, int e); //插入操作 Status ListDelete(SqList *L, int i, int *e); //刪除操作 Status TravelList(SqList L); //便歷操作 #endif /* de_hpp */

第二部分 defc.hpp

//
//  main.cpp
//  test
//
//  Created by 蔡鵬 on 2018/9/4.
//  Copyright © 2018年 蔡鵬. All rights reserved.
//
#include "de.hpp"
void CreateList(SqList *L, ElemType a[5], int n){
    int i;
    for (i=0; i<n; i++){
        *(L->elem+i) = a[i];
    }
    L->length=n;

}
Status InitList(SqList *L){//創造一個空的線形表
    L->elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    if(!L->elem) exit(OVERFLOW);//錯誤退出
    L->length = 0;
    L->listsize = MAXSIZE;
    return OK;
}
Status DestroyList(SqList *L){
    free(L->elem);         //釋放空間
    L->elem = NULL;      //將指標置空
    L->length = 0;         //當前元素個數為0
    L->listsize = 0;        //表長為0
    return OK;
}
Status ClearList(SqList *L){
    L->length = 0;
    return OK;
}
Status ListEmpty(SqList L){
    if (L.length == 0)
        return TURE;
    else
        return FALSE;
}
Status ListLength(SqList L){
    return L.length;
}
Status GetELem(SqList L,int i,int *e){
    *e = *(L.elem + i);
    return TURE;
}
Status LocateList(SqList L,int e){
    int i;
    int * p = L.elem;
    for (i=0; i<L.length; i++, p++){
        if (*p == e)
            return i;
    }
    return FALSE;
}
Status PriorElem(SqList L ,int cur_e,int *pri_e){
    int i;
    int *p = L.elem;
    for (i=0; i<L.length; i++,p++){ //順序表長度已知,故用for迴圈
        if (i==0 && *p==cur_e)
            return FALSE;
        if (*p == cur_e){  //找到了當前元素且不是第一個元素,
            *pri_e = *--p;      //將其前驅賦給引用引數
            return TURE;
        }
    }
    return FALSE;
}
Status NextElem(SqList L, int cur_e, int *Nex_e){
    int i;
    int *p = L.elem;
    for(i = 0;i<L.length;i++,p++){
        if(i==L.length-1 &&  *p  == cur_e)
            return FALSE;
        if(*p == cur_e){
            *Nex_e = *++p;
            return TURE;
        }
    }
    return FALSE;
}
Status ListInsert(SqList *L, int i, int e){
    int *p, *q;
    p = L->elem + i ;                 //p指向插入的位置
    q = L->elem + L->length - 1;    //q指向表中元素最後一個位置
    for (; q>=p; q--)    //從最後一個元素開始依次向後移動表中元素
         *(q+1) = *q;
    *(q+1) = e;              //插入元素
    L->length++;     // 表長增一
    return TURE;
}
Status ListDelete(SqList *L, int i, int *e){
    int *p, *q;
    if (i<1 || i>L->length)
            return FALSE;
    p = L->elem + i - 1;         //p指向要刪除的元素的位置
    q = L->elem + L->length - 1;  //q指向表中最後一個元素位置
    *e = *p;                //將要刪除的元素儲存起來
    for (; p<=q; p++)   //從要刪除元素的後面一個元素開始移動元素
        *p = *(p+1);
    L->length--;          //表長減一
    return TURE;
}
Status TravelList(SqList L){
    int i;
    int *p = L.elem;
    for (i=0; i<L.length; i++,p++){
    printf("第%d個元素為:%d\n", i, *p);
    }
    return TURE;
}

第三部分 main 主程式

//
//  main.cpp
//  test
//
//  Created by 蔡鵬 on 2018/9/4.
//  Copyright © 2018年 蔡鵬. All rights reserved.
//
#include "defc.hpp"
void MergeList(SqList La,SqList Lb,SqList &Lc){
    int i,j,k,La_len,Lb_len,ai,bj;
    i=j=0;
    k=0;
    La_len = La.length;
    Lb_len = Lb.length;
    while(i<La_len&&j<Lb_len){
        GetELem(La, i, &ai);
        GetELem(Lb, j, &bj);
        if(ai<=bj) {ListInsert(&Lc, k++, ai);++i;}
        else{ListInsert(&Lc, k++, bj);++j;}
    }
    while (i<La_len) {
        GetELem(La, i++, &ai);
        ListInsert(&Lc, k++, ai);
    }
    while (j<Lb_len) {
        GetELem(Lb, j++, &bj);
        ListInsert(&Lc, k++, bj);
    }
}
int main(){
    int la[5] = {1,3,5,7,9};
    int lb[5] = {2,3,6,8,10};
    SqList La,Lb,Lc;
    InitList(&La);
    InitList(&Lb);
    InitList(&Lc);
    CreateList(&La, la, 5);
    CreateList(&Lb, lb, 5);
    MergeList(La, Lb, Lc);
    TravelList(Lc);

}

結果圖 這裡寫圖片描述