1. 程式人生 > >2-6 帶頭結點的鏈式表操作集 (20 分)

2-6 帶頭結點的鏈式表操作集 (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 struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

各個操作函式的定義為:

List MakeEmpty():建立並返回一個空的線性表;

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

bool Insert( List L, ElementType X, Position P ):將X插入在位置P指向的結點之前,返回true。如果引數P指向非法位置,則列印“Wrong Position for Insertion”,返回false;

bool Delete( List L, Position P )
:將位置P的元素刪除並返回true。若引數P指向非法位置,則列印“Wrong Position for Deletion”並返回false

裁判測試程式樣例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR NULL
typedef enum {false, true} bool;
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
}; typedef PtrToLNode Position; typedef PtrToLNode List; 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; bool flag; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); flag = Insert(L, X, L->Next); if ( flag==false ) printf("Wrong Answer\n"); } scanf("%d", &N); while ( N-- ) { scanf("%d", &X); P = Find(L, X); if ( P == ERROR ) printf("Finding Error: %d is not in.\n", X); else { flag = Delete(L, P); printf("%d is found and deleted.\n", X); if ( flag==false ) printf("Wrong Answer.\n"); } } flag = Insert(L, X, NULL); if ( flag==false ) printf("Wrong Answer\n"); else printf("%d is inserted as the last element.\n", X); P = (Position)malloc(sizeof(struct LNode)); flag = Insert(L, X, P); if ( flag==true ) printf("Wrong Answer\n"); flag = Delete(L, P); if ( flag==true ) printf("Wrong Answer\n"); for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data); return 0; } /* 你的程式碼將被嵌在這裡 */

輸入樣例:

6
12 2 4 87 10 2
4
2 12 87 5

輸出樣例:

2 is found and deleted.
12 is found and deleted.
87 is found and deleted.
Finding Error: 5 is not in.
5 is inserted as the last element.
Wrong Position for Insertion
Wrong Position for Deletion
10 4 2 5

List MakeEmpty(){
    List L = (List)malloc(sizeof(struct LNode));
    L->Next = NULL;
    return L;
}
Position Find( List L, ElementType X ){
    L = L->Next;
    while(L!=NULL){
        if(L->Data==X){
            return L;
        }
        L = L->Next;
    }
    return ERROR;
}
bool Insert( List L, ElementType X, Position P ){
    List q = (List)malloc(sizeof(struct LNode));
    q->Data = X;
    q->Next = P;
    while(L!=NULL){
        if(L->Next==P){
           L->Next = q;
           return true;
        }
        L = L->Next;
    }
    printf("Wrong Position for Insertion\n");
    return false;
}
bool Delete( List L, Position P ){
    while(L!=NULL){
        if(L->Next==P){
            L->Next = P->Next;
            return true;
        }
        L = L->Next;
    }
    printf("Wrong Position for Deletion\n");
    return false;
}