1. 程式人生 > >資料結構及演算法——帶頭結點的鏈式表操作集(C語言)

資料結構及演算法——帶頭結點的鏈式表操作集(C語言)

要求實現帶頭結點的鏈式表操作集。

函式介面定義:

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 A;
    A=(List)malloc(sizeof(struct LNode));
    A->Next=NULL;
    return A;
}
Position Find(List L,ElementType X){
    Position p;
    p=L;
    for(;p->Data!=X&&p;p=p->Next);
    if(p==NULL)return ERROR;
    else return p;
}

bool Insert(List L,ElementType X,Position P){
    Position pre,r;

    for(pre=L;pre&&pre->Next!=P;pre=pre->Next);
    if(pre==NULL){
        printf("Wrong Position for Insertion");
        return false;
    }
    else{
        r=(Position)malloc(sizeof(struct LNode));
        r->Data=X;
        r->Next=P;
        pre->Next=r;
        return true;
    }
}
bool Delete(List L,Position P){
    Position pre;
    for(pre=L;pre&&pre->Next!=P;pre=pre->Next);
    if(pre==NULL||P==NULL){
        printf ("Wrong Position for Deletion");
        return false;
    }
    else{
        pre->Next=P->Next;
        free(P);
        return true;
        }
    }