/* 有序表的增删改查操作 */
#include<stdio.h>
#define MAXN 10000 /* 定义符号常量表示数组a的长度 */
int Count = 0; /* 用全局变量Count表示数组a中待处理的元素个数 */
void select(int a[], int option, int value); /* 决定对有序数组a进行何种操作的控制函数 */
int input_array(int a[ ]); /* 输入有序数组a的函数 */
void print_array(int a[ ]); /* 输出有序数组a的函数 */
int insert(int a[ ], int value); /* 在有序数组a中插入一个值为value的元素的函数 */
int del(int a[ ], int value); /* 删除有序数组a中等于value的元素的函数 */
int modify(int a[ ], int value1, int value2); /* 将有序数组a中等于value1的元素,替换为value2 */
int query(int a[ ], int value); /* 用二分法在有序数组a中查找元素value的函数 */
int main(void)
{
int option, value, a[MAXN];
if(input_array(a) == -1){ /* 调用函数输入有序数组 a */
printf("Error"); /* a不是有序数组,则输出相应的信息 */
return 0;
}
printf("[1] Insert\n"); /* 以下4行显示菜单*/
printf("[2] Delete\n");
printf("[3] Update\n");
printf("[4] Query\n");
printf("[Other option] End\n");
while (1) { /* 循环 */
scanf("%d", &option); /* 接受用户输入的编号 */
if (option < 1 || option > 4) { /* 如果输入1、2、3、4以外的编号,结束循环 */
break;
}
scanf("%d", &value); /* 接受用户输入的参数value */
select(a, option, value); /* 调用控制函数 */
printf("\n");
}
printf("Thanks."); /* 结束操作 */
return 0;
}
/* 控制函数 */
void select(int a[ ], int option, int value)
{
int index, value2;
switch (option) {
case 1:
index = insert(a, value); /* 调用插入函数在有序数组 a 中插入元素value */
if(index == -1){ /* 插入数据已存在,则输出相应的信息 */
printf("Error");
}else{
print_array(a); /* 调用输出函数,输出插入后的有序数组a */
}
break;
case 2:
index = del(a, value); /* 调用删除函数在有序数组 a 中删除元素value */
if(index == -1){ /* 没找到value,则输出相应的信息 */
printf("Deletion failed.");
}else{
print_array(a); /* 调用输出函数,输出删除后的有序数组a */
}
break;
case 3:
scanf("%d", &value2); /* 接受用户输入的参数value2 */
index = modify(a, value, value2); /* 调用修改函数在有序数组 a 中修改元素value的值为value2 */
if(index == -1){ /* 没找到value或者vaule2已存在,则输出相应的信息 */
printf("Update failed.");
}else{
print_array(a); /* 调用输出函数,输出修改后的有序数组a */
}
break;
case 4:
index = query(a, value); /* 调用查询函数在有序数组 a 中查找元素value */
if(index == -1){ /* 没找到value,则输出相应的信息 */
printf( "Not found.");
}else{ /* 找到,则输出对应的下标 */
printf("%d", index);
}
break;
}
}
/* 有序表输入函数 */
int input_array(int a[ ])
{
scanf("%d", &Count);
for (int i = 0; i < Count; i ++) {
scanf("%d", &a[i]);
if(i > 0 && a[i] <= a[i-1]){ /* a不是有序数组 */
return -1;
}
}
return 0;
}
/* 有序表输出函数 */
void print_array(int a[ ])
{
for (int i = 0; i < Count; i ++) { /* 输出时相邻数字间用一个空格分开,行末无空格 */
if(i == 0){
printf("%d", a[i]);
}else{
printf(" %d", a[i]);
}
}
}
/* 请在这里填写答案 */
int insert(int a[ ], int value){
int i;
for ( i = 0; i < Count; i++)
{
if (value == a[i]) return -1;
if (value<a[i])
{
int j = Count;
for ( j = Count; j > i; j--)
{
a[j]=a[j-1];
}
a[i]=value;
Count++;
return 1;
}
}
a[i]=value;
Count++;
return 1;
}
int del(int a[ ], int value){
int i;
for ( i = 0; i < Count; i++)
{
if (value == a[i]){
int j = Count;
for ( j = i; j < Count-1; j++)
{
a[j]=a[j+1];
}
Count--;
return 1;
}
}
return -1;
}
int modify(int a[ ], int value1, int value2){
if(value1 == value2) return 1;
int i;
for ( i = 0; i < Count; i++)
{
if (value2 == a[i]){
return -1;
}
}
if(del(a,value1)!=-1&&insert(a,value2)!=-1){
return 1;
}
return -1;
}
int query(int a[ ], int value){
int left=0;
int right=Count-1;
int mid=(left+right)/2;
while (left<=right)
{
if(a[mid]==value) return mid;
if (a[mid]<value)
{
left=mid+1;
mid=(left+right)/2;
}else if(a[mid]>value){
right=mid-1;
mid=(left+right)/2;
}
}
return -1;
}
没有合适的资源?快使用搜索试试~ 我知道了~
PTA - 副本.zip
共120个文件
c:119个
exe:1个
需积分: 0 0 下载量 198 浏览量
2023-12-11
19:48:54
上传
评论
收藏 98KB ZIP 举报
温馨提示
PTA - 副本.zip
资源推荐
资源详情
资源评论
收起资源包目录
PTA - 副本.zip (120个子文件)
习题10-11 有序表的增删改查操作.c 6KB
习题11-7 奇数值结点链表.c 2KB
习题11-8 单链表结点删除.c 2KB
习题6-3 使用函数输出指定范围内的完数.c 1KB
习题5-6 使用函数输出水仙花数.c 1KB
习题9-6 按等级统计学生成绩.c 1KB
习题8-6 删除字符.c 1020B
习题6-5 使用函数验证哥德巴赫猜想.c 1000B
习题8-9 分类统计各类字符个数.c 913B
习题7-5 找鞍点.c 910B
习题6-1 分类统计字符个数.c 897B
习题6-7 简单计算器.c 896B
习题6-4 使用函数输出指定范围内的Fibonacci数.c 846B
习题9-5 通讯录排序.c 826B
练习3-8 查询水果价格.c 807B
习题5-4 使用函数求素数和.c 799B
习题7-8 字符串转换成十进制整数.c 780B
习题8-4 报数.c 770B
习题9-4 查找书籍.c 766B
练习11-4 字符定位(最后一次找到的字符).c 763B
习题11-5 指定位置输出字符串.c 757B
习题7-3 判断上三角矩阵.c 748B
习题11-6 查找子串.c 747B
习题4-9 打印菱形图案.c 727B
练习4-6 猜数字游戏.c 706B
习题5-8 空心的数字金字塔.c 704B
习题11-3 计算最长的字符串长度.c 698B
习题4-6 水仙花数 .c 661B
习题8-8 判断回文字符串.c 660B
习题7-1 选择法排序.c 655B
习题8-3 数组循环右移.c 653B
习题8-2 在数组中查找指定元素.c 642B
习题3-4 统计学生成绩.c 642B
练习3-4 统计字符.c 637B
习题7-2 求一批整数中出现最多的个位数字.c 629B
习题10-1 判断满足条件的三位数.c 623B
习题9-2 计算两个复数之积.c 617B
习题5-7 使用函数求余弦函数的近似值.c 616B
练习7-8 方阵循环右移.c 608B
习题5-5 使用函数统计指定数字的个数.c 608B
练习5-3 字符金字塔.c 582B
习题6-2 使用函数求特殊a串数列和.c 561B
练习4-11 统计素数并求和.c 557B
习题11-2 查找星期.c 548B
练习8-8 移动字母.c 538B
习题8-10 输出学生成绩.c 533B
习题8-5 使用函数实现字符串部分复制.c 532B
习题8-7 字符串排序.c 532B
习题11-4 字符串的连接.c 521B
习题10-2 递归求阶乘和.c 513B
习题11-1 输出月份英文名.c 493B
习题8-1 拆分实数的整数与小数部分.c 490B
练习3-3 统计学生平均成绩与及格人数.c 467B
习题7-4 求矩阵各行元素之和.c 467B
习题7-6 统计大写辅音字母.c 463B
习题5-3 使用函数计算两点间的距离.c 460B
练习3-7 成绩转换.c 457B
习题10-8 递归实现顺序输出整数.c 452B
练习8-2 计算两数的和与差.c 445B
习题10-7 十进制转换二进制.c 443B
练习7-2 求最大值及其下标.c 427B
练习3-5 输出闰年.c 422B
习题4-5 换硬币.c 422B
习题10-4 递归求简单交错幂级数的部分和.c 420B
练习7-3 将数组中的数逆序存放.c 412B
练习7-7 矩阵运算.c 409B
习题6-6 使用函数输出一个整数的逆序数.c 398B
练习2-12 输出华氏-摄氏温度转换表.c 395B
习题10-3 递归实现指数函数.c 392B
习题10-5 递归计算Ackermenn函数.c 391B
习题9-1 时间换算.c 382B
练习7-11 字符串逆序.c 379B
练习7-10 查找指定字符.c 378B
习题3-1 比较大小.c 364B
练习2-3 输出倒三角图案.c 362B
习题4-11 兔子繁衍问题.c 358B
练习5-1 求m到n之和.c 347B
习题5-1 符号函数.c 346B
练习7-9 计算天数.c 343B
习题4-8 高空坠球.c 343B
习题4-2 求幂级数展开的部分和.c 341B
习题3-2 高速公路超速处罚.c 340B
练习4-3 求给定精度的简单交错序列部分和.c 325B
习题2-2 阶梯电价.c 318B
习题4-3 求分数序列前N项和.c 315B
练习2-18 求组合数.c 309B
习题2-4 求交错序列前N项和.c 306B
习题3-3 出租车计价.c 302B
练习6-3 英文字母替换加密(大小写转换+后移1位).c 300B
练习4-10 找出最小值.c 300B
习题9-3 平面向量加法.c 299B
习题10-6 递归求Fabonacci数列.c 280B
习题4-7 最大公约数和最小公倍数.c 280B
练习2-15 求简单交错序列前N项和.c 280B
练习10-1 使用递归函数计算1到n之和.c 276B
习题2-1 求整数均值.c 265B
练习5-2 找两个数中最大者.c 265B
习题7-7 字符串替换.c 261B
练习2-13 求N分之一序列前N项和 copy.c 261B
习题2-6 求阶乘序列前N项和.c 260B
共 120 条
- 1
- 2
资源评论
mingyu
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功