4. 用指针法在一维有序数组中插入数据。输入一个含有8个整数的升序数列,存储在一维数组中,要求在其中插入任意一个整数后数列仍然有序。C语言
时间: 2024-04-30 11:24:43 浏览: 107
以下是使用指针法在一维有序数组中插入数据的C代码:
```c
#include <stdio.h>
void insert(int arr[], int n, int x) {
int i;
for (i = n - 1; i >= 0 && arr[i] > x; i--) {
arr[i + 1] = arr[i];
}
arr[i + 1] = x;
}
int main() {
int arr[8] = {1, 3, 5, 7, 9, 11, 13, 15};
int n = 8;
int x;
printf("请输入要插入的整数:");
scanf("%d", &x);
insert(arr, n, x);
n++;
printf("插入后的数组为:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
程序中,我们定义了一个insert函数,该函数采用了指针法来插入数据。其基本思路是从数组的尾部开始,逐个将比插入数据大的元素向后移动,直到找到插入位置。最后,将插入数据放入该位置即可。
在主函数中,我们输入要插入的整数,然后调用insert函数将其插入数组中。插入后,我们输出数组的所有元素,以验证数组是否有序。
相关问题
有 10 个整数的升序数列,存储在一维数组中,要求使用C语言指针在其中插入任意一个整数后 数列仍然有序。
以下是使用指针在数组中插入一个整数后仍然保持有序的程序:
```c
#include <stdio.h>
int main() {
int a[11] = {1, 3, 4, 6, 8, 9, 10, 11, 12, 13}, n, *p = a + 9;
printf("原数组为:\n");
for(int i = 0; i < 10; i++)
printf("%d ", *(a + i));
printf("\n请输入要插入的整数:");
scanf("%d", &n);
while(n < *p && p >= a) { // 从数组末尾向前查找插入位置
*(p + 1) = *p;
p--;
}
*(p + 1) = n; // 插入整数
printf("插入后的数组为:\n");
for(int i = 0; i < 11; i++)
printf("%d ", *(a + i));
printf("\n");
return 0;
}
```
程序中首先定义了一个有序的数组a,以及一个指向数组末尾的指针p。然后从键盘输入要插入的整数n。接着使用while循环从数组末尾向前查找插入位置,如果当前位置的元素大于要插入的数,就将该元素向后移动一位,直到找到插入位置或者指针p指向数组的第一个位置。最后将要插入的数插入到该位置后面,输出插入后的数组。
(1) 定义一个 int 型一维数组 a,并用指针 p 指向它。 (2) 用指针实现各个数组元素的输入。 (3) 用指针访问各个数组元素实现选择法排序。 (4) 输出排序结果。 [2] 参考程序 /* 用指针实现的选择法排序程序 */ #include<stdio.h> #include<stdlib.h> #include<time.h> #define M 20 int main() { int a[M],i,temp,*p,*q; srand((unsigned)time(NULL)); printf("随机产生%d 个整数:\n",M); for(p=a;p<a+M;p++) { ; //随机产生 1-100 的整数 printf("%4d",*p); } for(i=0;i<M-1;i++) //用于选择排序的外循环 { q=&a[i]; //假设最小元素的位置 for(p=&a[i+1]; ;p++)//用于选择排序的内循环,找出未经排序的数据中最小的 一个 if( ) //假设不成立 q=p; temp=a[i]; a[i]= ; =temp; //把当前最小值交换到数组适当位置 } printf("\n 选择法排序后数列:\n"); for(p=a;p<a+M;p++) //输出排序结果 printf("%4d",*p); return 0; }
这是一道比较典型的 C 语言数组与指针操作的题目,我们可以按照题目要求一步步实现。
首先,定义一个 int 型一维数组 a,并用指针 p 指向它,可以按照下面的代码实现:
```c
int a[M], i, temp, *p, *q;
p = a; // 指针 p 指向数组 a 的首地址
```
接下来,用指针实现各个数组元素的输入,可以借助 scanf 函数和指针的特性,用循环语句实现,代码如下:
```c
for (p = a; p < a + M; p++) {
scanf("%d", p); // 使用指针 p 输入数组元素
}
```
然后,用指针访问各个数组元素实现选择法排序,我们可以借助选择排序的思想,用两个指针 p 和 q 分别指向当前未排序的部分中的最小值和当前未排序的部分的第一个元素,然后不断地交换它们的值,完成排序。代码如下:
```c
for (i = 0; i < M - 1; i++) {
q = &a[i]; // 假设最小元素的位置
for (p = &a[i + 1]; p < a + M; p++) {
if (*p < *q) { // 找出未经排序的数据中最小的一个
q = p;
}
}
temp = a[i]; a[i] = *q; *q = temp; // 交换当前最小值和当前未排序的部分的第一个元素
}
```
最后,输出排序结果,可以用循环语句和 printf 函数实现,代码如下:
```c
printf("\n选择法排序后数列:\n");
for (p = a; p < a + M; p++) {
printf("%4d", *p); // 输出排序结果
}
```
整个程序的完整代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 20
int main() {
int a[M], i, temp, *p, *q;
p = a; // 指针 p 指向数组 a 的首地址
srand((unsigned)time(NULL));
printf("随机产生%d个整数:\n", M);
for (p = a; p < a + M; p++) {
*p = rand() % 100 + 1; // 随机产生 1-100 的整数
printf("%4d", *p);
}
for (i = 0; i < M - 1; i++) {
q = &a[i]; // 假设最小元素的位置
for (p = &a[i + 1]; p < a + M; p++) {
if (*p < *q) { // 找出未经排序的数据中最小的一个
q = p;
}
}
temp = a[i]; a[i] = *q; *q = temp; // 交换当前最小值和当前未排序的部分的第一个元素
}
printf("\n选择法排序后数列:\n");
for (p = a; p < a + M; p++) {
printf("%4d", *p); // 输出排序结果
}
return 0;
}
```
希望这个例子能够帮助你更好地理解数组和指针的操作。
阅读全文