资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
第二章 线性表 一、选择题 1.一个线性表第一个元素的存储地址是 100,每个元素的长度为 2,则第 5 个元素的地址是( ) (A)110 (B)108(C)100 (D)1202. 向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。 (A)64(B)63 (C)63.5 (D)73.线性表采用链式存储结构时,其地址( ) 。 (A) 必须是连续的 (B) 部分地址必须是连续的 (C) 一定是不连续的 (D) 连续与否均可以 4. 在一个单链表中,若 p 所指结点不是最后结点,在 p 之后插入 s 所指结点,则执行( ) (A)s-next=p;p-next=s; (B ) s-next=p-next;p-next=s;(C)s-next=p-next;p=s; (D )p-next=s;s-next=p;5.在一个单链表中,若删除 p 所指结点的后续结点,则执行( ) (A)p-next=p-next-next; (B)p=p-next; p-next=p-next-next;(C)p-next=p-next; (D) p =p-next-next;6.下列有关线性表的叙述中,正确的是( ) (A)线性表中的元素之间隔是线性关系 (B)线性表中至少有一个元素 (C)线性表中任何一个元素有且仅有一个直接前趋 (D)线性表中任何一个元素有且仅有一个直接后继 7.线性表是具有 n 个( )的有限序列(n0)(A)表元素 (B)字符 (C)数据元素 (D)数据项 二、判断题 1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。 ( ) 2.如果没有提供指针类型的语言,就无法构造链式结构。 ( ) 3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。 ( ) 4.语句 p=p-next 完成了指针赋值并使 p 指针得到了 p 指针所指后继结点的数据域值。 ( ) 5.要想删除 p 指针的后继结点,我们应该执行 q=p-next ; p-next=q-next; free(q)。 ( ) 三、填空题 1.已知 P 为单链表中的非首尾结点,在 P 结点后插入 S 结点的语句为:_ 。2.顺序表中逻辑上相邻的元素物理位置( )相邻, 单链表中逻辑上相邻的元素物理位置_相邻。 3.线性表 L(a1 ,a2 ,., an)采用顺序存储,假定在不同的 n1 个位置上插入的概率相同,则插入一个新元素平均需要移动的元素个数是_ 4.在非空双向循环链表中,在结点 q 的前面插入结点 p 的过程如下: p-prior=q-prior;q-prior-next=p;p-next=q;_; 5.已知 L 是无表头结点的单链表,是从下列提供的答案中选择合适的语句序列,分别实现:(1)表头插入 s 结点的语句序列是_(2) 表尾插入 s 结点的语句序列是 _1. p-next=s; 2. p=L; 3. L=s; 4. p-next=s-next; 5. s-next=p-next; 6. s-next=L; 7. s-next=null; 8. while(p-next!= Q)? p=p-next; 9. while(p-next!=null) p=p-next; 四、算法设计题 1.试编写一个求已知单链表的数据域的平均值的函数(数据域数据类型为整型) 。 2.已知带有头结点的循环链表中头指针为 head,试写出删除并释放数据域值为 x 的所有结点的 c 函数。 3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现出库(销售)m 台价格为 h 的电视机,试编写算法修改原链表。 4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现新到 m 台价格为 h 的电视机,试编写算法修改原链表。5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写 C 函数删除线性表中值介于 a 与 b(ab)之间的元素。 6.设 A=(a0,a1,a2,.,an-1),B=(b0,b1,b2,.,bm-1)是两个给定的线性表 ,它们的结点个数分别是n 和 m,且结点值均是整数。 若 n=m,且 ai= bi (0iB。 试编写一个比较 A 和 B 的 C 函数,该函数返回 -1 或 0 或 1,分别表示 AB。 7.试编写算法,删除双向循环链表中第 k 个结点。 8.线性表由前后两部分性质不同的元素组成(a0,a1,.,an-1,b0,b1,.,bm-1),m 和 n 为两部分元素的个数,若线性表分别采用数组和链表两种方式存储,编写算法将两部分元素换位成(b0,b1,.,bm-1,a0,a1,.,an-1),分析两种存储方式下算法的时间和空间复杂度。 9.用循环链表作线性表(a0,a1,.,an-1) 和(b0,b1,.,bm-1)的存储结构,头指针分别为 ah 和bh,设计 C 函数,把两个线性表合并成形如( a0,b0,a1,b1,)的线性表,要求不开辟新的动态空间,利用原来循环链表的结点完成合并操作,结构仍为循环链表,头指针为 head,并分析算法的时间复杂度。 10.试写出将一个线性表分解为两个带有头结点的循环链表,并将两个循环链表的长度放在各自的头结点的数据域中的 C 函数。其中,线性表中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表中。 11.试写出把线性链表改为循环链表的 C 函数。 12.己知非空线性链表中 x 结点的直接前驱结点为 y,试写出删除 x 结点的 C 函数。 参考答案: 一、选择题1. B 2.C 3. D 4. B 5. A 6.A 7、C二、判断题:参考答案:1、2、3、4、5、三、填空题1、s-next=p-next; p-next=s; 2、一定;不一定 3、n/2 4、q-prior=p; 5、(1)6) 3)(2) 2) 9) 1) 7)四、算法设计题1、#include stdio.h#include malloc.htypedef struct nodeint data; struct node *link;NODE;int aver(NODE *head)int i=0,sum=0,ave; NODE *p; p=head;while(p!=NULL)p=p-link;+i;sum=sum+p-data;ave=sum/i;return (ave);2、#include stdio.h#include malloc.htypedef struct nodeint data; /* 假设数据域为整型 */struct node *link;NODE;void del_link(NODE *head,int x) /* 删除数据域为 x 的结点*/NODE *p,*q,*s;p=head;q=head-link;while(q!=head)if(q-data=x)p-link=q-link;s=q;q=q-link;free(s); elsep=q;q=q-link;3、void del(NODE *head,float price,int num)NODE *p,*q,*s;p=head;q=head-next;while(q-pricenext;if(q-price=price)q-num=q-num-num;else printf(无此产品);if(q-num=0)p-next=q-next;free(q);4、#include stdio.h#include malloc.htypedef struct nodefloat price;int num;struct node *next;NODE;void ins(NODE *head,float price,int num)NODE *p,*q,*s;p=head;q=head-next;while(q-pricenext;if(q-price=price)q-num=q-num+num;elses=(NODE *)malloc(sizeof(NODE);s-price=price;s-num=num;s-next=p-next;p-next=s;5、顺序表: 算法思想:从 0 开始扫描线性表,用 k 记录下元素值在 a 与 b 之间的元素个数,对于不满足该条件的元素,前移 k 个位置,最后修改线性表的长度。 void del(elemtype list,int *n,elemtype a ,elemtype b) int i=0,k=0; while(i=aelselisti-k=listi;i+;*n=*n-k; /* 修改线性表的长度*/ 循环链表:void del(NODE *head,elemtype a,elemtype b)NODE *p,*q;p= head;q=p-link; /* 假设循环链表带有头结点 */while(q!=head & q-datalink;while(q!=head & q-datalink;free(r); if(p!=q)p-link=q;6、#define MAXSIZE 100int listAMAXSIZE,listBMAXSIZE;int n,m;int compare(int a,int b)int i=0;while(ai=bi&imif(ibi) return(1);7、void del(DUNODE*head,int i)DUNODE *p;if(i=0)*head=*head-next;*head-prior=NULL;return(0); Elsefor(j=0;jnext;if(p=NULL|ji) return(1);p-prior-next=p-next;p-next-prior=p-proir;free(p);return(0);8.顺序存储:void convert(elemtype list,int l,int h) /* 将数组中第 l 个到第 h 个元素逆置*/int i;elemtype temp;for(i=h;ilink; /*q 指向 an-1 结点 */r=q-link;q-link=NULL; while(r-link!=NULL)r=r-link; /*r 指向最后一个 bm-1 结点 */*head=q;r-link=p; 该算法的时间复杂度为 O(n+m),但比顺序存储节省时间( 不需要移动元素,只需改变指针),空间复杂度为 O(1)9.typedef struct nodeelemtype data;struct node *link;NODE;NODE *union(NODE*ah,NODE *bh)NODE *a,*b,*head,*r,*q;head=ah;a=ah;b=bh;while(a-link!=ah&b-link
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号