第3章线性表-4.pptVIP

  • 1
  • 0
  • 约5.82千字
  • 约 68页
  • 2018-02-06 发布于河南
  • 举报
第3章线性表-4

一个链表保存一组从小到大排列的数据元素。它的逻辑结构如下图所示: 一个链表保存一组从小到大排列的数据元素。它的逻辑结构如下图所示: 3.3.5 循环链表 循环链表是另一种链式存储结构。它的最后一个结点的指针不是为空,而是指向链表的第一个结点。 同非循环单链表一样,为了处理方便,通常在第一个结点之前附加一个结点,称为循环链表的头结点。 判别带头结点的循环链表为空的语句: h-next==h; 循环链表结点结构的C语言描述: Struct Cnode { int data; struct Cnode *next; }ClinkList; 3.3.6 循环链表的运算 我们仅介绍两个运算: 1.查找给定数据元素值的结点; 2.链接给定的两个循环链表。 1.查找给定数据元素值的结点 算法3-18 VisitElem_L(ClinkList *L;datatype e) { ClinkList *p; p=L-next; while((p-next!=L)(p-data!=e)) p=p-next; if((p-next==L)(p-data!=e)) return ERROR; return (p);} 2.链接给定的两个带头结点的循环链表 双向链表的结构用C语言描述: Typedef struct DnLNode { datatype data; struct DnLNode *prior,next; }DuLinkList; 3.4.1约瑟夫问题 设有n个人围坐在圆桌周围,从第s个人开始报数,当数到m的人出列,然后再从下一个人开始,当数到m的人出列,如此重复,直到所有人都出列为止。要求按出列的顺序输出每一个人的信息。 分析: 按一个人的信息用一个结点存储,n个人建立一个循环单链表。 算法3-22 约瑟夫问题 void Joeseph(int n, int s) { int i,j; LinkList *h,*p,*q,*r; LinkList *creatlinklist(int n) if(ns) return ERROR; h=creatlinklist(n); q=h;i=1; while(1) { while((q!=NULL)(is)) { p=q; q=q-next; i=i++;} if(q==NULL) break; p=q-next;printf(q-data); free(q); q=p; } } 2.插入 (1)在双向链表中指定结点前,插入一个结点。 假设结点s已准备好,p为指定的结点。如图3.23所示。 图3.23 在双向链表中插入结点 p a x b s 操作: .s指出结点的后继指针,指向p; .s指出结点的前驱指针,指向p指出结点的前驱结点; .p指出结点的前驱结点的后继指针,指向s; .p指出结点的前驱指针,指向s。 操作语句组如下: { s-next=p; s-prior=p-prior; p-prior-next=s; p-prior=s; } 图3.23 在双向链表中插入结点 p a x b s ④ ② ③ ① s-next=p; 黄线上面或下面的 s-prior=p-prior; 两个语句可以交换 p-prior-next=s; 黄线上下的两组 p-prior=s; 语句不可交换。 ① ② ④ ③ (2) 在双向链表中指定结点后前,插入一个结点。 假设结点s已准备好,p为指定的结点。如图所示: p a x b s 操作: .p指出结点的后继指针,指出P指出结点的后继结点; .s指出结点的前驱指针,指向p指出结点; .p指出结点的后继指针指出的结点的前驱指针,指向s; .p指出结点的前驱指针,指向s。 操作语句组如下: { s-next=p-next; s-prior=p; p-next-prior=s; p-prior=s; } p a x b s ④ ② ③ ① s-next=p-next; 黄线上面或下面的两 s-prior=p; 个语句可以交换。 p-next-prior=s; 黄线上下的两组语句 p-next=s;

文档评论(0)

1亿VIP精品文档

相关文档