17.对于线性表最常用的操作是查找指定序号的元素和在末尾插入元素,则选择( )最节省时间
A)顺序表 B)带头结点的双循环链表
C)单链表 D)带尾结点的单循环链表
为什么选择A选修
选修??选项吧?
简单来说,其它三个都是链表,只有A不是链表,单选题啊,就算不懂也会选A
链表的有点是插入,删除高效,但指定序号查找,末尾插入也不是优点,因为链表必须进行遍历才行。而且末尾插入要遍历到尾部。而顺序表直接通过下标就可以得到指定序号的数据了,都不需要查找啊。末尾也很清楚,顺序表有个长度数据可以马上定位到末尾所在位置,所以非常高效
// An highlighted block
#include<stdio.h>
#include<stdlib.h>
#define ListInitSize 10
#define ListIncrement 10
typedef struct{
int *base;
int length;
int listsize;
}SqList;
void InitSqList(SqList &L){
L.base=(int*)malloc(ListInitSize*sizeof(int));
if(!L.base)
exit(0);
L.listsize = ListInitSize;
printf("请输入线性表长度:\n");
scanf("%d",&L.length);
printf("请输入%d个整形元素:\n",L.length);
for(int i=0;i<L.length;i++)
scanf("%d",&L.base[i]);
}
void TraversalList(SqList &L){
printf("**********遍历线性表*************\n");
for(int i=0;i<L.length;i++)
printf("%3d",L.base[i]);
printf("\n");
}
void LocateElem(SqList &L,int &e){
int i = 0;
while(i<L.length){
if(L.base[i] == e){
printf("元素%d在线性表中是第%d位\n",e,i+1);
break;
}
else
i++;
}
if(i >= L.length)
printf("查找失败\n");
}
void ListInsert(SqList &L,int &i,int &e){
if(i<1||i>L.length+1){
printf("输入i值非法。\n");
exit(0);
}
if(L.length>=L.listsize){
int *newbase = (int*)realloc(L.base,L.listsize+ListIncrement*sizeof(int));
if(!newbase)
exit(0);
}
for(int j=L.length-1;j>=i-1;j--)
L.base[j+1] = L.base[j];
L.base[i-1] = e;
L.length++;
}
void ListDelete(SqList &L,int i,int &e){
if(i<1||i>L.length+1){
printf("输入i值非法。");
exit(0);
}
e = L.base[i-1];
printf("删除元素的值为:%d\n",e);
for(int j=i;j<L.length;j++)
L.base[j-1] = L.base[j];
L.length--;
}
int main(){
SqList L;
int i,e;
InitSqList(L);
TraversalList(L);
printf("请输入需要查找的元素:\n");
scanf("%d",&e);
LocateElem(L,e);
printf("请输入需要插入的元素和想插入的位置:\n");
scanf("%d%d",&e,&i);
ListInsert(L,i,e);
TraversalList(L);
printf("请输入要删除的元素位置:\n");
scanf("%d",&i);
ListDelete(L,i,e);
TraversalList(L);
return 0;
}