6-2 顺序表操作集
6-2 顺序表操作集
本题要求实现顺序表的操作集
函数接口定义:
List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );
 其中List结构定义如下:
typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */
};
各个操作函数的定义为:
List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。
裁判测试程序样例:
#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; /* 保存线性表中最后一个元素的位置 */
};
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;
}
/* 你的代码将被嵌在这里 */
输入样例:
6 1 2 3 4 5 6 3 6 5 1 2 -1 6
输出样例:
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.
代码:
1 List MakeEmpty(){ 2 List L; 3 L=(List)malloc(sizeof(struct LNode)); 4 L->Last=-1; 5 return L; 6 } 7 8 bool Insert(List L, ElementType X, Position P ){ 9 if(L->Last==MAXSIZE-1){ 10 printf("FULL"); 11 return false; 12 } 13 if(P>L->Last+1||P<0){ 14 printf("ILLEGAL POSITION"); 15 return false; 16 } 17 18 L->Last++; 19 for(int i=L->Last;i>P;i--){ 20 L->Data[i] = L->Data[i-1]; 21 22 } 23 L->Data[P]=X; 24 return true; 25 } 26 27 Position Find(List L, ElementType X ){ 28 for(int i=0;i<=L->Last;i++){ 29 if(L->Data[i]==X){ 30 return i; 31 } 32 } 33 return ERROR; 34 } 35 36 bool Delete( List L, Position P ){ 37 if(P<0||P>L->Last){ 38 printf("POSITION %d EMPTY",P); 39 return false; 40 } 41 L->Last--; 42 for(int i=P;i<=L->Last;i++){ 43 L->Data[i]=L->Data[i+1]; 44 } 45 return true; 46 }
线性表 分为顺序表(一般为数组)和链表
注意事项:
审题:
1、插入时 P>L->Last+1 即为非法的位置,容易写成P>=MAXSIZE;
2、按照题目顺序,插入时先判断是否已满,再判断是否为非法位置;
代码实现:
注意makeempty的写法,需要动态地申请结构体大小的空间:
List MakeEmpty(){
    List L;
    L=(List)malloc(sizeof(struct LNode));
    L->Last=-1;
    return L;
}
注意在 C++中也可以用 L=new LNode 来替代malloc
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号