PTA 6-2シーケンシャルテーブル操作セット


この問題のテーマは簡単ですが、私はずっと判断条件を書き間違えました.私は境界条件を判断したif(P>L->Last+1‖P<0)をif(P>MAXISIZE‖P<0)と書き間違えて比較してから自分の問題を発見したのではないでしょうか.自分で一歩調整してもいいと思っていましたが、本当に怠け者ですが、この間違いはよく発見されました.自分がこれから順番表でこのような低級な間違いを犯さないことを望んでいます.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 ); リスト構造は以下のように定義される.
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に戻ります.
審判試験プログラムのサンプル:
#include 
#include 

#define MAXSIZE 5
#define ERROR -1
typedef enum {false, true} bool;
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /*                 */
};

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

int main()
{
    List L;
    ElementType X;
    Position P;
    int N;
L = MakeEmpty();
scanf("%d", &N);
while ( N-- ) {
    scanf("%d", &X);
    if ( Insert(L, X, 0)==false )
        printf(" Insertion Error: %d is not in.
", X); } scanf("%d", &N); while ( N-- ) { scanf("%d", &X); P = Find(L, X); if ( P == ERROR ) printf("Finding Error: %d is not in.
", X); else printf("%d is at position %d.
", X, P); } scanf("%d", &N); while ( N-- ) { scanf("%d", &P); if ( Delete(L, P)==false ) printf(" Deletion Error.
"); if ( Insert(L, 0, P)==false ) printf(" Insertion Error: 0 is not in.
"); } return 0;

}
/*あなたのコードはここに埋め込まれます*/入力サンプル:
6 1 2 3 4 6 3 6 6 5 1 2-16出力サンプル:
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.
List MakeEmpty(){/* How to define empty? Should it be initialized? */
    List L;
    L = (List)malloc(sizeof(struct LNode)); //Don't forget "struct" unless you already use typedef
    L->Last = -1;
    return L;
}//L->last: 0 - 4

Position Find(List L,ElementType X){
   Position i;
    for( i = 0; i <= L->Last; i++){
        if (L->Data[i] == X) {
        /* Realize my mistake here, i use MAXSIZE-1 instead of L->Last! A wrong use!*/
            break;
        }
    }
    if(i > (L->Last))
      return ERROR;
    else return i;
}

bool Insert(List L, ElementType X,Position P){
    if(L->Last == MAXSIZE-1){
        printf("FULL"); 
        return false;
    }
    if(P > L->Last+1 || P<0){
        printf("ILLEGAL POSITION");
        return false;
    }
    for(int i=(L->Last); i>=P; i--){   /* put back */
        L->Data[i+1] = L->Data[i];
    }
    L->Data[P] = X;
    L->Last = L->Last + 1;
    return true;
}

bool Delete(List L, Position P){
    if(P>L->Last|| P<0){
        printf("POSITION %d EMPTY",P);
        return false;
    }else{
        for(Position i=P; i<=L->Last; i++)
            L->Data[i] = L->Data[i+1];
        L->Last = L->Last -1;
    }
    return true;
}