PTA資料結構與演算法題目集(中文)4-5 鏈式表操作集 (20分)
阿新 • • 發佈:2018-12-24
本題要求實現鏈式表的操作集。
函式介面定義:
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 )
{
List p=L;
while(p)
{
if(p->Data==X)
return p;
p=p->Next;
}
return ERROR;
}
List Insert(List L,ElementType X,Position P)//注意題目要求返回表頭
{
List p=L;
if(L==P)//當L==P時(包括L==P==NULL)在表頭前插入節點直接返回該節點
{
List s=(struct LNode*)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=L;
L=s;
return L;
}
if(L==NULL)
{
printf("Wrong Position for Insertion\n");
return ERROR;
}
while(L->Next!=NULL&&L->Next!=P)
L=L->Next;
if(L->Next==NULL&&P!=NULL)
{
printf("Wrong Position for Insertion\n");
return ERROR;
}
List s=(struct LNode*)malloc(sizeof(struct LNode));
s->Data=X;
L->Next=s;
s->Next=P;
return p;
}
List Delete( List L, Position P )
{
List p=L;
if(P==NULL||L==NULL)
{
printf("Wrong Position for Deletion\n");
return ERROR;
}
if(L==P)
{
List l=L;
l=l->Next;
free(L);
return l;
}
while(L->Next!=NULL&&L->Next!=P)
{
L=L->Next;
}
if(L->Next==NULL&&P!=NULL)
{
printf("Wrong Position for Deletion\n");
return ERROR;
}
L->Next=P->Next;
free(P);
return p;
}