顺序表: 线性表的顺序存储

线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素

  1. 在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序存储的数据区域是再合适不过的

  2. 考虑到线性表的运算有插入和删除等,即表的长度是动态可变的
    所以,数组的容量需设计的足够大

  3. Data[MAXSIZE]其中MAXSIZE是一个根据实际问题定义的足够大的整数
    线性表中的数据从Data[0]开始依次顺序存放
    因为当前线性表中的实际元素个数可能没达到MAXSIZE多个,因此用一个变量Last来记录当前线性表中最后一个元素在数组中的位置
    即Last起一个指针的作用(实际是数组下标),始终指向线性表中的最后一个元素
    表空时Last=-1

  4. 表长为Last+1

  5. 为了体现数据组织的整体性,通常将数组Data和变量Last封装成一个结构作为顺序表的类型

typedef int Position;
typedef struct LNode *PtrToLNode;
struct LNode
{ElementType Data[MAXSIZE];Position Last;
};
typedef PtrToLNode List;
  1. 由于LNode是一个包含数组的结构,当我们实现各种针对顺序表的操作时,直接将该结构作为函数参数传递显然不是一个好办法,使用结构指针的传递效率更高,所以我们把List定义为结构指针。
    这样,我们可以利用List定义线性表L:List L;

本题要求实现顺序表的操作集。
函数接口定义:

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);elseprintf("%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.

代码:

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++)//注意i从0到L->Last {if(L->Data[i]==X) return i;}return ERROR;
}bool Insert( List L, ElementType X, Position P )
{if(L->Last==MAXSIZE-1)//注意MAXSIZE-1 {printf("FULL");return false;}if(P<0||P>(L->Last+1)) {printf("ILLEGAL POSITION");return false; }int i;for(i=L->Last+1;i>P;i--)//这个是插入,所以i从L->Last+1开始 {L->Data[i]=L->Data[i-1];}L->Data[i]=X;L->Last++;return true;
}bool Delete( List L, Position P )
{Position j;if(P<0||P>(L->Last)){printf("POSITION %d EMPTY",P);return false;}for(j=P;j<L->Last;j++)//因为是删除,所以j不可能等于L->Last {L->Data[j]=L->Data[j+1];}L->Last--;return true;
}

6-5 顺序表操作集 (20 分)(创建,查找,插入,删除)以及顺序表的理解相关推荐

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

    本题要求实现顺序表的操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L ...

  2. 6-5 链式表操作集 (20分)

    本题要求实现链式表的操作集. 函数接口定义: Position Find( List L, ElementType X ); List Insert( List L, ElementType X, P ...

  3. 带头结点的链式表操作集

    6-6 带头结点的链式表操作集 (20 分) 本题要求实现带头结点的链式表操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, ElementTy ...

  4. PTA:6-2顺序表操作集(20分)

    大一下半期数据结构 数据结构题目集 PTA:顺序表操作集(20分) 本题要求实现顺序表的操作集. 函数接口定义 List MakeEmpty(); Position Find( List L, Ele ...

  5. (PTA数据结构与算法) 6-2 顺序表操作集 ——请告诉我什么是顺序表!!!

    6-2 顺序表操作集 (20 分) 本题要求实现顺序表的操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); b ...

  6. 1、输入四个整数,按照从小到大顺序输出。(20分)

    题目: /* 1.输入四个整数,按照从小到大顺序输出.(20分) */ 代码: 注:题目说的是四个数的排序,我就直接写了个冒泡排序 public class One207 {public static ...

  7. 7-11 堆栈操作合法性 (20 分)以及堆栈讲解(c语言实现)

    关于堆栈: 1.它是什么 2.它为什么会出现/它的出现解决了什么问题 3.我们要怎么使用它 堆和栈到底是什么 栈和堆(托管堆)都存在于进程的虚拟内存中. 栈(Stack) 是操作系统在建立某个进程时或 ...

  8. 7-113 堆栈操作合法性 (20 分)

    7-113 堆栈操作合法性 (20 分) 假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序 ...

  9. 数据结构的顺序表操作集

    按照题目来讲比较好,如题: 本题要求实现顺序表的基本操作集,如初始化.查找.插入.删除等操作. 稍微说一下,这几个操作是非常非常重要的,希望你们看完我的代码可以自己思考一下为什么要这样,为什么会这样, ...

最新文章

  1. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址
  2. Docker安装zookeeper 单节点安装
  3. ios uilabel 根据文字 计算宽度 高度
  4. 上百个Android开源项目分享
  5. EF中DataContext创建的两段代码收藏
  6. Windows开发之——局域网内搭建论坛
  7. 2021-05-15 Nginx面试题
  8. 在arcgis中进行拓扑检查
  9. 集成电路芯片半导体中英文对照术语词汇表
  10. logistic回归模型
  11. C语言新手入门贪吃蛇的链表实现-控制光标位置,流畅不闪屏
  12. cad动态块制作翻转_cad动态块拉伸制作方法,单开门动态块制作教程具体分析
  13. J2SE 1.5的for增强循环
  14. POI excel插入图表
  15. py实战某股票一周收盘价折线图绘制
  16. 神经管理学是什么样的学科?
  17. 文本溢出显示省略号效果
  18. Mac磁盘工具教程 – 抹掉并重新格式化硬盘/移动硬盘
  19. 史玉柱亲笔写的脑白金策划方案
  20. .Net 7 CLR和ILC编译函数过程

热门文章

  1. AndroidStudio自定义属性xmlns无法识别问题解决in Gradle projects,always use http://schemas.android.com/apk/res-auto
  2. Android之webview与js交互
  3. Qt 第一步 HelloWorld 的第一个程序
  4. 南京大学计算机考研面试题目,南京大学计算机考研05-07,09年面试题
  5. oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配
  6. java 数组拼接_打印Java数组最优雅的方式是什么?这波操作闪瞎我
  7. 10个遥远但近在人间的天堂...
  8. 励志!送女儿去厦大读研后,爸爸回家就考了厦大的博士,现在是女儿的“学弟”...
  9. 炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...
  10. 10岁高分考上大学,16岁读博的95后神童张炘炀,活成了他想要的样子吗?