题目:
要求根据顺序表定义和已有操作,编码完成其他的10个操作。
顺序表的定义和已有操作:
#define N 10
typedef int ElemType;
typedef struct{
ElemType data[N];
int last;
}SeqList;
SeqList * InitList();
void TraverseList(SeqList * list);
需要你来编写的其他操作:
// 插入成功则返回0。如果pos非法则返回-1。如果顺序表已满则返回-2。
// 第1个测试点的数据用于评测本函数。
int ListInsert(SeqList * list, int pos, ElemType value);// 成功删除则返回0。如果pos非法则返回-1。如果顺序表为空则返回-2。
// 第2个测试点的数据用于评测本函数。
int ListDelete(SeqList * list, int pos);// 找到数据元素old_value并修改为new_value,如果修改成功则返回0, 否则返回-1。
// 第3个测试点的数据用于评测本函数。
int ListModify(SeqList * list, ElemType old_value, ElemType new_value);// 返回数据元素value对应的下标。如果不存在该元素,则返回-1。
// 第4个测试点的数据用于评测本函数。
int ListPosition(SeqList * list, ElemType value);// 删除顺序表中重复的数据元素。返回值是被删除元素的个数
// 第5个测试点的数据用于评测本函数。
int ListPurge(SeqList * list);// 合并顺序表list1和list2:把list2的元素(如果该元素在list1中已经存在则不需要合并)依次插入到list1的末尾。
// 返回值是list2插入到list1的元素个数。
// 第6个测试点的数据用于评测本函数。
int MergeList(SeqList * list1, SeqList * list2);// 重置(清空)顺序表
// 第7个测试点的数据用于评测本函数。
void ResetList(SeqList * list);// 如果顺序表为空,则返回1,否则返回0。
// 第8个测试点的数据用于评测本函数。
int IsListEmpty(SeqList * list);// 如果顺序表已满则返回1,否则返回0。
// 第9个测试点的数据用于评测本函数。
int IsListFull(SeqList * list);// 返回顺序表的长度
// 第10个测试点的数据用于评测本函数。
int ListLength(SeqList * list);
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>#define N 10
typedef int ElemType;
typedef struct{
ElemType data[N];
int last;
}SeqList;SeqList * InitList();
void TraverseList(SeqList * list);
int IsListFull(SeqList * list);
int ListInsert(SeqList * list, int pos, ElemType value);
void ResetList(SeqList * list);
int IsListEmpty(SeqList * list);
int ListDelete(SeqList * list, int pos);
int ListLength(SeqList * list);
int ListPosition(SeqList * list, ElemType value);
int ListModify(SeqList * list, ElemType old_value, ElemType new_value);
int ListPurge(SeqList * list);
int MergeList(SeqList * list1, SeqList * list2);SeqList * InitList()
{
SeqList * list = (SeqList *)malloc(sizeof(SeqList));
list->last = -1;
return list;
}void TraverseList(SeqList * list)
{
int i;
printf("[");
for(i = 0;i <= list->last;i++){
printf("%d ", list->data[i]);
}
printf("]\n");
}int main()
{
int i, n, opt, pos, data, old_value, new_value;
SeqList * list = InitList();
SeqList * list2 = InitList();do{
scanf("%d", &opt);
if(opt == 1){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d %d", &pos, &data);
printf("%d\n", ListInsert(list, pos, data));
TraverseList(list);
}
}else if(opt == 2){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d", &pos);
printf("%d\n", ListDelete(list, pos));
TraverseList(list);
}
}else if(opt == 3){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d %d", &old_value, &new_value);
printf("%d\n", ListModify(list, old_value, new_value));
TraverseList(list);
}
}else if(opt == 4){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d", &data);
printf("%d\n", ListPosition(list, data));
TraverseList(list);
}
}else if(opt == 5){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d %d", &pos, &data);
printf("%d\n", ListInsert(list, pos, data));
}
TraverseList(list);
printf("%d\n", ListPurge(list));
TraverseList(list);
}else if(opt == 6){
scanf("%d", &n);
for(i = 0;i < n;i++){
scanf("%d %d", &pos, &data);
printf("%d\n", ListInsert(list2, pos, data));
}
printf("%d\n", MergeList(list, list2));
TraverseList(list);
TraverseList(list2);
}else if(opt == 7){
ResetList(list);
TraverseList(list);
}else if(opt == 8){
printf("%d\n", IsListEmpty(list));
}else if(opt == 9){
printf("%d\n", IsListFull(list));
}else if(opt == 10){
printf("%d\n", ListLength(list));
}
}while(opt != 0);
return 0;
}/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1
3
0 300
3 200
0 100
0
输出样例:
在这里给出相应的输出。例如:
0
[300 ]
-1
[300 ]
0
[100 300 ]
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
答案:
int ListInsert(SeqList * list, int pos, ElemType value) {
if (pos < 0 || pos > list->last + 1) {
return -1;
} if (list->last == N - 1) {
return -2;
}
for (int i = list->last; i >= pos; i--) {
list->data[i+1] = list->data[i];
}
list->data[pos] = value;
list->last++;
return 0;
}
int ListDelete(SeqList * list, int pos) {
if (pos < 0 || pos > list->last) {
return -1;
}
if (list->last == -1) {
return -2;
}
for (int i = pos; i < list->last; i++) {
list->data[i] = list->data[i + 1];
}
list->last--;
return 0;
}
int ListModify(SeqList * list, ElemType old_value, ElemType new_value) {
for (int i = 0; i <= list->last; i++) {
if (list->data[i] == old_value) {
list->data[i] = new_value;
return 0;
}
}
return -1;
}
int ListPosition(SeqList * list, ElemType value){
int i = 0;
for (i = 0; i <= list->last; i++) {
if (list->data[i] == value) {
return i;
}
}
return -1;
}
int ListPurge(SeqList * list) {
int count = 0, i = 0, j = 0;
for (i = 0; i < list->last; i++) {
for (j = i + 1; j <= list->last; j++) {
if (list->data[i] == list->data[j]) {
ListDelete(list, j);
count++;
j--;
}
}
}
return count;
}
int MergeList(SeqList * list1, SeqList * list2) {
int num = 0;
for (int i = 0; i <= list2->last; i++) {
if (ListPosition(list1, list2->data[i]) == -1) {
ListInsert(list1, list1->last + 1, list2->data[i]);
num++;
}
}
return num;
}
void ResetList(SeqList * list) {
list->last = -1;
}
int IsListEmpty(SeqList * list) {
if (list->last == -1) {
return 1;
} else {
return 0;
}
}
int IsListFull(SeqList * list) {
if (list->last == N - 1) {
return 1;
} else {
return 0;
}
}
int ListLength(SeqList * list) {
return list->last + 1 ;
}