动态顺序表操作(二)

1、顺序列表指定位置修改函数

找到在指定位置,直接修改数据

void list_modify(list *plist,int pos,list_type x)
{
    //断言
    assert(plist != NULL);
    assert((pos >= 0) && (pos < plist->count));

    if (plist->count > 0)
    {
        plist->a[pos] = x;
    }
}

2、顺序列表指定位置查询函数

直接遍历循环查找该位置数据即可

int list_find(const list *plist,list_type x)
{
    int i ;
    //找不到会返回-1
    int ret = -1;
    //断言
    assert(plist != NULL);
    for (i = 0; i < plist->count; ++i) {
        if(plist->a[i] == x){
            ret = i;
            break;
        }
    }
    return ret;
}

3、练习

两个有序数组 a [] b [] ,把 b 合并到 a 中,形成一个新的有序数组。
输入: a [] = { 2 , 3 , 5 , 0 , 0 , 0 }; b [] = { 1 , 2 , 6 }
输出: a [] = { 1 , 2 , 2 , 3 , 5 , 6 }
大体思路:
a和b数组分别为有序数组,可以循环遍历,a和b有效数据为3,定义两个常量int m,n,
再声明int i,j 。使i=m-1,指向a的尾部,j= n-1 指向b的尾部,两两逆向遍历比较,再确定常量k = =m+n-1,指向合并后的尾部,通过比较将两个数组中的大者往最后放,最后将b数组中剩余的数据依次填入
代码如下:
void mergeArrays(int a[], int m, int b[], int n) {
    int i = m - 1; // 指向数组a的尾部
    int j = n - 1; // 指向数组b的尾部
    int k = m + n - 1; // 指向合并后的数组的尾部

    // 从后往前遍历,将较大的元素依次放入合并后的数组中
    while (i >= 0 && j >= 0) {
        //若a中的数据较大,则将a中数据放入合并后的数组,并将a数组前移,再与b数组的数据比较
        if (a[i] > b[j]) {
            a[k] = a[i];
            i--;
        } else {
         //若b中的数据较大,则将b中数据放入合并后的数组,并将b数组前移,再与a数组的数据比较
            a[k] = b[j];
            j--;
        }
        //每添加一位数,k往前移动一次
        k--;
    }
    // 如果数组b还有剩余元素,将其依次放入合并后的数组中
    while (j >= 0) {
        a[k] = b[j];
        j--;
        k--;
    }
}

最后正在main函数调用即可:

int main(void ) {
//前面顺序表的调用形式
    list list1;
    list_int(&list1);
//尾增
    list_add_tail(&list1,1);
    list_add_tail(&list1,2);
    list_add_tail(&list1,3);
    list_add_tail(&list1,4);
    list_add_tail(&list1,5);
    list_add_tail(&list1,6);
    list_add_tail(&list1,7);
//展示
    list_show(&list1);
//w尾删
    list_del_tail(&list1);
    list_show(&list1);
//头部添加
    list_add_head(&list1,10);
    list_add_head(&list1,20);
    list_add_head(&list1,30);
    list_add_head(&list1,40);
    list_add_tail(&list1,50);
    list_show(&list1);
//删除
    list_delete(&list1,0);
    list_delete(&list1,2);
    list_show(&list1);
//随机添加,任意位置
    list_insert(&list1,2,100);
    list_insert(&list1,5,200);
    list_insert(&list1,7,300);
    list_show(&list1);
//修改
    list_modify(&list1,2,1000);
    list_show(&list1);
//查找
    int temp = list_find(&list1,2000);
    printf("%d\n",temp);
    printf("%d\n",list1.size);
//销毁
    list_destroy(&list1);


//练习题:
    int a[] = {2, 3, 5, 0, 0, 0};
    int b[] = {1, 2,6};
    int m = 3; // 数组a的有效元素个数
    int n = 5; // 数组b的有效元素个数

    mergeArrays(a, m, b, n);

    printf("合并后的有序数组a[] = {");   
    for (int i = 0; i < m + n; i++) 
    {
        printf("%d", a[i]);
        //数组打印形式优化
        if (i != m + n - 1) 
        {
            printf(", ");
        }
    }
    printf("}\n");
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值