1、第二次作业1. 试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?2 .描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点) 。在单链表中设置头结点的作用是什么?3. 已知 P 结点是双向链表的中间结点,试从下列提供的答案中选择合适的语句序列。a在 P 结点后插入 S 结点的语句序列是- 。b在 P 结点前插入 S 结点的语句序列是-。c删除 P 结点的直接后继结点的语句序列是-。d删除 P 结点的直接前驱结点的语句序列是-。e删除 P 结点的语句序列是-。(1)P-next=P-next-next; (10) P-prior-next=P;(2)P-pri
2、or=P-prior-prior; (11) P-next-prior =P;(3) P-next=S; (12)P-next-prior=S;(4) P-prior=S; (13) P-prior-next=S;(5)S-next=P; (14) P-next-prior=P-prior(6)S-prior=P; (15)Q=P-next;(7) S-next= P-next; (16)Q= P-prior; (8) S-prior= P-prior; (17)free(P);(9) P-prior-next=p-next; (18)free(Q);4. 编写程序,将若干整数从键盘输入,以单
3、链表形式存储起来,然后计算单链表中结点的个数(其中指针 P 指向该链表的第一个结点) 。5 假设有一个带表头结点的链表,表头指针为 head,每个结点含三个域: data, next 和prior。其中 data 为整型数域, next 和 prior 均为指针域。现在所有结点已经由 next 域连接起来,试编一个算法,利用 prior 域(此域初值为 NULL)把所有结点按照其值从小到大的顺序链接起来。6. 已知线性表的元素按递增顺序排列,并以带头结点的单链表作存储结构。试编写一个删除表中所有值大于 min 且小于 max 的元素(若表中存在这样的元素)的算法。1. 【严题集 2.3】试比较
4、顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?答: 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一) ;要求内存中可用存储单元的地址必须是连续的。优点:存储密度大(1?) ,存储空间利用率高。缺点:插入或删除元素时不方便。链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(next=P-next-next; (10) P-prior-next=P;(2)P-prior=P-prior-prior; (11) P-next-prior =P;(3) P
5、-next=S; (12)P-next-prior=S;(4) P-prior=S; (13) P-prior-next=S;(5)S-next=P; (14) P-next-prior=P-prior(6)S-prior=P; (15)Q=P-next;(7) S-next= P-next; (16)Q= P-prior; (8) S-prior= P-prior; (17)free(P);(9) P-prior-next=p-next; (18)free(Q);解答:a.(12) (7) ( 3) (6) 3 必须在 12 和 7 的后面,其余的顺序可变b.(13) (8) (4) (5)
6、 同上c.(15) (1) ( 11) (18) 不可变d.(16) (2) (10) (18) 不可变e.(9) (14) ( 17)4. 编写程序,将若干整数从键盘输入,以单链表形式存储起来,然后计算单链表中结点的个数(其中指针 P 指向该链表的第一个结点) 。 注:统计结点个数是【省统考样题】的要求,也是教材 P60 4-6 计算链表长度的要求,编程又简单,很容易作为考题。解:编写 C 程序如下(已上机通过):全局变量及函数提前说明:-#include#includetypedef struct liuyuint data;struct liuyu*link;test;liuyu *p,
7、*q,*r,*head;int m=sizeof(test);void main () /*第一步,从键盘输入整数,不断添加到链表*/int i;head=(test*)malloc(m); /*m=sizeof(test);*/p=head; i=0;while (i!=-9999) printf(“/ninput an integer stop by -9999:“);scanf(“%d“,p-data=i; /* input data is saved */p-link=(test*)malloc(m); /*m=sizeof(test);*/q=p;p=p-link;q-link=NU
8、LL; /*原先用 p-link=NULL 似乎太晚!*/p=head; i=0; /*统计链表结点的个数并打印出来 */while (p-link!=NULL)printf(“%d“,p-data);p=p-link;i+;printf(“n node number=%dn“, i-1); /*结点的个数不包括-9999*/5. 定义类型 LinkList 如下:typedef struct node int data;struct node *next,*prior;LinkList;此题可采用插入排序的方法,设 p 指向待插入的结点,用 q 搜索已由 prior 域链接的有序表找到合适位
9、置将 p 结点链入。算法描述如下:insert (LinkList *head) LinkList *p,*s,*q;p=head-next; /p 指向待插入的结点,初始时指向第一个结点while(p!=NULL) s=head; / s 指向 q 结点的前趋结点q=head-prior; /q 指向由 prior 域构成的链表中待比较的结点while(q!=NULL) q=q-prior;s-prior=p;p-prior=q; /结点 p 插入到结点 s 和结点 q 之间p=p-next;6. 算法描述如下:delete(LinkList *head, int max, int min) linklist *p, *q;if (head!=NULL) q=head;p=head-next;while(p!=NULL) while(p!=NULL) q-next=p;