有序表的增删改查操作
int query(int a[],int value)
{
int right=Count-1,left=0;
int flag=0;
int mid=(right+left)/2;
if(value<a[mid]){right=mid-1;}
else if(value>a[mid]){left=mid+1;}
else{flag=1;return mid;}
if(flag==0){return -1;}
}
int insert(int a[],int value)
{
if(query(a,value)!=-1){return -1;}
int i;
for(i=0;;i++)
{if(a[i]>value){break;}}
int j;
for(j=Count;j>i;j--)
{a[j]=a[j-1];}
a[i]=value;
}
int del(int a[],int value)
{
if(query(a,value)==-1){return -1;}
int j;
for(j=query(a,value);j<Count-1;j++)
{
if(query(a,value)==Count-1)
{Count = Count-1;}
else{a[j]=a[j+1];}
}
}
int modify(int a[],int value1,int value2)
{
if((query(a,value1)==-1)||(query(a,value2)!=-1))
{return -1;}
a[query(a,value1)]=value2;
}
错误代码见上
correction
#include <stdio.h>
#define MAX_SIZE 100 // 数组最大容量
int a[MAX_SIZE]; // 存储数据的数组
int Count = 0; // 当前元素数量
// 二分查找元素,返回索引或-1
int query(int a[], int value) {
int left = 0;
int right = Count - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
// 插入元素,成功返回0,失败返回-1
int insert(int a[], int value) {
if (query(a, value) != -1) {
return -1; // 元素已存在
}
if (Count >= MAX_SIZE) {
return -1; // 数组已满
}
int i;
for (i = 0; i < Count; i++) {
if (a[i] > value) {
break;
}
}
for (int j = Count; j > i; j--) {
a[j] = a[j - 1];
}
a[i] = value;
Count++;
return 0;
}
// 删除元素,成功返回0,失败返回-1
int del(int a[], int value) {
int pos = query(a, value);
if (pos == -1) {
return -1;
}
for (int j = pos; j < Count - 1; j++) {
a[j] = a[j + 1];
}
Count--;
return 0;
}
// 修改元素,成功返回0,失败返回-1
int modify(int a[], int value1, int value2) {
if (query(a, value1) == -1 || query(a, value2) != -1) {
return -1;
}
int pos = query(a, value1);
a[pos] = value2;
return 0;
}
// 测试代码
int main() {
// 测试插入
insert(a, 5);
insert(a, 3);
insert(a, 7);
printf("Array after inserts: ");
for (int i = 0; i < Count; i++) {
printf("%d ", a[i]);
}
printf("\n");
// 测试查询
int pos = query(a, 3);
printf("Position of 3: %d\n", pos);
// 测试修改
modify(a, 3, 4);
printf("After modify 3->4: ");
for (int i = 0; i < Count; i++) {
printf("%d ", a[i]);
}
printf("\n");
// 测试删除
del(a, 5);
printf("After delete 5: ");
for (int i = 0; i < Count; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
上述代码正确但通不过OJ
主要是modify函数;
modify函数
int modify(int a[], int value1, int value2) {
if (query(a, value1) == -1 || query(a, value2) != -1) {
return -1;
}
del(a,value1);
insert (a,value2);
return 0;
}
查看2道真题和解析