第二章    习题与解答
判断题
1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
单选题 (请从下列ABCD选项中选择一项)
1.线性表是(  )
(A) 一个有限序列,可以为空;  (B) 一个有限序列,不能为空;
(C) 一个无限序列,可以为空;  (D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。插入一个元素时平均要移动表中的( )个元素。
          (A) n/2      (B)  n+1/2      (C)  n -1/2      (D)  n   
3.线性表采用链式存储时,其地址(  )
(A) 必须是连续的;    (B) 部分地址必须是连续的;
(C) 一定是不连续的;  (D) 连续与否均可以。
4.用链表表示线性表的优点是(
(A)便于随机存取
(B)花费的存储空间较顺序存储少
(C)便于插入和删除
(D)数据元素的物理顺序与逻辑顺序相同
5. 某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表
(B)双链表
(C)单循环链表
(D)带头结点的双循环链表
6. 循环链表的主要优点是(  )
(A)不在需要头指针了
(B)已知某个结点的位置后,能够容易到他的直接前趋
(C)在进行插入、删除运算时,能更好的保证链表不断开
(D)从表中的任意结点出发都能扫描到整个链表
7. 下面关于线性表的叙述错误的是(  )
(A) 线性表采用顺序存储,必须占用一片地址连续的单元;
(B) 线性表采用顺序存储,便于进行插入和删除操作;
(C) 线性表采用链式存储,不必占用一片地址连续的单元;
(D) 线性表采用链式存储,不便于进行插入和删除操作;
8. 单链表中,增加一个头结点的目的是为了( )。
(A) 使单链表至少有一个结点  (B)标识表结点中首结点的位置
C)方便运算的实现          (D) 说明单链表是线性表的链式存储
9. 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。
(A) 单链表    (B) 仅有头指针的单循环链表 
(C) 双链表    (D) 仅有尾指针的单循环链表
10. 若某线性表中最常用的操作是取第i个元素和第i个元素的前趋元素,则采用( )存储方式最节省运算时间( )。
(A) 单链表c语言中struct    (B) 顺序表 
(C) 双链表    (D) 单循环链表
填空题
1.带头结点的单链表H为空的条件是__________________
1. 非空单循环链表L*p是尾结点的条件是__________________
3.在一个单链表中p所指结点之后插入一个由指针f所指结点,应执行s->next=________;p->next=_____________的操作。
4.在一个单链表中p所指结点之前插入一个由指针f所指结点,可执行以下操作:
s->next=________;
p->next=s;
t=p->data;
p->data=___________;
s->data=___________;
5.在顺序表中做插入操作时首先检查_________________
  算法设计题
1. 设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性。并且分析算法的时间复杂度。
2. 已知一顺序表A,其元素值非递减有序排列,编写一个函数删除顺序表中多余的值相同的元素。
3. 编写一个函数,从一给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。
提示:可以先将顺序表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。
4. 线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中的字符按字母字符、数字字符和其它字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。(研54
5. 线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素和后n个元素进行整体互换。即将线性表
a1, a2, … , am, b1, b2, … , bn  改变为:
b1, b2, … , bn , a1, a2, … , am)。
6. 已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然有序。并且分析算法的时间复杂度。
7. 假设有两个已排序的单链表AB,编写一个函数将他们合并成一个链表C而不改变其排序性。
8. 假设长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某一结点的指针,编写一个函数删除该结点的前趋结点。
9. 已知两个单链表AB分别表示两个集合,其元素递增排列,编写一个函数求出AB的交集C,要求C同样以元素递增的单链表形式存储。
10. 设有一个双向链表,每个结点中除有priordatanext域外,还有一个访问频度freq域,在链表被起用之前,该域其值初始化为零。每当在链表进行一次Locata(L,x)运算后,令值为x的结点中的freq域增1,并调整表中结点的次序,使其按访问频度的递减序列排列,以便使频繁访问的结点总是靠近表头。试写一个算法满足上述要求的Locata(L,x)算法。
上机实习题目
1. Josephu  问题
Josephu  问题为:设编号为12… nn个人围坐一圈,约定编号为k1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
    提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单
循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
2. 一元多项式的相加
    提示:
(1) 一元多项式的表示问题:对于任意一元多项式:
Pn(x)= P0+ P1X1+ P2X2+ … + PiXi+ … + PnXn
可以抽象为一个由“系数-指数”对构成的线性表,且线性表中各元素的指数项是递增的:
  P=( ( P0,0), ( P1,1), ( P2,2), … , ( Pn,n) )
(2 )  用一个单链表表示上述线性表,结点结构为:
    typedef  sturct  node
      {  float  coef;  /*系数域*/
        int    exp;  /*指数域*/
        struct node   *next; /*指针域*/
        } Ploy Node;
约瑟夫环问题
    约瑟夫环问题:设编号为123,……,nn(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。
源程序代码:(在Tubro C 2.0测试通过)
#include <stdlib.h>
#include <alloc.h>
struct node
{
    int number; /* 人的序号 */
    int cipher; /* 密码 */
    struct node *next; /* 指向下一个节点的指针 */
};
struct node *CreatList(int num) /* 建立循环链表 */
{
    int i;
    struct node *ptr1,*head;
    if((ptr1=(struct node *)malloc(sizeof(struct node)))==NULL)
    {
        perror("malloc");
        return ptr1;
    }
    head=ptr1;
    ptr1->next=head;
    for(i=1;i<num;i++)
    {
        if((ptr1->next=(struct node *)malloc(sizeof(struct node)))==NULL)
        {
            perror("malloc");
            ptr1->next=head;
            return head;
        }
        ptr1=ptr1->next;
        ptr1->next=head;
    }
    return head;
}
main()
{
    int i,n=30,m; /* 人数n30 */
    struct node *head,*ptr;
    randomize();
    head=CreatList(n);
    for(i=1;i<=30;i++)
    {
        head->number=i;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。