6-12 有序表的简单增删查操作

首先输入一个正整数N(1≤N≤1000)和一个无重复元素的、从小到大排列的、N个元素的有序表,然后在屏幕上显示以下菜单(编号和选项):

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

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

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

函数接口定义:

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

函数insert在有序数组a中插入一个值为value的元素,并调用函数print_array(a)输出插入后的有序数组a 。

函数delete删除有序数组a中等于value的元素,并调用函数print_array(a)输出删除后的有序数组a ;如果在数组a中没有找到值为value的元素,则输出Deletion failed.

函数query用二分法在有序数组a中查找元素value,如果找到,则输出相应的下标;如果没有找到,则输出Not found.

裁判测试程序样例:

#include<stdio.h>
#define MAXN 1000
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的函数  */
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];

    if(input_array(a) == -1){ 
       return 0;
    }
    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("\n");
    }
    printf("Thanks.");

    return 0;
}
/* 控制函数 */
void select(int a[ ], int option, int value) 
{
    switch (option) {
        case 1:
          insert(a, value); 
            break;
        case 2:
            delete(a, value);  
            break;
        case 3:
            query(a, value);  
            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]){
            printf("Error");
            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]);
        }
    }
}

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

输入样例1:

插入一个值,输入数据如下:

6 -2 3 7 9 101 400
1
96
0

输出样例1:

[1] Insert
[2] Delete
[3] Query
[Other option] End
-2 3 7 9 96 101 400
Thanks.

输入样例2:

删除一个值,输入数据如下:

6 -2 3 7 9 101 400
2
400
0

输出样例2:

[1] Insert
[2] Delete
[3] Query
[Other option] End
-2 3 7 9 101
Thanks.

输入样例3:

查询一次,输入数据如下:

6 -2 3 7 9 101 400
3
-2
0

输出样例3:

[1] Insert
[2] Delete
[3] Query
[Other option] End
0
Thanks.

输入样例4:

连续增删查,输入数据如下:

6 -2 3 7 9 101 400
2
101
1
-10
3
101
0

输出样例4:

[1] Insert
[2] Delete
[3] Query
[Other option] End
-2 3 7 9 400
-10 -2 3 7 9 400
Not found.
Thanks.
void insert(int a[ ], int value){
	int i,j;
	for (i = 0;i < Count;i++){   //定位:找到待插入的位置 
		if (value < a[i]){
			break;
		}
	}
		for(j = Count - 1; j >= i;j--){   //腾位:将a[i]~a[Count-1]后移一位 
			a[j + 1] = a[j];			
		}
		a[i] = value;  //插入:将value的值赋给a[i] 
		Count++;       //将数组a中待处理的元素数量加一 	
		print_array(a);
}
void delete(int a[ ], int value){
	int i,index = -1;
	for (i = 0;i < Count;i++){  //for循环找出待删除的元素 
		if (value == a[i]){
			index = i;
			break;
		}
	}
	if (index == -1){       //未找到,输出Deletion failed.; 
		printf ("Deletion failed.");
		return;     //输出之后记得return 
	}else{
		for (i = index;i < Count - 1;i++){ //将a[Count-1]~a[i+1]向前移一位 
			a[i] = a[i + 1];
		}
	}
	Count--;
	print_array(a);
}
void query(int a[ ], int value){  //二分查找找函数 
	int mid,left = 0,right = Count - 1;  //全范围内查找 
	while (left <= right){
		mid = (left + right) / 2;   //取中间数来二分查找 
		if (value == a[mid]){
			printf ("%d",mid);
			return;       //老规矩,记得返回 
		}else if(value < a[mid]){  //判断向左查找还是向右查找
			right = mid -1; 
		}else{
			left = mid + 1;
		}
	}
		printf ("Not found.");  //最后输出即可 
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值