【01】顺序表操作集

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

这是顺序表的基本操作,而且课本都有例题。

函数接口定义:

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。

输入样例:

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.

裁判测试程序样例:

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

/* 你的代码将被嵌在这里 */

AC代码:

(这是第一次测试通过的代码,那时候还没有理解)

List MakeEmpty()
{
    List L;
    L=(List)malloc(sizeof(struct LNode));
    L->Last=-1;
    return L;

}
Position Find( List L, ElementType X )
{
    int i;
    for(i=0;i<=L->Last;i++)
    {
        if(L->Data[i]==X)
            return i;//第一次写错了,返回了L->Last
    }

    return ERROR;

}
bool Insert( List L, ElementType X, Position P )
{
    int i;
    if(L->Last>=MAXSIZE-1)//第一次写成了==,错误
    {
        printf("FULL");
        return false;
    }
    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 )
{
    int i;
    if(P<0||P>L->Last)
    {
        printf("POSITION %d EMPTY",P);//最后错了n次,这里是P的值,不能直接复制的啊
        return false;
    }
    for(i=P;i<L->Last;i++)
    {
        L->Data[i]=L->Data[i+1];
    }
    L->Last--;
    return true;

}

这是第二次写的代码,还是有很多的错误,注释标出来了。

要注意循环时开始和结束的位置。

#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()//创建并返回一个空的线性表
{
    struct LNode *L;
    L=(List)malloc(sizeof(struct LNode));
    L->Last=-1;
    return L;
}

Position Find( List L, ElementType X )
//返回线性表中X的位置。若找不到则返回ERROR;
{
    int i;
    /*for(i=L->Last; i>=0; i--)我是倒叙找的,不知道为啥错误???
    {
        if(L->Data[i]==X)
            return i;//刚开始写的p->Last
    }*/
    for(i=0;i<=L->Last;i++)
    {
        if(L->Data[i]==X)
            return i;
    }
    return ERROR;
}

bool Insert( List L, ElementType X, Position P )
//将X插入在位置P并返回true。
//若空间已满,则打印“FULL”并返回false;
//如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
{
    int i;
    if(L->Last>=MAXSIZE-1)
    {
        printf("FULL");
        return false;
    }
    if(P<0||P>L->Last+1)//刚开始写的P<1||P>L->Last+2,答案错误
    {
        printf("ILLEGAL POSITION");
        return false;
    }
    for(i=L->Last; i>=P; i--)// i>=P-1;错误
    {
        L->Data[i+1]=L->Data[i];
    }
    L->Data[P]=X;
    L->Last++;
    return true;
}
bool Delete( List L, Position P )//位置p,在L->Date[p-1]
//将位置P的元素删除并返回true。若参数P指向非法位置,
//则打印“POSITION P EMPTY”(其中P是参数值)并返回false。
{
    int i;
    if(P<0||P>L->Last)//P<1||P>L->Last+1,错误
    {
        printf("POSITION %d EMPTY",P);
        return false;
    }
    for(i=P; i<L->Last; i++)//i<=L->Last;错误
    {
        L->Data[i-1]=L->Data[i];
    }
    L->Last--;//啊啊,最后忘记写了。。。错误
    return true;
}

### 关于 PTA 平台上的数据结构顺序表操作 #### 顺序表的操作概述 顺序表是一种线性存储结构,在内存中占用连续的空间。对于顺序表的基本操作主要包括插入、删除、查找等。这些操作的时间复杂度通常取决于具体实现方式。 #### 插入操作解析 当向顺序表中插入新元素时,如果位置合法,则需移动该位置之后的所有元素以腾出空间给新的元素。假设`L`表示顺序表对象,`i`是要插入的位置索引,而`e`是待插入的新元素: ```c++ void Insert(SqList &L, int i, ElemType e){ if (i<1 || i>L.length+1) { printf("Invalid position"); return; } if(L.length>=MaxSize){ printf("Table is full"); return; } for(int j=L.length; j>=i; --j) L.elem[j]=L.elem[j-1]; L.elem[i-1]=e; ++L.length; } ``` 这段代码展示了如何安全地执行插入动作[^1]。 #### 删除操作解析 要从顺序表中移除指定位置处的元素,同样先验证参数的有效性;接着把此位置后的所有项向前挪动一位覆盖掉被删去的数据项即可完成逻辑上的消除过程。 ```c++ bool Delete(SqList &L,int i,ElemType &e){ if(i<1||i>L.length)return false;//判断合法性 e=L.elem[i-1]; //保存欲删除元素值 for(int k=i;k<L.length;++k)L.elem[k-1]=L.elem[k];//前移后续元素 --L.length; //长度减一 return true; } ``` 上述C++片段说明了标准做法来处理此类需求[^2]。 #### 查找功能展示 为了定位某个特定数值所在之处或是确认其是否存在,可以遍历整个列表直到找到匹配为止或者到达结尾也没有发现目标则返回失败标志。 ```cpp int LocateElem(Sqlist L,Elemtype e){ for(int i=0;i<L.length;i++) if(L.data[i]==e)return i+1; return 0; } ``` 这里给出了一种简单有效的解决方案用于解决这个问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值