有序表的增删改查操作

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务