1. 程式人生 > >順序表的基本運算

順序表的基本運算

1、順序表的基本資料單元

#define maxsize 12
typedef struct {
    int data[maxsize]; // 表的儲存空間
    int last;
}sqlist, *sqlink; // *sqlink 表說明符

2、宣告方法

// 置空表
void ClearList(sqlink L);

// 取表元素
int GetList(sqlink L, int no);

// 求表長
int LengthList(sqlink L);

// 插入元素
int InsertList(sqlink L,int data, int no);

// 刪除元素
int DeleteList(sqlink L, int no);


// 定位元素
int LocateList(sqlink L,int data);

// 判空表
int EmptyList(sqlink L);

// 建空表
void CreateList(sqlink L);

// 打印表元素
void PrintList(sqlink L);

3、在main.c 裡面實現方法

#include <stdio.h>
#include "sqlist.h"

// 建空表
void CreateList(sqlink L) {
    int tempNo = 1;
    int tempData = 0;
    do{
        printf("請輸入書序表的第%d個元素",tempNo);
        scanf("%d",&tempData);
        if (tempData != -1){
            L->data[tempNo-1] = tempData;
            L->last = tempNo - 1;
            tempNo++;
        }
    }while (tempNo<=maxsize&&tempData != -1);
}

// 判空表
int EmptyList(sqlink L) {
    if (L->last == 0) {
        return 1;
    }else {
        return 0;
    }
}


// 定位元素
int LocateList(sqlink L,int data) {
    int i = 0;
    for(i=0; i < L->last; i++) {
        if (L->data[i] == data) {
            return i;
        }
    }
    return 0;
}

// 置空表
void ClearList(sqlink L) {
    L->last = -1;
}

// 取表元素
int GetList(sqlink L, int no) {
    if (no < 0 || no > L->last) {
        return -1;
    }else {
        return L->data[no];
    }
}

// 求表長
int LengthList(sqlink L) {
    return L->last;
}

// 插入元素
int InsertList(sqlink L,int data, int no) {
    // 思路:
    //1 判斷表是否還有儲存空間,如果沒有,直接返回-1
    if(L->last <= no && no >= 0) {
        return -1;
    }else {
        int j = 0;
        for (j = L->last; j >= no; j--) {
            L->data[j+1] =  L->data[j];
            printf("j====%d\n",j);
        }
        L->data[no] = data ;
        L->last++;
        return 1;
    }
    //2 判斷元素插入的位置是否在表的空間區域之內
    //3 開始插入操作,for迴圈裡面的注意點有
        //必須從最後一個元素反過來遍歷,例如最後一個元素下標是j,那麼就是把j的下標對應的值,賦值給j+1,for迴圈的結束條件是j大於或等於i
        //在for迴圈的結束後面進行插入操作
    
    return 0;
}

// 刪除元素
int DeleteList(sqlink L, int no) {
//    1先判斷要刪除的元素下標是否小於0或者大於當前列表的最大長度
//    2 進行刪除操做
//    for迴圈從要刪除的元素下標開始,一直到列表的Last,全部資料往前挪一位
//        3 最後把列表的長度減一
    if(L->last <= no && no >= 0) {
        return -1;
    }else {
        int j = 0;
        for (j = no; j < L->last; j++) {
            L->data[j] =  L->data[j+1];
            printf("j====%d\n",j);
        }
        L->last--;
        return 1;
    }
    return 0;
}

// 打印表元素
void PrintList(sqlink L) {
    int i;
    for (i = 0; i < LengthList(L); i++) {
        printf("%d", L->data[i]);
    }
    printf("\n");
}

int main(int argc, const char * argv[]) {
    // insert code here...
    // 分配記憶體
    sqlink L = (sqlink)malloc(sizeof(sqlist));
    CreateList(L);
    PrintList(L);
    // 定位元素
    
//    int i = 0;
//    i = LocateList(L, 22);
//    printf("22在%d的位置",i);
    
    // 插入元素
//    InsertList(L,2,4);
    DeleteList(L,2);
    PrintList(L);
    
    int num = GetList(L,2);
    printf("第三個元素是%d",num);
    return 0;
}