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;
}