線性表之順序表


線性表的結構體定義:

#define MaxSize 100

typedef struct {
    int data[MaxSize];
    int length;
}Sqlist;

  順序表在內存中以數組形式保存,是一組連續的內存空間。

順序表基本算法:

構造一個空的線性表:

//初始化線性表
STATUS InitList(Sqlist &L) {
    //置表長為0
    L.length = 0;
    return OK;
}

返回指定元素位置:

//定義返回線性表中某個元素的位置i
int LocateElem(Sqlist L, int x) {
    
    int i;
    for (i = 0; i < L.length; i++) {
        if (x < L.data[i])
            //返回元素位置
            return i;
    }
    //沒有元素比x大,則應該是第一個位置
    return i;

}

創建一個線性表:

//創建線性表
STATUS CreateList(Sqlist &L, int data[], int size) {
    if (size > MaxSize)
        return ERROR;

    int i = 0;
    for (i = 0; i < size; i++) {
        L.data[i] = data[i];
    }
    L.length = size;
    return OK;
}

插入一個元素(假設線性表中元素已升序排序)

//插入x后移動相應的元素位置,假設插入總能成功
STATUS InsertElem(Sqlist &L, int x) {

    int positionOfX, i;
    int sum = L.length;
    positionOfX = LocateElem(L, x);

    for (i = L.length - 1; i >= positionOfX; i--) {
        L.data[i+1] = L.data[i];
    }
    L.data[positionOfX] = x;
    L.length++;

    //判斷是否插入成功
    if (L.length > sum) {
        return OK;
    }
    else
        return ERROR;
}

刪除指定位置的元素:

//刪除指定位置的元素,並將刪除元素返回
int DeleteElemAtPos(Sqlist &L, int p) {
    if (p<0 || p>L.length-1)
        return ERROR;

    int result = L.data[p];
    int i;
    //注意是i<L.length-1,而不是<L.length
    for (i = p; i < L.length-1; i++) {
        L.data[i] = L.data[i + 1];
    }
    --L.length;
    return result;

}

在指定位置插入元素:

//在指定位置p插入元素
STATUS InsertElemAtPos(Sqlist &L, int p, int x) {
    if (p<0 || p>L.length || L.length == MaxSize)
        return ERROR;

    int i = 0;
    for (i = L.length - 1; i >= p; i--) {
        L.data[i + 1] = L.data[i];

    }
    L.data[p] = x;
    L.length++;
    return OK;
}

給線性表元素升序排序(可使用多種排序算法,本文使用冒泡):

//給線性表排序
STATUS SortList(Sqlist &L) {
    int i, j;
    int temp = 0;
    for(i=L.length-1;i>=1;i--)
        for (j = 0; j <= i-1; j++) {
            if (L.data[j] > L.data[j + 1]) {
                temp = L.data[j];
                L.data[j] = L.data[j + 1];
                L.data[j + 1] = temp;
            }
        }
    return OK;
}

 

 

測試代碼:

int main()
{
    //創建一個新表
    Sqlist *A;
    A = (Sqlist*)malloc(sizeof(Sqlist));

    cout << "Initial Sqlist" << endl;
    InitList(*A);
    cout << "A的長度 " << A->length << endl << endl;

    int data[5] = { 1,3,2,3,5 };
    CreateList(*A, data, 5);
    cout << "length of A is " << A->length << endl;
    cout << "初始化后的線性表A是:" << endl;
    PrintList(*A);
    cout << endl;

    cout << "給線性表排序之后是:" << endl;
    SortList(*A);
    PrintList(*A);
    cout << endl;

    cout << "插入一個元素后的列表" << endl;
    InsertElem(*A, 2);
    PrintList(*A);
    cout << "length of A is :" << A->length << endl << endl;

    cout << "插入元素0" << endl;
    InsertElem(*A, 0);
    PrintList(*A);
    cout << "length of A is " << A->length << endl << endl;

    cout << "after Delete elem 3 " << endl ;
    DeleteElemAtPos(*A, LocateElem(*A, 3));
    PrintList(*A);
    cout << "length of A is " << A->length << endl;

    //解決顯示窗口一顯而過
    system("pause");
    return 0;
}

 


免責聲明!

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



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