zoukankan      html  css  js  c++  java
  • 6-5 链式表操作集(20 分)

    6-5 链式表操作集(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
    ");
        }
        scanf("%d", &N);
        while ( N-- ) {
            scanf("%d", &X);
            P = Find(L, X);
            if ( P == ERROR )
                printf("Finding Error: %d is not in.
    ", X);
            else {
                L = Delete(L, P);
                printf("%d is found and deleted.
    ", X);
                if ( L==ERROR )
                    printf("Wrong Answer or Empty List.
    ");
            }
        }
        L = Insert(L, X, NULL);
        if ( L==ERROR ) printf("Wrong Answer
    ");
        else
            printf("%d is inserted as the last element.
    ", X);
        P = (Position)malloc(sizeof(struct LNode));
        tmp = Insert(L, X, P);
        if ( tmp!=ERROR ) printf("Wrong Answer
    ");
        tmp = Delete(L, P);
        if ( tmp!=ERROR ) printf("Wrong Answer
    ");
        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)
    {
      List pCur = L;
      if (L == NULL)
      {
        return ERROR;
      }

      while (pCur != NULL)
      {
        if (pCur->Data == X)
        {
          return pCur;
        }
        pCur = pCur->Next;
      }

      return ERROR;
    }

    List Insert(List L, ElementType X, Position P)
    {
      List pCur, pPre, pM;

      if (L == NULL)
      {
        if (P == NULL)
        {
          pM = (List)malloc(sizeof(struct LNode));
          pM->Data = X;
          pM->Next = NULL;
          return pM;
        }
        else
        {
          printf("Wrong Position for Insertion ");
          return ERROR;
        }
      }
      if (P == NULL)
      {
        pCur = L;
        while (pCur != NULL)
        {
          pPre = pCur;
          pCur = pCur->Next;
        }
        pM = (List)malloc(sizeof(struct LNode));
        pM->Data = X;
        pM->Next = pCur;
        pPre->Next = pM;
        return L;
      }

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

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

    }

    List Delete(List L, Position P)
    {
      List pCur, pPre;
      if (L == NULL)
      {
        printf("Wrong Position for Deletion ");
        return ERROR;
      }

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

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

     
  • 相关阅读:
    fixed与sticky的区别
    自我介绍以及web课程目标
    DOM&BOM
    web中常用单位的使用
    Oracle 使用 DBLINK详解(转载) 挪威
    Sql server 无法删除用户的处理办法(转载) 挪威
    ICMP类型
    makefile笔记
    [笔记]Makefile wildcard
    在Visual Studio 2005下配置WinPcap开发环境
  • 原文地址:https://www.cnblogs.com/123boy/p/8418984.html
Copyright © 2011-2022 走看看