第二章线性表一、填空题1、数据逻辑结构包括线性结构、树型结构、图型结构这三种类型,树形结构和图形结构合称为非线性结构。2、在线性结构中,第一个结点没有前驱结点,其余每个结点有且只有个前驱结点,最后一个结点没有后续结点,其余每个结点有且只有一个后续结点。3、在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。4、在顺序表中,逻辑上相邻的元素,其物理位置一定相邻。在单链表中,逻辑上相邻的元素,其物理位置不一定相邻。5、在带头结点的非空单链表中,头结点的存储位置由头指针指示,首元素结点的存储位置由头结点的next域指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋结点的next域指示。6、阅读下列算法,并补充所缺内容。voidpurge_linkst(ListNode*&la){//从头指针为la的有序链表中删除所有值相同的多余元素,并释放被删结点空间ListNode*p,*q;if(la==NULL)return;q=la;p=la-link;while(p){if(p&&___(1)p-data!=q-data___){q=p;p=p-link;}else{q-link=___(2)p-link___;delete(p);p=___(3)q-link___;}}//while}//purge_linkst二、选择题1、在数据结构中,从逻辑上可以把数据结构分成C。A、动态结构和静态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构2、线性表的逻辑顺序与存储顺序总是一致的,这种说法B。A、正确B、不正确3、线性表若采用链式存储结构时,要求内存中可用存储单元的地址D。A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续或不连续都可以4、在以下的述叙中,正确的是B。A、线性表的线性存储结构优于链表存储结构B、二维数组是其数据元素为线性表的线性表C、栈的操作是先进先出D、队列的操作方式是先进后出三、综合题1、已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。A、在P结点后插入S结点的语句序列是((4)、(1));B、在P结点前插入S结点的语句序列是((7)、(11)、(8)、(4)、(1));C、在表首插入S结点的语句序列是((5)、(12));D、在表尾插入S结点的语句序列是((9)、(1)、(6)或(11)、(9)、(1)、(6))(其中6的位置可变);(1)P-next=S;(2)P-next=S-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;(9)while(P-next!=NULL)P=P-next;(10)P=Q;(11)P=L;(12)L=S;(13)L=P;2、已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。A、删除P结点的直接后继结点的语句序列是(11、3、14);B、删除P结点的直接前驱结点的语句序列是(10、12、8、11、3、14);C、删除P结点的语句序列是(10、12、7、3、14);D、删除首元结点的语句序列是(12、11、3、14);E、删除尾元结点的语句序列是(9、11、3、14)或(12、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-next!=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);3、线性表定位操作ListFind(L,x)的功能是:在线性表L中查找是否存在数据元素x,如果存在,返回线性表中和x值相等的第1个数据元素的序号(序号编号从0开始);如果不存在,返回-1。要求编写顺序表的定位操作算法。intListFind(SqlistL,ElemTypex){ElemType*p;inti=0;p=L.elem;while(iL.length-1&&!Compare(*p++,x)){returni;++i;}return-1;}4、在有些应用中,允许线性表中存在值相同的数据元素。线性表的另一个删除操作ListDeleteMore(L,x)的功能是:删除线性表L中所有等于x的数据元素。要求编写单链表的删除操作算法。typedefstructNode{ElemTypedata;structNode*next;}LNode;intListDeleteMore(LNode*L,ElemTypex)/*删除带头结点的单链表L的数据元素值为x结点*//*删除成功时返回1;失败返回0*/{LNode*p,*q*s;intj,flag;flag=0;p=L;/*p指向首元结点*/j=-1;/*j初始为-1*/q=p-next;while(q!=NULL)/*每次让指针p指向数据元素值为x的前一结点,q指向x*/{if(q-data=x){flag=1p-next=q-next;/*把数据元素ai结点从单链表中删除指*/free(q);/*释放指针q所指结点的内存空间*/q=p-next;/*只改q指针,p指针暂时不变*/}else{p=q;/*p,q指针同时后移*/q=q-next}}if(flag=1)Return1;/*有x*/elsereturn0;/*无x*/}5、编写算法实现顺序表的逆置,即要求把顺序表A中的数据元素序列(a0,a1,…,an-1)逆置为(an-1,…,a1,a0),并把逆置后的数据元素存储到顺序表B中。#defineLIST_INIT_SIZE100typedefstruct{ElemType*elem;//存储空间基址intlength;//当前长度intlistsize;//当前分配的存储容量//(以sizeof(ElemType)为单位)}SqList;voidReverse(Sqlist&LA,Sqlist&LB)//顺序表的就地逆置{ElemTypet;For(i=0,j=LA.length-1;ij;i++,j--){T=LA.elem[i];LA.elem[i]=LA.elem[j];LA.elem[j]=t;LB.elem[i]=LA.elem[i];}}6、编写循环双向链表的求数据元素个数操作算法和取数据元素操作算法。//以下双向循环链表带头结点structDuLNode{ElemTypedata;structDuLNode*prior,*next;}DuLNode;typedefstructDuLNode*DuLinkList;intListLength(DuLinkListL){//初始条件:L存在。操作结果:返回L中数据元素的个数inti=0;DuLinkListp=L-next;//p指向第一个结点while(p!=L)//没到表头{i++;p=p-next;}returni;}StatusGetElem(DuLinkListL,inti,ElemType*e){//当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORintj=1;DuLinkListp=L-next;//p指向第一个结点while(p!=L&&ji)//顺指针向后查找知道p指向第i个元素或p指向头结点{p=p-next;j++;}if(p==L||ji)//第i个元素不存在returnERROR;*e=p-data;//取第i个元素returnOK;}7、设计单循环链表,要求:单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取数据元素操作和判非空操作。typedefstructLNode{ElemTypedata;//数据域structLNode*next;//指针域}LNode,*LinkList;StatusInitList(LinkList*L){LinkListL;//定义一个链表,L=(LinkList)malloc(sizeof(listnode));//给这个链表分配内存控件If(!L)returnERROR;L-next=L;//初始化只有链表头,头链表指向自己ReturnOK;//返回这个头链表}intListLength(LinkListL){//初始条件:带头结点L存在。操作结果:返回L中数据元素的个数inti=0;LinkListp=L-next;//p指向第一个结点while(p!=L)//没到表头{i++;p=p-next;}returni;}StatusListInsert_L(LinkList&L,inti,ElemTypee){//L为带头结点的单链表的头指针,本算法//在链表中第i个结点之前插入新的元素ep=L;j=0;while(p!=L&&ji-1){p=p-next;++j;}//寻找第i-1个结点if(p=L||ji-1)returnERROR;//i大于表长或者小于1s=(LNode*)malloc(sizeof(LNode));s-data=e;s-next=p-next;p-next=s;}//LinstInsert_LStatusListDelete_L(LinkList&L,inti,ElemType&e){//删除以L为头指针(带头结点)的单链表中第i个结点p=L;j=0;while(p-next!=L&&ji-1){p=p-next;++j;}//寻找第i个结点,并令p指向其前趋if(p-next=L||ji-1)returnERROR;//删除位置不合理q=p-next;p-next=q-next;//删除并释放结点e=q-data;free(q);returnOK;}//ListDelete_LStatusGetElem_L(LinkListL,inti,ElemType&e){//L是带头结点的链表的头指针,以e返回第i个元素p=L-next;j=1;//p指向第一个结点,j为计数器while(p!=L&&ji){p=p-next;++j;}//顺指针向后查找,直到p指向第i个元素//或p为空if(p=L||ji)returnERROR;//第i个元素不存在e=p-data;//取得第i个元素returnOK;}//GetElem_LBooleanListEmpty(LinkListL){//初始条件:线性表L已存在。//操作结果:若L为空表,则返回TRUE,否则返回FALSE。If(L-next=L)returnFALSE;ElsereturnTRUE;}8、设计一个有序顺序表,要求:有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。#defineMaxSize100typedefstruct{ElemTypeelem[MaxSize];intlength;}SqList;voidInitList(SqList*&L){L=(SqList*)malloc(sizeof(SqList));L-length=0;}intListLength(SqList*L){return(L-length);}intListInsert(SqList