6-1 顺序表操作集 (20 分)(C语言版)

直接看下面代码就可以。题目太长了,可以不用看。

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

函数接口定义:

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.
/*创建*/
List MakeEmpty()
{
    List L;
    L = (struct LNode*)malloc(sizeof(struct LNode));//注意:前面的struct LNode*可以替换成List;而sizeof里面必须用struct LNode,不可以用List
    L->Last = -1;//注意:L->Last记录最后一个数据的下标
    return L;
}




/*查找*/
Position Find( List L, ElementType X )
{
    int i;
    for(i=0;i<=L->Last;i++){
        if(X==L->Data[i]) return i;
    }
    return ERROR;
}






/*插入*/
bool Insert( List L, ElementType X, Position P )//注意:P为下标
{
    int i;
    if(L->Last==MAXSIZE-1){//注意:判断是否表满
        printf("FULL");
        return false;
    }
    if(P<0 || P > L->Last+1){//注意:【0,L->Last】判断是否指向非法位置,P可以等于L->Last 和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++;//注意:L->Last要增加1
    return true;
}




/*删除*/
bool Delete( List L, Position P )
{
    int j;
    
    if(P<0 || P>L->Last){//注意:判断是否为非法位置
        printf("POSITION %d EMPTY",P);
        return false;
    }else{
        for(j=P+1;j<=L->Last+1 ;j++){
        L->Data[j-1]=L->Data[j];//注意:删去下标P的数据
        }
        L->Last--;//注意:L->Last要减少1
        return true;
    }
}


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 顺序表是一种线性表的存储结构,可以用一段连续的存储空间来存储数据元素。顺序表的建立需要先确定存储空间的大小,然后在内存中申请一段连续的空间,将数据元素依次存储在这段空间中。顺序表的遍历可以通过循环遍历每个数据元素来实现,也可以使用迭代器等工具来遍历。在遍历过程中,可以对每个数据元素进行操作,如输出、修改等。 ### 回答2: 顺序表是一种简单的线性数据结构,它的基本操作包括建立、访问、插入、删除和遍历等。顺序表的建立有两种方式:静态建立和动态建立。 静态建立:在程序中定义一个固定大小的数组,通过赋值操作将数据元素存入数组中,形成一个固定大小的顺序表。这种方式的缺点在于,数组大小固定,无法动态扩展,当数据元素超出数组大小时,会造成溢出错误。 动态建立:采用动态内存配的方式建立顺序表,可以根据需要动态调整顺序表大小,避免溢出的问题。动态建立顺序表的方式有两种:数组倍增法和链表配法。 数组倍增法:首先配一个固定大小的数组空间,当元素的数量超出数组大小时,再次配更大的数组空间,并将原数组元素复制到新数组中,然后释放原数组,这样不断进行数组大小倍增的操作,可以有效避免每次插入元素时都要移动大量元素的问题。 链表配法:顺序表的动态建立可以采用链表的结构进行配,每次在链表尾部插入新元素即可。链表配法是一种比较灵活的数据结构,但相对于数组倍增法,链表配法的插入和删除操作效率较低。 顺序表的遍历方式有两种:顺序遍历和逆序遍历。 顺序遍历:从顺序表的第一个元素开始依次访问到最后一个元素。在访问元素时,可以采用循环迭代的方式,也可以采用递归的方式进行访问。 逆序遍历:从顺序表的最后一个元素开始依次访问到第一个元素。在访问元素时,可以采用循环迭代的方式,也可以采用递归的方式进行访问。通过逆序遍历,可以方便地实现顺序表的反转操作。 总之,顺序表是一种简单而重要的数据结构,对其建立和遍历的理解和掌握对于算法和数据结构的学习起着至关重要的作用。 ### 回答3: 顺序表是一种经常用来存储一维线性数据结构的顺序存储方式。顺序表通过连续的空间来存储数据,所以查找和访问元素很方便,但在插入和删除元素时需要移动其他元素,因此操作效率较低。下面将详细介绍顺序表的建立和遍历。 1.顺序表的建立 顺序表在建立之前需要先确定容量大小,即表长。建立时,需要定义一个数组并且确定数组类型,以及定义一个整型变量存储当前表中元素的个数。 2.顺序表的遍历 遍历顺序表意味着访问每一个元素,是最基本的操作之一。通常,可以使用for循环或while循环实现对每个元素的访问。下面别介绍这两种方法: for循环:使用for循环遍历顺序表时,可以通过定义一个计数器,将每个元素依次输出。示例代码如下: for(int i=0; i<length; i++){ printf("%d",a[i]); //a为存储元素的数组 } while循环:利用while循环来访问顺序表中的每一个元素,代码如下: int i=0; while(i<length){ printf("%d",a[i]); //a为存储元素的数组 i++; } 在遍历过程中,可以根据需求对每个元素进行操作。例如:求和,求最大值,求平均值等。在遍历完毕后,需要释放所配的空间。 以上就是顺序表的建立和遍历方法,顺序表虽然在插入和删除元素时效率不高,但在访问和查找元素时是特别快速的,是一种常用的数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值