习题集解析部分

第2章  线性表

                                                                                          ——《数据结构习题集》-严蔚敏.吴伟民版


源码使用说明 链接☛☛☛《数据结构》(严蔚敏,伟民版)课本源码+习题集解析使用说明

课本源码合辑 链接☛☛☛《数据结构》课本源码合辑


本文档所在目录:数据结构\▼配套习题解析\▼02 线性表\


习题解析

一、基础知识题

2.1❶    描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

        首元结点是指链表中存储线性表中第一个数据元素a1的结点。

        头结点是为了操作方便,在链表的首元结点之前附设的一个结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理。

        头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。若链表中附设头结点,则不管线性表是否为空表,头指针均不为空,否则表示空表的链表的头指针为空。

        这三个概念对单链表、双向链表和循环链表均适用。是否设置头结点,是不同的存储结构表示同一逻辑结构的间题。


2.2❶    填空题

    (1)在顺序表中插入或删除一个元素,需要平均移动__表中一半__元素,具体移动的元素个数与__该元素的位置__有关。

    (2)顺序表中逻辑上相邻的元素的物理位置__必定__相邻。单链表中逻辑上相邻的元素在物理位置__不一定__相邻。

    (3)在单链表中,除了首元结点外,任一结点的存储位置由__其直接前驱结点的链域的值__指示。

    (4)在单链表中设置头结点的作用是__插入和删除首元素时不必进行特殊处理__。


2.3❷    在什么情况下用顺序表比链表好?

当不需频繁在存储的元素间进行插入和删除操作时,用顺序表较好。


2.4❶    对以下单链表分别执行下列各程序段,并画出结果示意图。

头歌Sql server专题实验 头歌数据库答案_数据结构


    (1)Q=P->next;

    (2)L=P->next;

    (3)R->data=P->data;

    (4)R->data=P->next->data;

    (5)P->next->next->next->data=P->data;

    (6)T=P;

          while(T!=NULL)

          {

                T->data=T->data*2;

                T=T->next;

          }

    (7)T=P;

          while(T->next!=NULL)

          {

                T->data=T->data*2;

                T=T->next;

          }

 

头歌Sql server专题实验 头歌数据库答案_线性表_02


2.5❶    画出执行下列各行语句后各指针及链表的示意图。

    L = (LinkList)malloc (sizeof(LNode));

    P = L;

    for(i=1;i<=4; i++)

    {

        P->next=(LinkList) malloc (sizeof(LNode));

        P= P->next;

        P->data= i*2-1;

    }

    P->next= NULL;

    for(i=4;i>=1; i--)

        Ins_LinkList(L, i+1, i*2);

    for(i=1; i<=3; i++)

        Del_LinkList(L, i);

头歌Sql server专题实验 头歌数据库答案_链表_03


2.6❷    已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

    a.在P结点后插入S结点的语句序列是__(4)(1)__。

    b.在P结点前插入S结点的语句序列是__(7)(11)(8)(4)(1)__。

    c.在表首插入S结点的语句序列是__(5)(12)__。

    d.在表尾插入S结点的语句序列是__(9)(1)(6)__。

    (1)P->next=S;

    (2)P->next=P->next->next;

    (3)P->next=S->next;

    (4)S->next=P->next;

    (5)S->next=L;

    (6)S->next=NULL;

    (7)Q=P;

    (8)while(P->next!=Q)

                P=P->next;

NULL)

                P=P->next;

    (10)P=Q;

    (11)P=L;

    (12)L=S;

    (13)L=P;


2.7❷    已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

    a.删除P结点的直接后继结点的语句序列是__(11)(3)(14)__。

    b.删除P结点的直接前驱结点的语句序列是__(10)(12)(8)(3)(14)__。

    c.删除P结点的语句序列是__(10)(12)(7)(3)(14)__。

    d.删除首元结点的语句序列是__(12)(11)(3)(14)__。

    e.删除尾元结点的语句序列是__(9)(11)(3)(14)__。

    (1)P=P->next;

    (2)P->next=P;

    (3)P->next=P->next->next;

    (4)P=P->next->next;

    (5)while(P!=NULL)

                P=P->next;

    (6)while(Q->next!=NULL)

          {

                P=Q;

                Q=Q->next;

          }

    (7)while(P->next!=Q)

                P=P->next;

    (8)while(P->next->next!=Q)

                P=P->next;

    (9)while(P->next->next!=NULL)

                P=P->next;

    (10)Q=P;

    (11)Q=P->next;

    (12)P=L;

    (13)L=L->next;

    (14)free(Q);


2.8❷    已知P结点是某双向链表的中间结点,试从下列提供的答案中选择合适的语句序列。

(7)(3)(6)(12)__。

(8)(4)(5)(13)__。

(15)(1)(11)(18)__。

(16)(2)(10)(18)__。

(14)(9)(17)__。

    (1)P->next=P->next->next;

    (2)P->priou=P->priou->priou;

    (3)P->next=S;

    (4)P->priou=S;

    (5)S->next=P;

    (6)S->priou=P;

    (7)S->next=P->next;

    (8)S->priou=P-priou;

    (9)P->priou->next=P->next;

    (10)P->priou->next=P;

    (11)P->next->priou=P;

    (12)P->next->priou=S;

    (13)P->priou->next=S;

    (14)P->next->priou=P->priou;

    (15)Q=P->next;

    (16)Q=P->priou;

    (17)free(P);

    (18)free(Q);


2.9❷    简述下列算法的功能。

    (1)Status A(LinkedList L)         //L是无表头结点的单链表

          {

                if(L&&L->next)

                {

                    Q=L;

                    L=L->next;

                    P=L;

                    while(P->next)

                        P=P->next;

                    P->next=Q;

                    Q->next=NULL;

                }

                return  OK;

          }//A

    (2)voidBB(LNode *s, LNode *q)

          {

                p=s;

                while(p->next!=q)

                    p=p->next;

                p->next=s;

          }//BB

          void   AA(LNode*pa, LNode *pb)

          {//pa和pb分别指向单循环链表中的两个结点

               BB(pa,pb);

                BB(pb,pa);

          }//AA

(1)如果L的长度不小于2,则将首元结点删去并插入表尾。

(2)将单循环链表拆成两个单循环链表。




二、算法设计题


本章算法设计题设计的顺序表和线性链表的类型定义如下:


    #define LIST_INIT_SIZE 100

    #define LISTINCREMENT 10

    typedef struct

    {

        ElemType*elem;         //存储空间基址

        int            length;         //当前长度

        int            listsize;            //当前分配的存储容量

    }SqList;                           //顺序表类型

注:此文档中,ElemType被定义为int类型。

    typedef struct LNode

    {

        ElemType data;

        Struct   Lnode   *next;

    }LNode, *LinkList;               //线性链表类型



┏━━━┓

┣ 顺序表 ┫

┗━━━━┛

2.10❷  指出以下算法的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。

   Status DeleteK(SqList &a, int i, int k)

    {//本过程从顺序存储结构的线性表a中删除第i个元素起的k个元素

        if(i<1 || k<0 || i+k>a.length)

            return INFEASIBLE;             //参数不合法

        else

            for(count=1; count<k; count++)

            {//删除一个元素

                for(j=a.length; j>=i+1; j--)

                    a.elem[j-1]= a.elem[j];

                    a.length--;

            }

        returnOK;

    }//DeleteK 

错误有两处:

     (1)参数不合法的判别条件不完整。合法的入口参数条件为:(删除时包括第i个元素)

(0<i≤a.length)&& (0≤k≤a.length-i+1)

     (2)第二个for语句中,元素前移的次序错误。

低效之处是每次删除一个元素的策略。

改正:

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.10题


头歌Sql server专题实验 头歌数据库答案_链表_04


2.11❷  设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.11题

头歌Sql server专题实验 头歌数据库答案_数据结构_05


2.12❸  设A=(a1,...,an)和B=(b1,...,bn)均为顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z)和B'=(y,x,x,z))。若A'=B'=空表,则A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于B'的首元,则A<B;否则A>B。试写一个比较A,B大小的算法(请注意:在算法中,不要破坏原表A和B,并且,也不一定先求得A'和B'才进行比较)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.12题


头歌Sql server专题实验 头歌数据库答案_链表_06

头歌Sql server专题实验 头歌数据库答案_习题集_07

  

 

┏━━━┓

┣ 单链表 ┫

┗━━━━┛

2.13❷ 试写一算法在带头结点的单链表结构上实现线性表操作LOCATE(L,X)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.13题

头歌Sql server专题实验 头歌数据库答案_习题集_08


2.14❷  试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.14题

头歌Sql server专题实验 头歌数据库答案_线性表_09


2.15❷  已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法和时间复杂度。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.15题

头歌Sql server专题实验 头歌数据库答案_链表_10


2.16❸  已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中的第j个元素之前。试问此算法是否正确?如有错,则请改正之。

    Status DeleteAndInsertSub (LinkedList la, LinkedList lb, int i, int j, int len)

    {

        if(i<0|| j<0 || len<0)

            return  INFEASIBLE;

        p=la;    k=1;

        while(k<i)

        {

            p=p->next;

            k++;

        }

        q=p;

        while(k<=len)

        {

            q=q->next;

            k++;

        }

        s=lb;

        k=1;

        while(k<j)

        {

            s=s->next;

            k++;

        }

        s->next=p;

        q->next=s->next;

        return  OK;

    }//DeleteAndInsertSub

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.16题

头歌Sql server专题实验 头歌数据库答案_链表_11

头歌Sql server专题实验 头歌数据库答案_数据结构_12

头歌Sql server专题实验 头歌数据库答案_习题集_13


2.17❷  试写一算法,在无头结点的动态单链表上实现线性表操作INSERT(L, i, b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.17题



头歌Sql server专题实验 头歌数据库答案_习题集_14




2.18❷  同2.17题要求。试写一算法,实现线性表操作DELETE(L, i)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.18题

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_15

头歌Sql server专题实验 头歌数据库答案_线性表_16


2.19❸  已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.19题

头歌Sql server专题实验 头歌数据库答案_习题集_17

头歌Sql server专题实验 头歌数据库答案_习题集_18

头歌Sql server专题实验 头歌数据库答案_数据结构_19


2.20❷  同2.19题条件(递增有序排列),试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.20题

头歌Sql server专题实验 头歌数据库答案_线性表_20


┏━━━━━━┓

┣ 顺序表 

┗━━━━━━┛

2.21❸  试写一算法,实现顺序表的就将线性表(a1,a2, ..., an)逆置为(an,an-1, ..., a1)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.21题

头歌Sql server专题实验 头歌数据库答案_数据结构_21


┏━━━━┓

┣ 单链表 ┫

┗━━━┛

2.22❸  试写一算法,对单链表实现就地逆置。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.22题

头歌Sql server专题实验 头歌数据库答案_习题集_22


2.23❸  设线性表A=(a1, a2, ..., am),B=(b1, b2, ..., bn),试写一个按下列规则合并A,B为线性表C的算法,即使得

                    C=(a1,b1, ..., am, bm, bm+1, ..., bn)      当m<=n时;

或者              C=(a1, b1,..., an, bn, an+1, ..., am)        当m>n时。

线性表A,B和C均以单链表作存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.23题

头歌Sql server专题实验 头歌数据库答案_数据结构_23

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_24

头歌Sql server专题实验 头歌数据库答案_线性表_25


2.24❹  假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.24题

头歌Sql server专题实验 头歌数据库答案_数据结构_26

头歌Sql server专题实验 头歌数据库答案_习题集_27


┏━━━━━━┓

┣ 顺序表 ┫

┗━━━━━━┛

2.25❹  假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。试对顺序表编写求C的算法。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.25题

头歌Sql server专题实验 头歌数据库答案_习题集_28


━━━

┣ 单链表 ┫

┗━━━━━━┛

2.26❹  要求同2.25题。试对单链表编写求C的算法。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.26题

头歌Sql server专题实验 头歌数据库答案_数据结构_29



┏━━━━━━┓

┣ 顺序表 ┫

┗━━━━━━┛

2.27❹  对2.25题的条件作以下修改,对顺序表重新编写求得表C的算法。

可能存在值相同的元素,但要求新生成的表C中的元素值各不相同;

    (2)利用A表空间存放表C。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.27题

头歌Sql server专题实验 头歌数据库答案_链表_30

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_31

头歌Sql server专题实验 头歌数据库答案_线性表_32


┏━━━━━━┓

┣ 单链表 ┫

┗━━━━━━┛

2.28❹  对2.25题的条件作以下两点修改,对单链表重新编写求得表C的算法。

可能存在值相同的元素,但要求新生成的表C中的元素值各不相同。

    (2)利用原表(A表或B表)中的结点构造表C,并释放A表中的无用结点空间。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.28题

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_33

头歌Sql server专题实验 头歌数据库答案_链表_34

头歌Sql server专题实验 头歌数据库答案_数据结构_35


┏━━━━━━┓

┣ 顺序表 ┫

┗━━━━━━┛

2.29❺  已知A,B和C为三个递增有序的线去表。试对顺序表编写实现上述操作的算法,复杂度(注意:同一表中各元素值可能相同)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.29题

头歌Sql server专题实验 头歌数据库答案_数据结构_36


┏━━━━━━┓

┣ 单链表 ┫

┗━━━━━━

2.30❺  要求同2.29题。试对单链表编写算法,请释放A表中的无用结点空间。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.30题

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_37

头歌Sql server专题实验 头歌数据库答案_数据结构_38


┏━━━━━━━━━┓

┣单循环链表 ┫

┗━━━━━━━━━┛

2.31❷  假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.31题

头歌Sql server专题实验 头歌数据库答案_线性表_39


2.32❷  已知有一个单向循环链表,其每个结点中含三个域:pre,data和next,其中data为数据域,next为指向后继结点的指针域,pre也为指针域,但它的值为空(NULL),试编写算法将此单向循环链表改为双向循环链表,即使pre称为指向前驱结点的指针域。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.32题

头歌Sql server专题实验 头歌数据库答案_链表_40


2.33❸  已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),试编写算法将该线性链表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.33题

头歌Sql server专题实验 头歌数据库答案_链表_41

头歌Sql server专题实验 头歌数据库答案_习题集_42




    在2.34至2.36题中,“异或指针双向链表”类型XorLinkedList和指针异或函数XorP定义为:

    typedef struct XorNode

    typedef struct

无头结点的异或指针双向链表

左端和右端

    }XorLinkedList;

    XorPointer XorP(XorPointer p, XorPointer q);     //指针异或函数XorP返回指针p和q的异或(XOR)值


头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_43

 


┏━━━━━━━━━━━━━━━━━━━━━━━━━┓

┣ 扩展的双链表(异或指针链表)  ┫

┗━━━━━━━━━━━━━━━━━━━━━━━━━┛

2.34❹  假设在”表示),若a和b为指针,则a⊕b的运算结果仍为原指针类型,且

a⊕(a⊕b)=(a⊕a)⊕b=b

(a⊕b)⊕b=a⊕(b⊕b)=a

则可利用一个data域和LRPtr域,其中LRPtr域存放该结点的左邻与右邻结点指针(不存在时为NULL)的异或。若设指点,L.Right指向链表中的最右结点,双向链表的操作。试写一算法按任一方向依次输出链表中各元素的值。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.34题

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_44

头歌Sql server专题实验 头歌数据库答案_线性表_45

头歌Sql server专题实验 头歌数据库答案_习题集_46


2.35❹  采用2.34题所述的存储结构,写出在第i个结点之前插入一个结点的算法。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.35题

头歌Sql server专题实验 头歌数据库答案_习题集_47

头歌Sql server专题实验 头歌数据库答案_线性表_48


2.36❹  采用2.34题所述的存储结构,写出删除第i个结点的算法。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.36题

头歌Sql server专题实验 头歌数据库答案_链表_49

头歌Sql server专题实验 头歌数据库答案_链表_50


┏━━━━━━━━━

┣ 双循环链表┫

┗━━━━━━━━━┛

2.37❹  设以带头结点的双向循环链表表示的线性表L=(a1,a2, ..., an),试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3, ..., an, ..., a4, a2)。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.37题

头歌Sql server专题实验 头歌数据库答案_线性表_51


2.38❹  设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而上述要求的LOCATE操作的算法。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.38题

头歌Sql server专题实验 头歌数据库答案_线性表_52




顺序存储结构SqPoly定义为

    typedef struct

    {

        int coef;

        int exp;

    }PolyTerm;

    typedef struct

    {                                      //多项式的顺序存储结构

        PolyTerm *data;

        int last;

    }SqPoly;



┏━━━━━━┓

┣ 多项式 ┫

┗━━━━━━┛

2.39❸  已知如下稀疏多项式:

头歌Sql server专题实验 头歌数据库答案_线性表_53

    其中n=em>em-1>…>e1≥0,ci≠0(i=1,2,...,m),m≥1。试采用存储量同多项式项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为给定值),并分析你的算法的时间复杂度。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.39题

头歌Sql server专题实验 头歌数据库答案_线性表_54


2.40❸  采用2.39题给定的条件和存储结构,编写求

头歌Sql server专题实验 头歌数据库答案_习题集_55

    的算法,将结果多项式存放在新辟的空间中,并分析你的算法的时间复杂度。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.40题

头歌Sql server专题实验 头歌数据库答案_习题集_56

头歌Sql server专题实验 头歌数据库答案_数据结构_57

头歌Sql server专题实验 头歌数据库答案_头歌Sql server专题实验_58




循环链表存储结构LinkedPoly定义为

    typedef  struct  PolyNode   

    {

        PolyTerm  data;

        struct  PolyNode  *next;

    }PolyNode,  *PolyLink;

    typedef  PolyLink  LinkedPoly;



2.41❷   试以循环链表作稀疏多项式的存储结构,编写求其导函数的算法,要求利用原多项式中的结点空间存放其导函数(多项式),同时释放所有无用(被删)结点。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.41题

头歌Sql server专题实验 头歌数据库答案_线性表_59


2.42❷  试编写算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间构成这两个链表。

完整源码见 ☛ 《数据结构习题集》-第2章-线性表-第2.42题

头歌Sql server专题实验 头歌数据库答案_线性表_60





        更多章节持续更新中...