天勤论坛高分笔记 2016 版,第 25 页,例 2-1。
描述:已知一个顺序表L,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。

c/*
Page 25, Example 2-1.
*/

#include "stdio.h"
#define maxSize 50

typedef struct    // 顺序表的定义
{
    int data[maxSize];
    int length;
}Sqlist;

void init(Sqlist &sl)    // 初始化顺序表(粗糙地)
{
    int len = 10;

    for(int i=1; i<=len; ++i)
    {
        sl.data[i] = i*3-2;
    }
    sl.length = len;
}

int locate(Sqlist sl, int num)    // 定位恰当的插入位置
{
    int i=1;
    for(; i<=sl.length; ++i)
    {
        if(sl.data[i]>num)
        {
            return i;   //break;
        }
    }
    return i;   // 即使目前顺序表没有值较 num 大,也能正确返回下标
}

int insert(Sqlist &sl, int loc, int num)    // 往顺序表 sl 的 loc 位置插入值为 num 的元素
{
    int index=sl.length;

    if(loc<1 || loc>sl.length+1){   // 合法的位置应该在 1~sl.length+1 之间(有可能在顺序表的末尾追加)
        return 0;
    }

    while(index>=loc){    // 从后往前移,保证数据不被冲掉
        sl.data[index+1]=sl.data[index];
        index--;
    }
    sl.data[loc]=num;
    sl.length++;

    return 1;
}

void printSqlist(Sqlist sl)
{
    int len=sl.length;
    for(int i=1; i<=len; i++){
        printf("%d,", sl.data[i]);
    }
    printf(";Length: %d\n", sl.length);
}

int main()
{
    Sqlist sl;
    int num;

    printf("A number: ");
    scanf("%d", &num);

    init(sl);

    printf("Before: \n");
    printSqlist(sl);

    if(insert(sl, locate(sl, num), num) == 1)
    {
        printf("After:\n");
        printSqlist(sl);
    }

    return 0;
}


土卜皿
341 声望8 粉丝

栽花种树,潜水跑酷。


引用和评论

0 条评论