《数据结构》第1章绪论第2章线性表习题课答案一、选择题1在下面的程序段中,对x的赋值语句的频度为(C)FORi:=1TOnDOFORj:=1TOnDOx:=x+1;A.O(2n)B.O(n)C.O(n2)D.O(log2n)2一个算法应该是(B)。A.程序B.问题求解步骤的描述C.要满足五个基本特性D.A和C.3某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表4链表不具有的特点是(B)A.插入、删除不需要移动元素B.可随机访问任一元素C.不必事先估计存储空间D.所需空间与线性长度成正比5完成在双循环链表结点p之后插入s的操作是(D);A.p-next=s;s-priou=p;p-next-priou=s;s-next=p-next;B.p-next-priou=s;p-next=s;s-priou=p;s-next=p-next;C.s-priou=p;s-next=p-next;p-next=s;p-next-priou=s;D.s-priou=p;s-next=p-next;p-next-priou=s;p-next=s;二、判断题1数据元素是数据的最小单位。(×)2数据的物理结构是指数据在计算机内的实际存储形式。(√)3对任何数据结构链式存储结构一定优于顺序存储结构。(×)4顺序存储方式的优点是存储密度大,且插入、删除运算效率高。(×)三、填空1一个数据结构在计算机中表示(又称映像)称为存储结构。2在一个长度为n的顺序表中第i个元素(1=i=n)之前插入一个元素时,需向后移动___n-i+1__个元素。3带头结点的双循环链表L中只有一个元素结点的条件是:__L-next-next==L_4以下程序的功能是实现带附加头结点的单链表数据结点逆序连接,请填空完善之。voidreverse(linklisth)/*h为附加头结点指针;*/{linklistp,q;p=h-next;h-next=NULL;while((1)_p!=null∥链表未到尾就一直作_){q=p;p=p-next;q-next=h-next;h-next=(2)__q∥将当前结点作为头结点后的第一元素结点插入_;}5在单链表中设置头结点的作用是_主要是使插入和删除等操作统一,在第一个元素之前插入元素和删除第一个结点不必另作判断。另外,不论链表是否为空,链表头指针不变。__6设单链表中某指针p所指结点(即p结点)的数据域为data,链指针域为next,请写出在p结点之前插入s结点的操作:s-next=p-next;p-next=s;x=p-data;p-data=s-data;s-data=x;p=s;三、算法设计题1设有带头结点的单链表L,编程对表中任一值只保留一个结点,删除其余值相同的结点。答:Voiddelete(linklist&L){linklistp,q,tmp;P=L-next;While(p-next!=NuLL){q=p;While(q-next!=NuLL){if(q-next-data==p-data){tmp=q-next;q-next=tmp-next;free(tmp);}//ifElse{q=q-next;}//else}//内层whilep=p-next;}//外层while}//delete2编写一个算法来交换单链表中指针P所指结点与其后继结点,HEAD是该链表的头指针,P指向该链表中某一结点。答:[题目分析]单链表中查找任何结点,都必须从头指针开始。本题要求将指针p所指结点与其后继结点交换,这不仅要求知道p结点,还应知道p的前驱结点。这样才能在p与其后继结点交换后,由原p结点的前驱来指向原p结点的后继结点。LinkedListExchange(LinkedListHEAD,p)∥HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后继结点交换。{q=head-next;∥q是工作指针,指向链表中当前待处理结点。pre=head;∥pre是前驱结点指针,指向q的前驱。while(q!=null&&q!=p){pre=q;q=q-next;}∥未找到p结点,后移指针。if(p-next==null)printf(“p无后继结点\n”);∥p是链表中最后一个结点,无后继。else∥处理p和后继结点交换{q=p-next;∥暂存p的后继。pre-next=q;∥p前驱结点的后继指向p的后继。p-next=q-next;∥p的后继指向原p后继的后继。q-next=p;∥原p后继的后继指针指向p。}}∥算法结束。3假设一个单循环链表,其结点含有三个域pre、data、link。其中data为数据域;pre为指针域,它的值为空指针(NIL);link为指针域,它指向后继结点。请设计算法,将此表改成双向循环链表。答:voidStoDouble(DuLinkList&la)∥la是结点含有pre,data,link三个域的单循环链表。其中data为数据域,pre为空指针域,link是指向后继的指针域。本算法将其改造成双向循环链表。{while(la-link-pre==null){la-link-pre=la;∥将结点la后继的pre指针指向la。la=la-link;∥la指针后移。}}∥算法结束。[算法讨论]算法中没有设置变量记住单循环链表的起始结点,至少省去了一个指针变量。当算法结束时,la恢复到指向刚开始操作的结点,这是本算法的优点所在。4假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。答:VoidMergelist_Down_L(LinkList&la,LinkList&lb)∥la,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列,本算法将两链表合并成一个按元素值递减次序排列的单链表。{pa=la-next;pb=lb-next;∥pa,pb分别是链表la和lb的工作指针la-next=null;∥la作结果链表的头指针,先将结果链表初始化为空。while(pa!=null&&pb!=null)∥当两链表均不为空时作if(pa-data=pb-data){r=pa-next;∥将pa的后继结点暂存于r。pa-next=la-next;∥将pa结点链于结果表中,同时逆置。la-next=pa;pa=r;∥恢复pa为当前待比较结点。}else{r=pb-next;∥将pb的后继结点暂存于r。pb-next=la-next;∥将pb结点链于结果表中,同时逆置。la-next=pb;pb=r;∥恢复pb为当前待比较结点。}while(pa!=null)∥将la表的剩余部分链入结果表,并逆置。{r=pa-next;pa-next=la-next;la-next=pa;pa=r;}//if(!pb)pb=pa;可用该if语句代替上述while循环while(pb!=null){r=pb-next;pb-next=la-next;la-next=pb;pb=r;}free(lb);}∥算法Union结束。[算法讨论]上面两链表均不为空的表达式也可简写为while(pa&&pb),两递增有序表合并成递减有序表时,上述算法是边合并边逆置。也可先合并完,再作链表逆置。后者不如前者优化。算法中最后两个while语句,不可能执行两个,只能二者取一,即哪个表尚未到尾,就将其逆置到结果表中,即将剩余结点依次前插入到结果表的头结点后面。