【數據結構】線性結構—有序順序表

查找遞增順序表中的元素

要求:
在遞增的的線性表中查找數值爲x的元素,若找到則將其與後繼元素位置互換,若找不到,則將其插入到表中並使表依然有序。
分析:
這裏是遞增的順序表,所以採用折半查找的方式較爲高效。
若沒有找到數值爲x的元素,只需要將x插入到折半查找結束的min位置之後或者之前就行
這裏是順序表,插入元素則需要將待插入位置之後的所有元素後移一位。
下面展示實現代碼:

#include<stdio.h>
#define MaxSize 30
struct SqList
{
    int data[MaxSize];
    int length;
};
int Init(struct SqList *L,int i)
{   
    int j = 0;
    for(;j<i;j++)
        scanf("%d",&(L->data[j]));
         L->length = j;
    return 0;        
}
SearchExchangeInsert(struct SqList *L,int x)
{//通過折半查找來找到數值爲x的元素,並與後繼元素互換
    int low = 0;
    int high = L->length-1;
    int min = 0;
    while(low<=high)
    {
        min = (low+high)/2;
        if(L->data[min]==x)
        {
            int t = L->data[min];
            L->data[min] = L->data[min+1];
            L->data[min+1] = t;
            return 1;
        }
        else if(L->data[min]<x)
                    low = min+1;
        else if(L->data[min]>x)
                    high = min-1;
    }
    //若沒有找到數值爲x的元素,只需要將x插入到min位置之後或者之前就行
    //這裏是順序表,插入元素則需要將待插入位置之後的所有元素後移一位
    int i;
    if(L->data[min]<x)
    {   
        for(i = L->length-1;i>=min+1;i--)
        {
            L->data[i+1] = L->data[i];
        }
        L->data[i+1] = x;
        L->length++;
        return 0;
    }
    if(L->data[min]>x)
    {   
        for(i = L->length-1;i>=min;i--)
        {
            L->data[i+1] = L->data[i];
        }
        L->data[i+1] = x;
        L->length++;
        return 0;
    }
}        
int main()
{
    struct SqList L;
    int i = 5;
    Init(&L,i);
    int x = 5;
    SearchExchangeInsert(&L,x);
    printf("執行結果如下:\n\n");
    for(i=0;i<L.length;i++)
    {
        printf("%d",L.data[i]);
    }
    return 0;
}

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