• 数据结构与算法题目集(中文)6-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
    ");
        }
        scanf("%d", &N);
        while ( N-- ) {
            scanf("%d", &X);
            P = Find(L, X);
            if ( P == ERROR )
                printf("Finding Error: %d is not in.
    ", X);
            else {
                flag = Delete(L, P);
                printf("%d is found and deleted.
    ", X);
                if ( flag==false )
                    printf("Wrong Answer.
    ");
            }
        }
        flag = Insert(L, X, NULL);
        if ( flag==false ) printf("Wrong Answer
    ");
        else
            printf("%d is inserted as the last element.
    ", X);
        P = (Position)malloc(sizeof(struct LNode));
        flag = Insert(L, X, P);
        if ( flag==true ) printf("Wrong Answer
    ");
        flag = Delete(L, P);
        if ( flag==true ) printf("Wrong Answer
    ");
        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)

        {

            if (L->Data == X)

                return L;

            if (L->Data != X)

                L = L->Next;

        }

        return ERROR;

    }

    bool Insert(List L, ElementType X, Position P)

    {

        List temp = (List)malloc(sizeof(struct LNode));

        temp->Next = NULL;

        temp->Data = X;

    //与6-5的区别就是在这里,不用讨论插入是头节点的情况

        while (L->Next)

        {

            if (P == L->Next)

            {

                temp->Next = L->Next;

                L->Next = temp;

                return true;

            }

            L = L->Next;

        }

        if (P == NULL)

        {

            L->Next = temp;

            return true;

        }

        else

        {

            printf("Wrong Position for Insertion ");

            return false;

        }

    }

    bool Delete(List L, Position P)

    {

        List temp, pre;

            pre = L->Next;

        while (L->Next)

        {

            if (L->Next == P&&L->Next->Next != NULL)

            {

                temp = L->Next;

                pre = L->Next->Next;

                L->Next = pre;

                free(temp);

                return true;

            }

            if (L->Next == P&&L->Next->Next == NULL)

            {

                temp = L->Next;

                L->Next = NULL;

                free(temp);

                return true;

            }

            pre = pre->Next;

            L = L->Next;

        }

        printf("Wrong Position for Deletion ");

        return false;


     

    }

  • 相关阅读:
    封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的
    这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!
    JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
    一个实战系统的权限架构思维推导过程
    股灾情形下搞了个满堂红,我也是醉了
    VBC#代码互转工具
    DSAPI多功能.NET函数库组件
    DS标签控件文本解析格式
    DSAPI官方QQ群
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789046.html
Copyright © 2020-2023  润新知