6-1 顺序表操作集(20 分)

匿名 (未验证) 提交于 2019-12-03 00:21:02

本题要求实现顺序表的操作集。

函数接口定义:

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; } 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!