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

    【PTA】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。

    裁判测试程序样例:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #define ERROR NULL
     5 typedef int ElementType;
     6 typedef struct LNode *PtrToLNode;
     7 struct LNode {
     8     ElementType Data;
     9     PtrToLNode Next;
    10 };
    11 typedef PtrToLNode Position;
    12 typedef PtrToLNode List;
    13 
    14 Position Find( List L, ElementType X );
    15 List Insert( List L, ElementType X, Position P );
    16 List Delete( List L, Position P );
    17 
    18 int main()
    19 {
    20     List L;
    21     ElementType X;
    22     Position P, tmp;
    23     int N;
    24 
    25     L = NULL;
    26     scanf("%d", &N);
    27     while ( N-- ) {
    28         scanf("%d", &X);
    29         L = Insert(L, X, L);
    30         if ( L==ERROR ) printf("Wrong Answer
    ");
    31     }
    32     scanf("%d", &N);
    33     while ( N-- ) {
    34         scanf("%d", &X);
    35         P = Find(L, X);
    36         if ( P == ERROR )
    37             printf("Finding Error: %d is not in.
    ", X);
    38         else {
    39             L = Delete(L, P);
    40             printf("%d is found and deleted.
    ", X);
    41             if ( L==ERROR )
    42                 printf("Wrong Answer or Empty List.
    ");
    43         }
    44     }
    45     L = Insert(L, X, NULL);
    46     if ( L==ERROR ) printf("Wrong Answer
    ");
    47     else
    48         printf("%d is inserted as the last element.
    ", X);
    49     P = (Position)malloc(sizeof(struct LNode));
    50     tmp = Insert(L, X, P);
    51     if ( tmp!=ERROR ) printf("Wrong Answer
    ");
    52     tmp = Delete(L, P);
    53     if ( tmp!=ERROR ) printf("Wrong Answer
    ");
    54     for ( P=L; P; P = P->Next ) printf("%d ", P->Data);
    55     return 0;
    56 }
    57 
    58 /* 你的代码将被嵌在这里 */

    输入样例:

    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 

    函数实现细节:

     1 Position Find( List L, ElementType X ){
     2     //if(L==NULL)return NULL;
     3     while(L&&L->Data!=X){
     4         L=L->Next;
     5     }
     6     if(L==NULL){
     7         return NULL;
     8     }else if(L->Data==X){
     9         return L;
    10     }
    11 }
    12 
    13 List Insert( List L, ElementType X, Position P ){
    14     Position temp=(Position)malloc(sizeof(struct LNode));
    15     if(L==P){
    16         temp->Data=X;temp->Next=P;
    17         return temp;
    18     }
    19     List Q=L;
    20     while(L->Next&&L->Next!=P)L=L->Next;
    21     if(P==NULL){
    22         temp->Data=X;temp->Next=NULL;
    23         L->Next=temp;
    24         return Q; 
    25         
    26     }else if(P &&L->Next==NULL){
    27         printf("Wrong Position for Insertion
    ");
    28         return NULL;
    29     }
    30      temp->Data=X;temp->Next=P;
    31      L->Next=temp;
    32      return Q;
    33 }
    34 List Delete( List L, Position P ){
    35     Position Q=L;
    36     if (L == P) {
    37         L = L->Next;
    38         free(P);
    39         return L;
    40     }
    41     while (Q->Next != P && Q->Next != NULL)Q = Q->Next;
    42     if(Q->Next==NULL){
    43            printf("Wrong Position for Deletion
    ");
    44            return ERROR;
    45      }else{
    46          Q->Next=P->Next;
    47            free(P);
    48          return L;
    49       }
    50 }
  • 相关阅读:
    算法>分支限界 小强斋
    C# DataGridView 的 CellValueChanged 与修改数据没保存的情况
    Windows8使用虚拟磁盘vhdx功能来为容量较大的文件夹扩容
    DataSet / DataTable 对 Access 数据库进行更改后,无法获取自动编号(自增)列的新值
    使用Windows Server 2012配置更新服务Update Service,以及客户端的配置
    在Windows 8中找回开始菜单
    DataSet / BindingSource / DataGridView / BindingNavigator 的关系与绑定、更新顺序
    Windows8 的搜狗输入法的快捷键推荐设置方法
    如果要使用DataAdapter来修改DataSet的子集时,请尽量对父级做修改。
    about PostgreSQL
  • 原文地址:https://www.cnblogs.com/wyjgr/p/13073447.html
Copyright © 2011-2022 走看看