【PTA】6-2 顺序表操作集 (20分)

【PTA】6-2 顺序表操作集 (20分)

函数接口定义:

List MakeEmpty(); 
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );

其中  List结构定义如下:

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */
};

各个操作函数的定义为:

List MakeEmpty():创建并返回一个空的线性表;

Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;

bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;

bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。

裁判测试程序样例:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define MAXSIZE 5
 5 #define ERROR -1
 6 typedef enum {false, true} bool;
 7 typedef int ElementType;
 8 typedef int Position;
 9 typedef struct LNode *List;
10 struct LNode {
11     ElementType Data[MAXSIZE];
12     Position Last; /* 保存线性表中最后一个元素的位置 */
13 };
14 
15 List MakeEmpty(); 
16 Position Find( List L, ElementType X );
17 bool Insert( List L, ElementType X, Position P );
18 bool Delete( List L, Position P );
19 
20 int main()
21 {
22     List L;
23     ElementType X;
24     Position P;
25     int N;
26 
27     L = MakeEmpty();
28     scanf("%d", &N);
29     while ( N-- ) {
30         scanf("%d", &X);
31         if ( Insert(L, X, 0)==false )
32             printf(" Insertion Error: %d is not in.\n", X);
33     }
34     scanf("%d", &N);
35     while ( N-- ) {
36         scanf("%d", &X);
37         P = Find(L, X);
38         if ( P == ERROR )
39             printf("Finding Error: %d is not in.\n", X);
40         else
41             printf("%d is at position %d.\n", X, P);
42     }
43     scanf("%d", &N);
44     while ( N-- ) {
45         scanf("%d", &P);
46         if ( Delete(L, P)==false )
47             printf(" Deletion Error.\n");
48         if ( Insert(L, 0, P)==false )
49             printf(" Insertion Error: 0 is not in.\n");
50     }
51     return 0;
52 }
53 
54 /* 你的代码将被嵌在这里 */

输入样例:

6
1 2 3 4 5 6
3
6 5 1
2
-1 6

输出样例:

FULL Insertion Error: 6 is not in.
Finding Error: 6 is not in.
5 is at position 0.
1 is at position 4.
POSITION -1 EMPTY Deletion Error.
FULL Insertion Error: 0 is not in.
POSITION 6 EMPTY Deletion Error.
FULL Insertion Error: 0 is not in.

函数实现细节:

 1 List MakeEmpty(){
 2     List L=(List)malloc(sizeof(struct LNode));
 3     int n=MAXSIZE-1;
 4     while(n>=0) L->Data[n--]=0;
 5     L->Last=-1;
 6     return L; 
 7 }
 8 Position Find(List L,ElementType X){
 9     if(L==NULL)return ERROR;
10     int i=0;
11     for(;i<=L->Last;i++){
12         if(L->Data[i]==X)return i;
13     }
14     return ERROR;
15 }
16 bool Insert(List L,ElementType X,Position P){
17     if(L==NULL)return false;
18     if(L->Last==MAXSIZE-1){
19         printf("FULL");
20         return false;
21     }
22     if(P>L->Last+1||P<0){
23         printf("ILLEGAL POSITION");
24         return false;
25     }
26     for(int i=L->Last;i>=P;i--){
27         L->Data[i+1]=L->Data[i];
28     }
29     L->Last++;
30     L->Data[P]=X;
31     return true;
32 }
33 bool Delete( List L, Position P ){
34     if(L==NULL)return false;
35     if(P>L->Last||P<0){
36         printf("POSITION %d EMPTY",P);
37         return false;
38     }
39     int i;
40     for(i=P;i<=MAXSIZE-1;i++){
41         if(i==L->Last){
42             L->Data[i]=0;
43         }else{
44             L->Data[i]=L->Data[i+1];
45         }
46     }
47     L->Last--;
48     return true;
49 }

 

posted @ 2020-06-09 16:12  wyjgr  阅读(615)  评论(0编辑  收藏  举报