线性表知识小结1.pptVIP

  • 12
  • 0
  • 约7.97千字
  • 约 46页
  • 2018-05-11 发布于河南
  • 举报
线性表知识小结1

线性表知识小结 线性结构的基本特点 是由n(n=0)个结点组成的有穷序列. 第一个,最后一个,(直接)前驱 (直接)后继 一个结点代表一个数据元素,通常要求同一个线性结构中的所有结点所代表的数据元素具有相同的属性(比如:数据项个数相同;对应数据项的类型相同) 所含结点的个数称为线性表的长度(表长),表长为0的线性表称为空表. 线性表的顺序实现----顺序表 基本思想:按逻辑关系来决定排列顺序,实际就是一维数组,数组的下标可以看成是元素的相对地址。逻辑上相邻的元素的物理位置必紧邻。 存储特点: 优点:可随机存取(访问); 缺点:插入和删除操作时,需移动大量元素 需事先确定表的容量 容易产生“碎片” 长度为n的顺序表中,等概率情况下,插入一个元素的平均移动元素次数为n/2,删除一个元素的平均移动元素次数为(n-1)/2,其时间复杂度都为O(n)。 线性表的链式存储----单链表 基本思想:用一个指针表示结点间的逻辑关系。每个结点的存储单元都分为两部分:一部分存放结点的数据,另一部分存放指向结点后继结点的指针。 存储特点: 优点:对任何位置进行插入和删除操作只需修改指针;不需要预先分配空间; 缺点:顺序存取(访问)的结构(不能从当前结点出发访问到任一结点) 带头结点的单链表sq为空的条件: sq-next==NULL 不带头结点的单链表sq为空的条件: sq==NULL 在单链表中,删除某一指定结点时,需找到该结点的前驱结点。 在单链表中设置头结点的作用: 不管单链表是否为空表,头结点指针均不空,并使得对单链表的操作在各种情况下统一(第一个结点) 。 在单循环链表中通常设置尾指针(指向最后一个结点)比设置头指针好 从一个具有n 个结点的单链表中查找其值等于x的结点时,在查找成功情况下平均需比较 个结点 思考:对于一个有n个结点的单链表,在已知p所指结点后插入一个结点的时间复杂度是?在给定值为x的结点后插入一个结点的时间复杂度是? 链表的遍历 void printlist ( LinkList L ) { LinkList p = L-next ; while(p) { printf ( p-data ) ; p=p-next ; } } 求表长的操作 int getlen ( linklist L ) { int i =0; linklist p = L - next ; while ( p!=L) { i + +; p=p-next; } return i ; } 与单链表操作比较 Initlist() 初始化时,头结点的next不为NULL,而是指向自身。 求表长:while中的条件改为 p!=L; 插入、删除操作的基本语句无变化 操作基本一致,通常遇到的循环条件不是判断指针p或p-next 是否为NULL,而是判断它们是否等于头结点 例1:设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C。 其中B表的结点是A表中值小于零的点,而C表中的结点为A表中值大于零的结点。 (链表A的元素类型为整型,要求B、C表使用A表的结点,即不再开辟新的结点空间)。 void split ( linklist lb , linklist lc , linklist la) { linklist p = la-next , r , s ; lb = ( linklist ) malloc ( sizeof ( lnode ) ); lc = ( linklist ) malloc ( sizeof ( lnode ) ); r = lb; s = lc; while ( p != NULL ) { if ( p-data 0 ) //将结点链入B表中 { r-next=p ; r=r-next ; } else if ( p-data 0 ) //将结点链入C表中 { s-next=p ; s=s-next

文档评论(0)

1亿VIP精品文档

相关文档