zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)65 链式表操作集 (20分)

    本题要求实现链式表的操作集。

    函数接口定义:

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

    其中List结构定义如下:

    typedef struct LNode *PtrToLNode;
    struct LNode {
        ElementType Data;
        PtrToLNode Next;
    };
    typedef PtrToLNode Position;
    typedef PtrToLNode List;
    

    各个操作函数的定义为:

    Position Find( List L, ElementType X ):返回线性表中首次出现X的位置。若找不到则返回ERROR;

    List Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;

    List Delete( List L, Position P ):将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ERROR NULL
    typedef int ElementType;
    typedef struct LNode *PtrToLNode;
    struct LNode {
        ElementType Data;
        PtrToLNode Next;
    };
    typedef PtrToLNode Position;
    typedef PtrToLNode List;
    
    Position Find( List L, ElementType X );
    List Insert( List L, ElementType X, Position P );
    List Delete( List L, Position P );
    
    int main()
    {
        List L;
        ElementType X;
        Position P, tmp;
        int N;
    
        L = NULL;
        scanf("%d", &N);
        while ( N-- ) {
            scanf("%d", &X);
            L = Insert(L, X, L);
            if ( L==ERROR ) 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 {
                L = Delete(L, P);
                printf("%d is found and deleted.\n", X);
                if ( L==ERROR )
                    printf("Wrong Answer or Empty List.\n");
            }
        }
        L = Insert(L, X, NULL);
        if ( L==ERROR ) printf("Wrong Answer\n");
        else
            printf("%d is inserted as the last element.\n", X);
        P = (Position)malloc(sizeof(struct LNode));
        tmp = Insert(L, X, P);
        if ( tmp!=ERROR ) printf("Wrong Answer\n");
        tmp = Delete(L, P);
        if ( tmp!=ERROR ) printf("Wrong Answer\n");
        for ( P=L; 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 

    Position Find(List L, ElementType X)

    {

        while (L)

        {

            if (L->Data == X)

                return L;

            if (L->Data != X)

                L = L->Next;

        }

        return ERROR;

    }在顺序表中是一次性申请好所有的空间,在插入的时候无需重新申请空间,而在链式表中每插入一次数据都要申请一次空间

    //注意:

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

    {

        List temp = (List)malloc(sizeof(struct LNode));//注意申请空间的格式写法

        temp->Next = NULL;

        temp->Data = X;

        List head = L;//无论L链表如何改变,最终返回的都是链表的表头,所以使用head记录链表的表头

        if (P == L)//如果是在头结点插入的话要另外处理

        {

            temp->Next = L;

            return temp;

        }

        while (L->Next)

        {

            if (P == L->Next)

            {

                temp->Next = L->Next;//注意插入的顺序

                L->Next = temp;

                return head;

            }

            L = L->Next;

        }

        if (P == NULL)//指向链表中的最后一个

        {

            L->Next = temp;

            return head;

        }

        else

        {

            printf("Wrong Position for Insertion\n");

            return ERROR;

        }

    }

    List Delete(List L, Position P)

    {

        List temp,pre,head;

        if (P == L)//删除节点在开头的情况

        {

            temp = L;

            L = L->Next;

            free(temp);

            return L;

        }

        head = L;

        if (L->Next)

            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 head;

            }

            if (L->Next == P&&L->Next->Next == NULL)//特别讨论一下删除最后一个节点的情况

            {

                temp = L->Next;

                L->Next = NULL;

                free(temp);

                return head;

            }

            pre = pre->Next;

            L = L->Next;

        }

        printf("Wrong Position for Deletion\n");

        return ERROR;

    }

  • 相关阅读:
    thinkphp 前后端分离
    git常用命令总结
    DIV常用属性大全
    shell编程学习之使用jq对json数据进行提取
    shell编程之if语句
    shell编程之变量赋值
    【总结】sqli-labs Less(1-35) 小结
    【总结】sqlmap常用命令
    【总结】kali(amd64)中安装nessus
    【总结】ettercap工具之DNS劫持
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789047.html
Copyright © 2011-2022 走看看