本题要求实现顺序表的操作集。
函数接口定义:
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.
PS:这道题目属于顺序表题目当中的入门题,考察了四个方面:
顺序表的初始化、查找、插入、删除
对于初始化:
我们先动态分配一个空间给顺序表L,然后返回这个顺序表
查找:Position Find( List L, ElementType X );
这里我们从顺序表的头部开始查找,直到结束,如果找到这个数就输出下标,否则根据题目要求输出相应的提示信息。
插入:bool Insert( List L, ElementType X, Position P );
如果从最后一个元素遍历,在指定位置插入一个数字,那么在插入之后我们需要做一部分善后工作
1、顺序表的长度要增加
2、顺序表某一元素因为插入其下标需要发生改变
那么删除:bool Delete( List L, Position P );
我们需要把元素向前挪动。
这些都是顺序表的简单操作。
源代码如下:
#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; } /* 你的代码将被嵌在这里 */ List MakeEmpty(){ List L; L=(List)malloc(sizeof(List));//动态分配函数malloc分配一个空间 L->Last=-1;//Last表示终止 return L; } Position Find( List L, ElementType X ){ int i; //遍历整个有序表,查找X for(i=0;i<=L->Last;i++){ if(L->Data[i]==X) return i; } return ERROR; } //ool Insert( List L, ElementType X, Position P ):将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false; //如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false; bool Insert( List L, ElementType X, Position P ){ if(L->Last+1==MAXSIZE){ printf("FULL"); return false; } int i; if((P<0)||(P>(L->Last+1))){ printf("ILLEGAL POSITION"); return false; } for(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 ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值) //并返回false。 bool Delete( List L, Position P ){ int i; if((i<1)||(i>L->Last+1)) printf("POSITION %d EMPTY",P); return false; for(i=P;i<=L->Last+1;i++) L->Data[i-1]=L->Data[i]; L->Last--; return true; }
文章来源: 6-1 顺序表操作集(20 分)