2-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:(1分)
A.O(1), O(1)
B.O(1), O(N)
C.O(N), O(1)
D.O(N), O(N)
2-2
在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:(2分)
A.访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)
B.在第i个结点后插入一个新结点(1≤i≤N)
C删除第i个结点(1≤i≤N)
D.将N个结点从小到大排序
2-3
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?(2分)
A.双链表
B.单循环链表C.
带头结点的双循环链表
D.顺序表
2-4
顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )。(2分)
A.100
B.105
C.108
D.110
2-5
(neuDS)线性表的顺序存储结构是一种( )(2分)
A.随机存取的存储结构
B.顺序存取的存储结构
C.索引存取的存储结构
D.散列存取的存储结构
2-6
(neuDS)一个顺序表所占用的存储空间大小与( )无关。(2分)
A.表的长度
B.元素的类型
C.元素的存放顺序
D.元素中各字段的类型
2-7
(neuDS)要将一个顺序表{a0,a1,……,an−1}中第i个数据元素ai(0≤i≤n-1)删除,需要移动( )个数据元素。(2分)
A.i
B.n-i-1
C.n-i
D.n-i+1
2-8
用数组表示线性表的优点是()。(2分)
A.便于插入和删除操作
B.便于随机存取
C.可以动态地分配存储空间
D.不需要占用一片相邻的存储空间
2-9
若长度为n的线性表采用顺序存储结构,那么删除它的第i个数据元素之前,需要它一次向前移动()个数据元素。(2分)
A.n-i
B.n+i
C.n-i-1
D.n-i+1
2-10
若长度为n的线性表采用顺序结构,在第i个数据元素之前插入一个元素,需要它依次向后移动()个元素。(2分)
A.n-i
B.n-i+1
C.n-i-1
D.i
2-11
线性表L=(a1, a2 ,……,an )用一维数组表示,假定删除线性表中任一元素的概率相同(都为1/n),则删除一个元素平均需要移动元素的个数是()。(2分)
A.n/2
B.(n+1)/2
C.(n-1)/2
D.n
6-1 顺序表创建和就地逆置 (10 分)
本题要求实现顺序表的创建和就地逆置操作函数。L是一个顺序表,函数ListCreate_Sq(SqList &L)用于创建一个顺序表,函数ListReverse_Sq(SqList &L)是在不引入辅助数组的前提下将顺序表中的元素进行逆置,如原顺序表元素依次为1,2,3,4,则逆置后为4,3,2,1。
函数接口定义:
Status ListCreate_Sq(SqList &L);
void ListReverse_Sq(SqList &L);
裁判测试程序样例:
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//顺序表的存储结构定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct{
ElemType* elem; //存储空间基地址
int length; //表中元素的个数
int listsize; //表容量大小
}SqList; //顺序表类型定义
Status ListCreate_Sq(SqList &L);
void ListReverse_Sq(SqList &L);
int main() {
SqList L;
ElemType *p;
if(ListCreate_Sq(L)!= OK) {
printf("ListCreate_Sq: 创建失败!!!\n");
return -1;
}
ListReverse_Sq(L);
if(L.length){
for(p=L.elem;p<L.elem+L.length-1;++p){
printf("%d ",*p);
}
printf("%d",*p);
}
return 0;
}
/* 请在这里填写答案 */
输入格式: 第一行输入一个整数n,表示顺序表中元素个数,接下来n个整数为表元素,中间用空格隔开。 输出格式: 输出逆置后顺序表的各个元素,两个元素之间用空格隔开,最后一个元素后面没有空格。
输入样例:
4
1 2 3 4
输出样例:
4 3 2 1
代码部分
Status ListCreate_Sq(SqList &L)
{
int n;
scanf("%d",&n);
if(n<=0)return ERROR;
L.listsize=LIST_INIT_SIZE;
L.elem=(ElemType*)malloc(sizeof(ElemType)*n);
for(int i=0;i<n;i++){
scanf("%d",&L.elem[i]);
}
L.length=n;
return 1;
}
void ListReverse_Sq(SqList &L)
{
for(int i=0;i<=L.length/2;i++){
int temp=L.elem[i];
L.elem[i]=L.elem[L.length-1-i];
L.elem[L.length-1-i]=temp;
}
}
6-2 有序顺序表的插入 (10 分)
本题要求实现递增顺序表的有序插入函数。L是一个递增的有序顺序表,函数Status ListInsert_SortedSq(SqList &L, ElemType e)用于向顺序表中按递增的顺序插入一个数据。 比如:原数据有:2 5,要插入一个元素3,那么插入后顺序表为2 3 5。 要考虑扩容的问题。
函数接口定义:
Status ListInsert_SortedSq(SqList &L, ElemType e);
裁判测试程序样例:
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//顺序表的存储结构定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct{
ElemType* elem; //存储空间基地址
int length; //表中元素的个数
int listsize; //表容量大小
}SqList; //顺序表类型定义
//函数声明
Status ListInsert_SortedSq(SqList &L, ElemType e);
//顺序表初始化函数
Status InitList_Sq(SqList &L)
{
//开辟一段空间
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
//检测开辟是否成功
if(!L.elem){
exit(OVERFLOW);
}
//赋值
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
//顺序表输出函数
void ListPrint_Sq(SqList L)
{
ElemType *p = L.elem;//遍历元素用的指针
for(int i = 0; i < L.length; ++i){
if(i == L.length - 1){
printf("%d", *(p+i));
}
else{
printf("%d ", *(p+i));
}
}
}
int main()
{
//声明一个顺序表
SqList L;
//初始化顺序表
InitList_Sq(L);
int number = 0;
ElemType e;
scanf("%d", &number);//插入数据的个数
for(int i = 0; i < number; ++i)
{
scanf("%d", &e);//输入数据
ListInsert_SortedSq(L, e);
}
ListPrint_Sq(L);
return 0;
}
/* 请在这里填写答案 */
输入格式: 第一行输入接下来要插入的数字的个数 第二行输入数字 输出格式: 输出插入之后的数字
输入样例:
5
2 3 9 8 4
输出样例:
2 3 4 8 9
代码部分
Status ListInsert_SortedSq(SqList &L, ElemType e)
{
if(L.length==0)
//判断顺序表是否为空。如果为空,则把该数据放在首位,表长加一。。
{
*L.elem=e;
L.length++;
}
else
{
//如过不为空,则先检查顺序表是否已经满了。
while(L.length==L.listsize)
//满的话进行扩容操作。
{
L.elem=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!L.elem)
{
exit(OVERFLOW);
}
L.listsize+=LISTINCREMENT;
}
//对数据进行比较 ,按顺序插入,表长加一。
int i;
for(i=0;i<L.length;i++)
{
if(e<*(L.elem+i))
{
for(int j=L.length-1;j>=i;j--)
{
*(L.elem+j+1)=*(L.elem+j);
}
*(L.elem+i)=e;
break;
}
}
if(i>=L.length)
{
*(L.elem+L.length)=e;
}
L.length++;
}
}