6-6 带头结点的链式表操作集(20 point(s))

来源:互联网 发布:javashop最新源码下载 编辑:程序博客网 时间:2024/05/20 07:32

6-6 带头结点的链式表操作集(20 point(s))

本题要求实现带头结点的链式表操作集。

函数接口定义:

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 NULLtypedef 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;}/* 你的代码将被嵌在这里 */

输入样例:

612 2 4 87 10 242 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 InsertionWrong Position for Deletion10 4 2 5code:具体解释在代码注释中
List MakeEmpty(){    List L = (List)malloc(sizeof(struct LNode));//malloc创建头节点    L->Next = NULL;//初始化为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;//创建新节点赋值X,下一个为P位置    while(L!=NULL){        if(L->Next==P){//找到位置的前一个           L->Next = q;//L的下一个指向新节点           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;//直接让L的下一个指向删除位置节点下一个            return true;        }        L = L->Next;    }    printf("Wrong Position for Deletion\n");    return false;}