数据结构作业——第四周-链表

1 . 容易 (6分)

与非循环单链表相比,循环单链表的主要优点是______。

A. 不再需要头结点

B. 已知某个结点能够容易找到它的前驱结点

C. 在进行插入、删除操作时,能更好地保证链表不断开

D. 从表中任意结点出发都能遍历整个链表

 回答正确

答案

从表中任意结点出发都能遍历整个链表

2 . 容易 (6分)

非空循环单链表head的尾结点p满足______。

A. p.next==null

B. p==null

C. p.next==head

D. p==head

 回答正确

答案

p.next==head

3 . 容易 (6分)

在长度为n(n≥1)的循环单链表L中,删除尾结点的时间复杂度为______。

A. O(1)

B. O(n)

C. O(n2)

D. O(nlog2n)

 回答正确

答案

O(n)

4 . 容易 (6分)

有两个长度为n(n>1)的不带头结点的单链表,结点类型相同,A是非循环的,B是循环的,则以下正确的是______。

A. 对于这两个链表来说,删除首结点的时间复杂度都是O(1)

B. 对于这两个链表来说,删除尾结点的时间复杂度都是O(n)

C. 循环单链表B比非循环单链表A占用更多的内存空间

D. 以上都不对

 回答正确

答案

对于这两个链表来说,删除尾结点的时间复杂度都是O(n)

5 . 容易 (6分)

有一个非空循环双链表,在结点p之前插入结点q的操作是______。

A. p.prior=q; q.next=p; p.prior.next=q; q.prior=p.prior;

B. p.prior=q; p.prior.next=q; q.next=p; q.prior=p.prior;

C. q.next=p; q.prior=p.prior; p.prior=q; p.prior.next=q;

D. q.next=p; q.prior=p.prior; p.prior.next=q; p.prior=q; 

 回答正确

答案

q.next=p; q.prior=p.prior; p.prior.next=q; p.prior=q; 

解析

暂无解析

学生答案

D. q.next=p; q.prior=p.prior; p.prior.next=q; p.prior=q;

6 . 容易 (6分)

有一个非空循环双链表,在结点p之后插入结点q的操作是q.next=p.next; p.next=q; q.prior=p; ______。

A. p.next=q;

B. q.prior.next=q;

C. q.next.prior=q;

D. q.next.next=q; 

 回答正确

答案

q.next.prior=q;

7 . 容易 (6分)

在长度为n的______ 上,删除尾结点的时间复杂度为O(1)。

A. 单链表

B. 双链表

C. 循环单链表

D. 循环双链表

 回答正确

答案

循环双链表

8 . 容易 (6分)

若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许连续3次出栈工作,则不可能得到的出栈序列是______。

A. dcebfa

B. cbdaef

C. bcaefd

D. afedcb

 回答正确

答案

afedcb

栈:先入后出

9 . 容易 (6分)

一个栈的进栈序列是a、b、c、d、e,则栈的不可能的输出序列是______。

A. edcba

B. decba

C. dceab

D. abcde

 回答正确

答案

dceab

10 . 容易 (6分)

已知一个栈的进栈序列是1,2,3,…,n,其输出序列的第一个元素是i(1≤i≤n),则第j(1≤j≤n)个出栈元素是______。

A. i

B. n-i

C. j-i+1

D. 不确定

 回答正确

答案

不确定

11 . 容易 (5分)

已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值______。

A. i

B. n-i

C. n-i+1

D. 不确定

 回答正确

答案

n-i+1

12 . 容易 (5分)

设有5个元素进栈序列是a、b、c、d、e,其输出序列是c、e、d、b、a,则该栈的容量至少是______。

A. 1

B. 2

C. 3

D. 4

 回答正确

答案

4

13 . 容易 (5分)

设n个元素进栈序列是1、2、3、…、n,其输出序列是p1、p2、…、pn,若p1=3,则p2的值为______。

A. 一定是2

B. 一定是1

C. 不可能是1

D. 以上都不对

 回答正确

答案

不可能是1

14 . 容易 (5分)

当用一个数组data[0..n-1]存放栈中元素时,栈底最好______。

A. 设置在data[0]处

B. 设置在data[n-1]处

C. 设置在data[0]或data[n-1]处

D. 设置在data数组的任何位置

 回答正确

答案

设置在data[0]或data[n-1]处

15 . 容易 (5分)

若一个栈元素用数组data[1..n]存储,初始栈顶指针top为n,则以下元素x进栈最适合的操作是______。

A. top++; data[top]=x;

B. data[top]=x; top++;

C. top--; data[top]=x;

D. data[top]=x; top--;

 回答正确

答案

data[top]=x; top--;

16 . 容易 (5分)

若一个栈元素用数组data[1..n]存储,初始栈顶指针top为n,则以下出栈元素x最适合的操作是______。

A. x=data[top]; top++;

B. top++; x=data[top];

C. x=data[top]=x; top--;

D. top--; x=data[top];

 回答正确

答案

top++; x=data[top];

17 . 容易 (5分)

若一个栈元素用数组data[1..n]存储,初始栈顶指针top为0,则以下元素x进栈最适合的操作是______。

A. top++; data[top]=x;

B. data[top]=x; top++;

C. top--; data[top]=x;

D. data[top]=x; top--;

 回答错误

答案

top++; data[top]=x;

18 . 容易 (5分)

若一个栈元素用数组data[1..n]存储,初始栈顶指针top为0,则以下出栈元素x最适合的操作是______。

A. x=data[top]; top--;

B. x=data[top]; top++;

C. top--; x=data[top];

D. top++; x=data[top];;

 回答正确

答案

x=data[top]; top--;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。
9.25实现下列函数: int Search(SSTable s, KeyType k); /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ 静态查找表的类型SSTable定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct { ElemType *elem; int length; } SSTable; int Search(SSTable a, KeyType k) /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ { int i; if(a.length==0) return ERROR; //先判断a是否为空 a.elem[a.length+1].key=k; for(i=1;a.elem[i].key>k;i++) if(i>=a.length||a.elem[i].key<k) //不能忽略i=a.length这种情况 return ERROR; return i; } /* { int i; a.elem[a.length+1].key=k; for(i=1;a.elem[i].key>k;i++) if(i>a.length||a.elem[i].key<k) return ERROR; return i; } */ 9.26② 试将折半查找算法改写成递归算法。 实现下列函数: int BinSearch(SSTable s, int low, int high, KeyType k); /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ 静态查找表的类型SSTable定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct { ElemType *elem; int length; } SSTable; int BinSearch(SSTable s, int low, int high, KeyType k) /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ { int mid; if(low<=high) { mid=(low+high)/2; if(s.elem[mid].key==k) return mid; if(s.elem[mid].key<k) return BinSearch(s,mid+1,high,k); if(s.elem[mid].key>k) return BinSearch(s,low,high-1,k); } return 0; } /* { int mid; if(low<=high) { mid=(low+high)/2; if(s.elem[mid].key<k) return BinSearch(s,mid+1,high,k); else return BinSearch(s,low,high-1,k); } return 0; } */ 9.31④ 试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构。且树中结点的关键字均不同。 实现下列函数: Status IsBSTree(BiTree t); /* 判别给定二叉树t是否为二叉排序树。*/ /* 若是,则返回TRUE,否则FALSE */ 二叉树的类型BiTree定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct BiTNode { ElemType data; BiTNode *lchild,*rchild; }BiTNode, *BiTree; KeyType predt=-32767; Status IsBSTree(BiTree t) /* 判别给定二叉树t是否为二叉排序树。*/ /* 若是,则返回TRUE,否则FALSE */ { if( t )//&& ! ( t->lchild || t->rchild ) )//空树和叶子不用判断 { if( t->lchild && ( t->data.key < t->lchild->data.key ) )//左孩子不空,左孩子的key比本身的大 return FALSE; else if( t->rchild && ( t->data.key > t->rchild->data.key ) )//右孩子不空,右孩子的key比本身的大 return FALSE; else if( !IsBSTree( t->lchild ) )//判断左子树 return FALSE; else if( !IsBSTree( t->rchild ) )//判断右子树 return FALSE; } return TRUE; } /* { if(!t) return OK; if(t&&!t->lchild&&!t->rchild) return OK; else { if(t->lchild->data.key<t->data.key) IsBSTree(t->lchild); if(t->lchild->data.key>=t->data.key) return ERROR; if(t->rchild->data.key>t->data.key) IsBSTree(t->rchild); else return ERROR; return OK; } } */ 9.33③ 编写递归算法,从大到小输出给定二叉排序树中所有关键字不小于x的数据元素。要求你的算法的时间复杂度为O(log2n+m),其中n为排序树中所含结点数,m为输出的关键字个数。 实现下列函数: void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)); /* Output is to use visit(t->data); */ 二叉树的类型BiTree定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct BiTNode { ElemType data; BiTNode *lchild,*rchild; }BiTNode, *BiTree; void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)) /* Output is to use visit(t->data); */ { if(t->rchild) OrderOut(t->rchild,x,visit); if(t->data.key>=x) visit(t->data); if(t->lchild)OrderOut(t->lchild,x,visit); } /* { if(t->rchild) OrderOut(t->rchild,x); if(t->data<x) exit(); visit(x); if(t->lchild)OrderOut(t->lchild,x); } */ 9.44④ 已知某哈希表的装载因子小于1,哈希函数 H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。 实现下列函数: void PrintKeys(HashTable ht, void(*print)(StrKeyType)); /* 依题意用print输出关键字 */ 哈希表的类型HashTable定义如下: #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1 typedef char StrKeyType[4]; typedef struct { StrKeyType key; void *any; } HElemType; int hashsize[] = { 7,11,17,23,29,37,47 }; typedef struct { HElemType elem[MAXLEN]; int count; int sizeindex; } HashTable; int H(char *s)//求Hash函数 { if( s[0] ) return s[0]-'A'+1; //求关键字第一个字母的字母序号(小写) else return 0; } void PrintKeys(HashTable ht, void(*print)(StrKeyType)) /* 依题意用print输出关键字 */ { int i,j; for( i = 1; i <= 26; i++ ) { for( j = (i-1)%hashsize[ht.sizeindex]; ht.elem[j].key[0]; ) { if( H ( ht.elem[j].key ) == i ) print(ht.elem[j].key); j = (j+1)%hashsize[ht.sizeindex]; } } } /* void PrintKeys(HashTable ht, void(*print)(StrKeyType)) /* 依题意用print输出关键字 { int i,j; for(i=1;i<=26;i++) for(j=i;ht.elem[j].key;j=(j+1)%MAXLEN) if(H(ht.elem[j].key)==i) print(ht); } int H(char *s) { if(s) return s[0]-96; else return 0; } */ 9.45③ 假设哈希表长为m,哈希函数为H(x),用链地址法处理冲突。试编写输入一组关键字并建造哈希表的算法。 实现下列函数: int BuildHashTab(ChainHashTab &H, int n, HKeyType es[]) /* 直接调用下列函数 */ /* 哈希函数: */ /* int Hash(ChainHashTab H, HKeyType k); */ /* 冲突处理函数: */ /* int Collision(ChainHashTab H, HLink &p); */ { int i = 0,l,flag; HLink p,node; while( es[i] ) { l = Hash( H, es[i] ); node = ( HLink )malloc( sizeof( HNode ) ); node->data = es[i]; node->next = NULL; i++; if( !H.elem[l] ) H.elem[l] = node; else { flag = 0; p = H.elem[l]; if( p->data == node->data ) flag = 1; while( Collision( H, p ) ) if( p->data == node->data ) { flag = 1; break; } if( !flag ) { p = H.elem[l]; node->next = p; H.elem[l] = node; } } } } "+userLink+""; $('miniAd').show(); } }, onFailure: function(){} }}); } showMiniAd();

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值