6-2 顺序表操作集
6-2 顺序表操作集
本题要求实现顺序表的操作集
函数接口定义:
1 2 3 4 | List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); |
其中List
结构定义如下:
1 2 3 4 5 6 | 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。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #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; } /* 你的代码将被嵌在这里 */ |
输入样例:
1 2 3 4 5 6 | 6 1 2 3 4 5 6 3 6 5 1 2 -1 6 |
输出样例:
1 2 3 4 5 6 7 8 | 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的写法,需要动态地申请结构体大小的空间:
1 2 3 4 5 6 | List MakeEmpty(){ List L; <strong>L=(List) malloc ( sizeof ( struct LNode));</strong> L->Last=-1; return L; } |
注意在 C++中也可以用 L=new LNode 来替代malloc
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现