6-2 sequence table operation set (20 points)
This question requests to realize the operation set of the sequence table.
Function interface definition:
List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );
The List structure is defined as follows:
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* Save the position of the last element in the linear table */ };
Each operation function is defined as:
List MakeEmpty(): creates and returns an empty linear table;
Position find (List L, ElementType x): returns the position of X in the linear table. If not found, ERROR will be returned;
Bool insert (List L, ElementType x, position P): insert X in position P and return true. If the space is FULL, print "FULL" and return false; if the parameter p points to the ILLEGAL POSITION, print "ILLEGAL POSITION" and return false;
Bool delete (List L, position P): delete the element of position P and return true. If the parameter p points to an illegal position, print "POSITION P EMPTY" (where p is the parameter value) and return false.
Sample referee test procedure:
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 5 #define ERROR -1 typedef enum {false, true} bool; typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* Save the position of the last element in the linear table */ }; 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; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); if ( Insert(L, X, 0)==false ) printf(" Insertion Error: %d is not in.\n", X); } 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 printf("%d is at position %d.\n", X, P); } scanf("%d", &N); while ( N-- ) { scanf("%d", &P); if ( Delete(L, P)==false ) printf(" Deletion Error.\n"); if ( Insert(L, 0, P)==false ) printf(" Insertion Error: 0 is not in.\n"); } return 0; } /* Your code will be embedded here */
Input example:
6 1 2 3 4 5 6 3 6 5 1 2 -1 6
Output example:
FULL Insertion Error: 6 is not in. Finding Error: 6 is not in. 5 is at position 0. 1 is at position 4. POSITION -1 EMPTY Deletion Error. FULL Insertion Error: 0 is not in. POSITION 6 EMPTY Deletion Error. FULL Insertion Error: 0 is not in.
ANS:
List MakeEmpty() { List l =(List )malloc(sizeof(struct LNode)); l->Last=-1; return l; } Position Find( List L, ElementType X ) { for(int i=0;i<=L->Last;i++) { if(L->Data[i]==X) { return i; } } return ERROR; } bool Insert( List L, ElementType X, Position P ) { if(L->Last==MAXSIZE-1) { printf("FULL"); return false; } else if(P<0 || P>L->Last+1) //You can only insert [0, last+1] to ensure the continuity of the sequence table { printf("ILLEGAL POSITION"); return false; } else { for(int i=L->Last;i>=P;i--) { L->Data[i+1]=L->Data[i]; } L->Data[P]=X; L->Last++; return true; } } bool Delete( List L, Position P ) { if(P<0||P>L->Last) { printf("POSITION %d EMPTY",P); return false; } else { for(int i=P;i<L->Last;i++) { L->Data[i]=L->Data[i+1]; } L->Last--; return true; } }