【数据结构】线性结构—有序顺序表

查找递增顺序表中的元素

要求:
在递增的的线性表中查找数值为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;
}

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