本题要求实现支持重复元素的有序表。首先输入一个正整数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 <stdio.h>
#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");
}

1401

被折叠的 条评论
为什么被折叠?



