波波的数据结构-顺序表

系列文章目录

波波的数据结构属实上的快,这里将会写些pta的解析,算是复习 预习,帮助我与大家期末不挂科




# 顺序表

一、选择题

2-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:(B)
A.O(1), O(1)
B.O(1), O(N)
C.O(N), O(1)
D.O(N), O(N)
解析 :顺序存储可以实现“随机存取”,因此访问结点的时间复杂度为O(1),而插入、删除结点由于涉及到大量移动元素,故其时间复杂度为O(n)。
2-2
在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:(A)
A.访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)
B.在第i个结点后插入一个新结点(1≤i≤N)
C.删除第i个结点(1≤i≤N)
D.将N个结点从小到大排序
解析:可以从上题的解析可以知道,想要访问L->data[n]就行
2-3
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?(D)
A.双链表
B.单循环链表
C.带头结点的双循环链表
D.顺序表
解析:“存取任一指定序号”最好的方法是实现“随机存取”,则可采用顺序表。并且,因为插入和删除操作都是在最后进行的,所以无需大量移动数据元素,选项D是最合适的。 链表将在下一章详细讲解
2-4
顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( C)。
A.100
B.105
C.108
D.110
解析:第5个元素的存储地址为100+2×(5-1)=108。
2-5
用数组表示线性表的优点是(B)。
A.便于插入和删除操作
B.便于随机存取
C.可以动态地分配存储空间
D.不需要占用一片相邻的存储空间
解析:对顺序存储的线性表进行插入和删除操作时,需要移动大量的元素,因此不便于进行插入删除操作,A选项错误;数组的存储空间大小一开始就已经分配好,不能动态分配存储空间,所以 C选项错误;数组正是占用一片相邻的存储空间,所以D选项也错误。
2-6
若长度为n的线性表采用顺序存储结构,那么删除它的第i个数据元素之前,需要它一次向前移动(A)个数据元素。
A.n-i
B.n+i
C.n-i-1
D.n-i+1
解析:顺序表删除元素是将该元素后面的位置一一覆盖,共n-i个
2-7
对于顺序表,以下说法错误的是( A)
A.顺序表是用一维数组实现的线性表,数组的下标可以看成是元素的绝对地址​
B.顺序表的所有存储结点按相应数据元素间的逻辑关系决定的次序依次排列
C.顺序表的特点是:逻辑结构中相邻的结点在存储结构中仍相邻
D.顺序表的特点是:逻辑上相邻的元素,存储在物理位置也相邻的单元中
解析:顺序表是用一维数组实现的线性表,数组的下标可看成元素的相对地址,它们是逻辑上相邻的元素,存储在物理位置也相邻的单元中。在链表中,单链表中每个结点只有一个链域,而双链表中的结点有prior和next两个链域。
2-8
若长度为n的线性表采用顺序结构,在第i个数据元素之前插入一个元素,需要它依次向后移动(B)个元素。
A.n-i
B.n-i+1
C.n-i-1
D.i
解析:与上题的删除不同,插入需要位置i的元素也一起移动,所以共n-i+1个
2-9
顺序存储表示中数据元素之间的逻辑关系是由(C )表示的。
A.指针
B.逻辑顺序
C.存储位置
D.问题上下文
解析:顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示。
2-10
在长度为n的顺序表的表尾插入一个新元素的时间复杂度为(B )。
A.O(n)
B.O(1)
C.O(n^​2​​ )
D.O(log2n)
解析:在表尾插入新元素不需要对前面的结点进行移动

二、函数题

顺序表的查找操作

本题要求实现一个函数,要求从顺序表中查找指定元素,并返回第一个查找成功的元素在表中的位置序号,若查找失败,则返回0;
函数接口定义:int LocateElem(SqList L,ElemType e);
其中SqList结构定义如下:

typedef struct{
    ElemType *elem;
    int length;
 }SqList;
    ```

### 裁判测试程序样例:
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int length;
 }SqList;
void InitList(SqList &L);/*细节在此不表*/
int LocateElem(SqList L,ElemType e);

int main()
{
    SqList L;
    InitList(L);
    ElemType e;
    int p;
    scanf("%d",&e);
    p=LocateElem(L,e);
    printf("The position of %d in SequenceList L is %d.",e,p);
    return 0;
}

/* 请在这里填写答案 */

答案:

int LocateElem(SqList L,ElemType e)
{
    int i;
    for(i=0;i<L.length;i++)//
    {
        if(L.elem[i]==e) return i+1;//当找到元素值等于e时终止循环,r返回元素下标
    }
    return 0;
}

顺序表的插入操作

本题要求实现一个函数,在顺序表的第i个位置插入一个新的数据元素e,插入成功后顺序表的长度加1,函数返回值为1;插入失败函数返回值为0;
函数接口定义:int ListInsert(SqList &L,int i,ElemType e);
其中SqList结构定义如下:

typedef struct{
    ElemType *elem;
    int length;
 }SqList;

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int length;
 }SqList;
void InitList(SqList &L);/*细节在此不表*/
int ListInsert(SqList &L,int i,ElemType e);
int main()
{
    SqList L;
    InitList(L);
    ElemType e;
    int i;
    scanf("%d%d",&i,&e);
    int result=ListInsert(L,i,e);
    if(result==0){
        printf("Insertion Error.The value of i is unlawful or the storage space is full!");    
    }else if(result==1){
        printf("Insertion Success.The elements of the SequenceList L are:");    
        for(int j=0;j<L.length;j++){
            printf(" %d",L.elem[j]);
        }
    }
    return 0;
}
/* 请在这里填写答案 */

答案

int ListInsert(SqList &L,int i,ElemType e)
{
	if(i<=0||i>L.length+1||L.length>=MAXSIZE) //当插入的位置小于1或大于顺序表的长度,返回0
        return 0;
	else
	{
		for(int j = L.length-1;j >=i-1;j--)
		{
			L.elem[j+1] = L.elem[j];//从顺序表最后开始遍历,将i后的元素往后移
		}
		L.elem[i-1] = e;
		L.length++;
		
	}
    return 1;
}

顺序表的删除操作

本题要求实现一个函数,要求将顺序表的第i个元素删掉,成功删除返回1,否则返回0;
函数接口定义:int ListDelete(SqList &L,int i);`
其中SqList结构定义如下:

typedef struct{
    ElemType *elem;
    int length;
 }SqList;

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int length;
 }SqList;
void InitList(SqList &L);/*细节在此不表*/
int ListDelete(SqList &L,int i);
int main()
{
    SqList L;
    InitList(L);
    int i;
    scanf("%d",&i);
    int result=ListDelete(L,i);
    if(result==0){
        printf("Delete Error.The value of i is illegal!");    
    }else if(result==1){
        printf("Delete Success.The elements of the SequenceList L are:");    
        for(int j=0;j<L.length;j++){
            printf(" %d",L.elem[j]);
        }
    }
    return 0;
}
/* 请在这里填写答案 */

答案

int ListDelete(SqList &L,int i)
{
    if(L.length>=MAXSIZE||i<=0||i>L.length)
        return 0;
    else
    {
        for(int j=i-1;j<L.length-1;j++)
        {
            L.elem[j]=L.elem[j+1];//将i后面的元素都往前移一位
        }
        L.length--;
        return 1;
    }
}

顺序表统计大于指定元素值个数

本题要求实现一个函数,要求返回顺序表中大于指定元素值的个数,空表返回0。题目保证顺序表中所有元素都为整数。
函数接口定义:`int GetGreater(SqList L, ElemType e);
函数GetGreater返回顺序表L中比e大的元素的个数,若顺序表为空,则返回0。
其中SqList结构定义如下:

typedef struct
{
    ElemType *elem;
    int length;
 }SqList;
    ```

### 裁判测试程序样例:
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    int length;
 }SqList;
void InitList(SqList &L);/*细节在此不表*/
int GetGreater(SqList L, ElemType e);

int main()
{
    SqList L;
    InitList(L);
    ElemType e;
    scanf("%d", &e);
    printf("The number greater than %d is %d.\n",e, GetGreater(L, e));
    return 0;
}

/* 请在这里填写答案 */

答案:

int GetGreater(SqList L, ElemType e)
{
	int num = 0;
	if (L.length == 0)
		return 0;
	else
	{
		for (int i = 0; i<L.length; i++)
		{
			if (L.elem[i]>e)
				num++;//统计次数
		}
	}
	return num;
}
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值