( )1. 在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每个元素的概率都相等)为 。
a、n b、n/2 c、(n+1)/2 d、(n-1)/2
( )2. 若某链表中最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用________存储方式最节省运算时间(假设链表仅设有一个head指针)。
a. 单链表 b. 双链表
c. 单循环链表 d. 带头结点的双循环链表
( )3. 设一个栈的输入序列为A,B,C,D,则借助一个栈所得到的输出序列不可能是_______。
a. A,B,C,D b. D,C,B,A c. A,C,D,B d. D,A,B,C
( )4. 若线性表最常用的操作是存取第i个元素及其直接前驱的值,则采用_____存储方式节省时间。
a.顺序表 b.双链表 c.单循环链表 d.单链表
( )5. 在具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是______。
a.O(1) b.O(n2) c.O(nlogn) d.O(n)
( )6. 若指针L指向一带头结点的循环单链表的头结点,该表为空表的条件是_______为真值;
a. !( L -> link ); b. L == (L -> link) -> link;
c. L -> link; d. L == L -> link;
( )7. 用数组A[0..N-1]存放一个循环队列,一元素出队时,其队头指针front的修改方法是________:
a. front = (front + 1) mod N; b. front = (front - 2)mod N;
c. front = front + 1; d. front = front – 2;
( )8. 广义表((f),(f))的表尾是 。
a. f b. (f) c. ((f)) d. ()
( )9. 串是一________。
a. 不少于一个字母的序列 b. 任意个字母的序列
c. 不少于一个字符的序列 d. 有限个字符的序列
( )10. 链表不具有的特点是_______。
a.可随机访问任一元素 b. 插入删除不需要移动元素
c. 不必事先估计存储空间 d. 所需空问与线性表长度成正比
二. 填空作图题(共58分):
1. 假设数组A含有n个元素,函数Random(n)需花费常数时间,sort(A,n)需花费nlog2n步,那么,下面程序段的时间复杂度T(n)=_________________。
sum=0;
for(int i=0; i<n*n; i++)
sum++;
for (i=0; i<n; i++){
for(j=0; j<n; j++)
A[i]=Random(n);
sort(A, n);
}
运算符栈
2. 如果采用一运算数栈和一运算符栈来计算由键盘输入的中缀表达式1+((2+3)*4+5)*9/(5-(6+7)*8)#的值,这里运算数栈用来存放计算过程中使用或产生的运算数,运算符栈用来存放尚未用于计算的运算符,那么按照算法,请将当运算数栈第一次在栈顶出现13时各栈中存放的数据情况填入下表。另外,请写出该中缀表达式对应的后缀表达式: .
运算数栈
3. 画出稀疏矩阵A的三元组表和十字链表。
4. 已知广义表为((), ‘a’, (2,(‘c’,5,8)));试画出该广义表的存储表示。
a 0 1 2 3 4 5 6 7 8
data 60 56 42 38 12 74 25 20
link 4 3 7 -1 2 8 -1 1 6
5. 在下面数组a中链接存储着一个线性表,其表头“指针”为head==0,可利用空间表第一个元素的“指针”av==5:
a 0 1 2 3 4 5 6 7 8
data 88 56 42 38 78 74 66 20
link 4
现在依次进行如下操作:1) 在元素56前插入元素78;2)删除元素60;3)删除25;4)在元素56后插入66;5)在元素66前插入88。请问,在进行上面操作后,av== ,并将此时数组a的内容填入下表:
三. 程序填空(22分)
1. 下面是某种线性表类的定义和实现(仅给出了部分操作)。函数DE()是用来判断线性表是否对称(即线性表 满足 , )。试在程序的每一划线部分填入一条语句或表达式, 完成函数DE()。
typedef struct Node {
int data;
struct Node *next, *prev;
}Node, * List;
void InitList (List &L) //初始化线性表L
{
L = (List) malloc(sizeof(Node));
L->next = L; L->prev = L;
}
void DestroyList(List &L) //销毁线性表L
{
Node *p, *q ; q = L->prev;
while(___①_________________){ p = q; q = q->prev; free(p);}
free(L);
}
bool DE(List &L) //判断线性表L对称否
{
Node *p, *q;
② ______________ ;
q = L ->prev;
while(p->data == q->data) {
if (p==q || ③ ________________ ) return TRUE;
else { ④ ________ ; ⑤ _____________ ; }
}
return FALSE;
}
2. 下面是仅给出了部分操作某线性表类的定义和实现。试在程序的每一划线部分填入一条语句或表达式,完成相应的操作。
typedef node {
int elem;
struct node *next;
}node,*LinkListPtr;
typedef struct {
LinkListPtr head,tail;
LinkListPtr curr;
} LinkList;
void InitLinkList(LinkList &L) //初始化线性表
{
L.head = (node *)malloc(sizeof(node));
if(L.head == NULL){cout<<"Insufficient memory available\n" ;exit(0);};
L.tail = L.head; L.curr = L.head;
}
void insert(LinkList &L,int & item) //在表L的当前位置处插入元素item
{
if(L.curr == NULL){cout<<"Current position is not a legal position\n";exit(0); };
node * newnode = (node *)malloc(sizeof(node));
if(newnode == NULL){cout<<"Insufficient memory available\n" ;exit(0);};
newnode->elem=item;
⑥___ ;
⑦ ;
if (L.tail == L.curr) L.tail = L.curr->next;
}
void setFirst(LinkList &L) //将表的当前位置定位于第1个元素
{
⑧ ;
}
int currValue(LinkList &L) //将表的当前位置的元素值返回
{
if(!isInList(L))
{
cout<<"Current position is not a legal position\n";exit(0);
}
return ⑨ ;
}
bool isEmpty(LinkList &L) //判断线性表是否为空
{
⑩ ;
}
bool isInList(LinkList &L) //判断curr是否在表中
{
return (L.curr != NULL) && (L.curr->next != NULL) && (!isEmpty(L));
}
bool find(LinkList &L ,const int & eval) //从表的当前位置开始查找元素eval
{
while (isInList(L))
if ( ⑾ ) return TRUE;
else L.curr = L.curr->next;
return FALSE;
}
有么高手帮下忙60分足矣