有序数表简单操作

本题要求实现支持重复元素的有序表。首先输入一个正整数N(1≤N≤100)和N个元素,然后在屏幕上显示以下菜单(编号和选项):

[1] Insert
[2] Delete
[3] Query
[Other option] End

用户可以反复对该有序表进行插入、删除和查找操作,也可以选择结束。当用户输入编号1~3和相关参数时,将分别对该有序表进行插入、删除和查找操作,输入其他编号,则结束操作。

本题要求实现4个函数,分别为生成有序表、在有序表(数组)中插入、删除、查找一个值。

函数接口定义:

void input_array(int a[ ]);
void insert(int a[ ], int value);
void delete(int a[ ], int value);
void query(int a[ ], int value);

函数input_array输入正整数N和N个元素并且生成可重复的有序表。

函数insert在有序数组a中插入一个值为value的元素。如果Count等于MAXN,则不插入。

函数delete删除有序数组a中所有等于value的元素。如果未找到该元素,则输出This element does not exist.

函数query用二分法在有序数组a中查找元素value第一次出现的位置,如果找到,则输出相应的下标;如果没有找到,则输出This element does not exist.

裁判测试程序样例:

#include 
#define MAXN 100
int Count = 0;
void input_array(int a[]);
void print_array(int a[]);
void select(int a[ ], int option, int value);
void insert(int a[], int value);
void delete(int a[], int value);
void query(int a[], int value);
int main(void)
{
    int option, value, a[MAXN];

    input_array(a);

    printf("[1] Insert\n");
    printf("[2] Delete\n");
    printf("[3] Query\n");
    printf("[Other option] End\n");
    while (1) {
        scanf("%d", &option);
        if (option < 1 || option > 3) {
            break;
        }
        scanf("%d", &value);
        select(a, option, value);
    }
    printf("Thanks.");

    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]);
        }
    }
    printf("\n");
}
void select(int a[ ], int option, int value)
{
    switch (option) {
    case 1:
        insert(a, value);print_array(a);
        break;
    case 2:
        delete(a, value);print_array(a);
        break;
    case 3:
        query(a, value);
        break;
    }
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

7 3 -2 7 101 9 400 9
1 96
1 7
3 9
2 9
2 9
3 101
3 9
0
输出样例:
在这里给出相应的输出。例如
[1] Insert
[2] Delete
[3] Query
[Other option] End
-2 3 7 9 9 96 101 400
-2 3 7 7 9 9 96 101 400
The index is: 4
-2 3 7 7 96 101 400
This element does not exist.
-2 3 7 7 96 101 400
The index is: 5
This element does not exist.
Thanks.

以下为代码:

void input_array(int a[ ])
{
    int i = 0;
    int j;
    int temp;
    
    scanf("%d", &Count);
    for( i = 0; i < Count; i++)
    {
        scanf("%d", &a[i]);
    }
    for(i = 0; i < Count - 1; i++)
    {
        for(j = 0; j < Count - i -1; j++)
        {
            if(a[j] > a[j+1])
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}

void insert(int a[ ], int value)
{
    int i, j;
    
    for(i = 0; i < Count; i++)
    {
        if(a[i] > value)
            break;
    }
    
    for(j = Count; j > i; j--)
    {
        a[j] = a[j-1];
    }
    a[i] = value;
    Count++;
}

void delete(int a[ ], int value)
{
    int index = -1;
    int i, j;
    int k = 0;
    
    for(i = 0; i < Count; i++){
        if(a[i] == value){
            index = i;
            j = i;
            break;
        }
    }
    
    while(a[i] == value && i < Count){
        k++;
        i++;
    }
    
    if(index == -1){
        printf("This element does not exist.\n");
        return;
    }
    else{
        for(i = index; i < Count - 1; i++)
            a[i] = a[i+k];
        Count -= k;
    }
}

void query(int a[ ], int value)
{
    int mid;
    int left = 0;
    int right = Count - 1;
    
    while(left <= right){
        mid = (left + right) / 2;
        if(a[mid] == value){
            printf("The index is: %d\n", mid);
            return;
        }
        else if(a[mid] < value)
            left = mid + 1;
        else
            right = mid - 1;
    }
    printf("This element does not exist.\n");
}

你可能感兴趣的:(c语言,开发语言,后端)