數據結構--線性表的順序表示(1~5)

線性表的順序存儲類型爲:

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

1 . 從順序表中刪除具有最小值的元素(假設唯一)並由函數返回被刪除元素的值,空出的位置由最後一個元素填補,若順序表爲空則顯示出錯信息並退出。

  • 算法思想:記錄最小元素所在的位置,搜索結束後將最後一個元素賦予最小元素所在的位置。
bool Del_Min(SqList &L,int &value)
{
    if (L.length == 0)
        return false;

    value = L.data[0];
    int pos = 0;
    for (int i = 1; i < L.length; i++)
    {
        if (L.data[i] < value)
        {
            value = L.data[i];
            pos = i;
        }
    }
    L.data[pos] = L.data[L.length - 1];
    L.length--;

    return true;
}

2 . 設計一個高效的算法,將順序表中所有元素逆置,要求算法的空間複雜度爲O(1)。

  • 算法思想:用循環將第i個元素和第length-1-i個元素的值交換。
void Reverse(SqList &L)
{
    int temp;
    for (int i = 0; i <= L.length/2; i++)
    {
        temp = L.data[i];
        L.data[i] = L.data[L.length-1-i];
        L.data[L.length - 1 - i] = temp;
    }
}

開始犯了一個很嚴重的錯誤:L.data={1,2,3,4,5,6,7,8,9};
error C2440: “=”: 無法從“initializer-list”轉換爲“int”
百度了一下:只有定義時纔可以用花括號擴起來的列表進行初始化。
定義變量int L[10] = {1,2,3,4,5,6,7,8,9};實際上是先分配10個內存,同時將內存初始化。而定義SqList L;實際上是先分配sizof(SqList)個內存,然後調用默認構造函數初始化LL.data={1,2,3,4,5,6,7,8,9};編譯通不過是因爲L已經初始化了,不能再初始化一次了。

int main()
{
    SqList A;
    A.length = 10;
    for (int i = 0; i<A.length; i++)
        A.data[i] = i;

    Reverse(A);
    for (int i = 0; i < A.length; i++)
    {
        cout << A.data[i]<<" ";
    }

    return 0;
}

3 . 長度爲n的順序表L。編寫一個時間複雜度爲O(n),空間複雜度爲O(1)的算法該算法刪除線性表中所有值爲x的元素。

  • 算法思想:用count記錄表A中等於x的元素個數,將不等於x的向前移動count個位置。
void Del_X(SqList &L, int x)
{
    int count = 0, i = 0;
    while (i < L.length)
    {
        if (L.data[i] == x)
        {
            count++;
        }
        else
        {
            L.data[i - count] = L.data[i];
        }
        i++;
    }

    L.length -= count;
}

4 .從有序順序表中刪除其值在給定值s與t之間(要求s小於t)的所有元素,如果s或t不合理或者順序表爲空則顯示出錯誤信息並退出運行。

  • 算法思想:只需要在上一題的思路上稍加改進就可以了,因爲是有序表所以可以直接找到與s值相同的第一個元素和與t相同的最後一個元素,直接刪除一整塊。
bool Del_S_T(SqList &L, int x, int t)
{
    int pos1, pos2;
    if (x > t)
        return false;
    int i = 0;
    while (i < L.length)
    {
        if (L.data[i] >= x&&L.data[i] < t)
        {
            pos1 = i;
            break;
        }
        i++;
    }
    while (i < L.length)
    {
        if (L.data[i + 1]>t)
        {
            pos2 = i + 1;
            break;
        }
        i++;
    }
    while (pos2 < L.length)
    {
        L.data[pos1++] = L.data[pos2++];
    }

    L.length = L.length - pos2 + pos1;

    return true;
}

5 .從順序表中刪除所有其值在給定值s與t之間的元素(包含s與t,要求s小於t)的所有元素,如果s與t不合理或者順序表爲空則顯示錯誤信息並退出。

  • 算法思想:跟上一題思路一樣,上一題同樣也可以用這個思路來做。
bool Del_S_T_Du(SqList &L, int x, int t)
{
    if (x > t)
        return false;
    int count = 0, i = 0;
    while (i < L.length)
    {
        if (L.data[i] >= x&&L.data[i] <= t)
        {
            count++;
        }
        else
        {
            L.data[i - count] = L.data[i];
        }
        i++;
    }

    L.length -= count;

    return true;
}

完整的代碼貼在:https://github.com/shuailishasls/git_share/tree/master/linear_list_question_1-5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章