zoukankan      html  css  js  c++  java
  • 6-6 带头结点的链式表操作集(20 分)

    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->Data = 0;
      L->Next = NULL;
      return L;
    }

    Position Find(List L, ElementType X)
    {
      List pCur = NULL;
      if (L == NULL)
      {
        return ERROR;
      }
      pCur = L->Next;
      while (pCur != NULL)
      {
        if (pCur->Data == X)
        {
          return pCur;
        }
        pCur = pCur->Next;
      }
      return ERROR;
    }

    bool Insert(List L, ElementType X, Position P)
    {
      List pPre, pCur, pM;
      if (L == NULL)
      {
        printf("Wrong Position for Insertion ");
        return false;
      }
      pPre = L;
      pCur = L->Next;

      while (pCur != NULL)
      {
        if (pCur == P)
        {
          pM = (List)malloc(sizeof(struct LNode));
          pM->Data = X;
          pM->Next = pCur;
          pPre->Next = pM;
          return true;
        }
        pPre = pCur;
        pCur = pCur->Next;
      }

      if (pCur == P)
      {
        pM = (List)malloc(sizeof(struct LNode));
        pM->Data = X;
        pM->Next = pCur;
        pPre->Next = pM;
        return true;
      }

      printf("Wrong Position for Insertion ");
      return false;

    }

    bool Delete(List L, Position P)
    {
      List pPre, pCur;
      if (L == NULL || P == NULL)
      {
        printf("Wrong Position for Deletion ");
        return false;
      }
      pPre = L;
      pCur = L->Next;

      while (pCur != NULL)
      {
        if (pCur == P)
        {
          pPre->Next = pCur->Next;
          return true;
        }
        pPre = pCur;
        pCur = pCur->Next;
      }

      printf("Wrong Position for Deletion ");
      return false;
    }

     
  • 相关阅读:
    string
    auto和decltype
    const限定符
    &(引用) 和 *(指针)
    extern关键字
    关于将函数写入头文件问题(分离式编译)
    poj2154(polya定理+欧拉函数)
    bzoj2115(线性基)
    51nod1832(二叉树/高精度模板+dfs)
    51nod1464(trie + dfs)
  • 原文地址:https://www.cnblogs.com/123boy/p/8422245.html
Copyright © 2011-2022 走看看