第二章线性表业-答案.pptVIP

  • 0
  • 0
  • 约4.14千字
  • 约 18页
  • 2019-10-26 发布于浙江
  • 举报
第二章 线性表 作业评讲 2.1 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。 2.2 何时选用顺序表、何时选用链表作为线性表的存储结构为宜? 2.3 在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素? 2.4 为什么在单循环链表中设置尾指针比设置头指针更好? 2.5 在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.6 设有一个双链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。每当在链表进行一次LocateNode(L,s)运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。试写一符合上述要求的LocateNode运算的算法。 2.7 写一算法在单链表上实现线性表的ListLength(L)运算。 2.8 已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母字符、数字字符和其它字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。 2.9 假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向链表中某个结点的指针,试编写算法删除结点*s的直接前趋结点。 2.10设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L仍是一个有序表。 2.11 写出以下链表操作的算法 1)创建一个空的双向循环链表 status CreateList_Dul(DuLinkList L); 2)取得双向循环链表中第i个数据元素的位置指针 status GetElemP_Dul(DuLinkList L, int i); 3)将单链表置逆 status ReverseList_L(LinkList L); 2.1 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。 开始结点是指链表中的第一个结点,没有直接前趋的那个结点。 链表的头指针是一指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。 头结点在链表的开始结点之前附加的一个结点。有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。 2.11 写出以下链表操作的算法 1)创建一个空的双向循环链表 status CreateList_Dul(DuLinkList L) { L=(dulnode *)malloc(sizeof(dulnode)); if(!L) exit(OVERFLOW); L-next=L; L-prior=L; return(OK); //见图2.14(b) P36 } 2.11 写出以下链表操作的算法 2)取得双向循环链表中第i个数据元素的位置指针 status GetElemP_Dul(DuLinkList L, int i) {elemtype *p; int a=1; if (i0) return ERROR; else {p=L; p=p-next; while(ai||p!=NULL) {p=p-next; a++;} } If (a==i)return(p); else return(ERROR); } 2.11 写出以下链表操作的算法 3)将单链表置逆 status ReverseList_L(LinkList L) {Lnode *p1,*p2,*p3; If(L-next==NULL) return OK; else { p1=L; p1-next=NULL; P2=L-next; P3=p2-next; While( p2!=NULL) {p2-next=p1; p1=p2;p2=p3; if(p2!=NULL) p3=p3-next;} L=p1; return OK; } } * 作业: 2.5、 2.7、2.9、2.11做在作业本上,交,其余堂下练习 2.2 何时选用顺序表、何时选用链表作为线性表的存储结构为宜? 1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。 2

文档评论(0)

1亿VIP精品文档

相关文档