线性表
0/11/23 32 从图中可见,每个结点的存储地址存放在直接前驱的指针域中。 所以要访问链表中数据元素 C, 必须由头指针 head得到第一个结点(数据 A) 的地址,由该结点的指针域得到第二个结点(数据 B)的地址,再由其指针域得到存储数据 C的结点地址,访问该结点的数据域就可以处理数据 C了。 链表这种顺着指针链依次访问数据元素的特点,表明链表是一种 顺序存储结构 ,只能顺序操作链表中元素
最前端,本身不带数据, 仅标志表头。 设置表头结点的目的是 统一空表与非空表的操作 简化链表操作的实现 非空表 an a1 L 空表 头指针 头结点 L a1 a2 a3 a4 L 活动指针 单链表的基本操作 p=Lnext。 //p指向第一个结点 p=pnext。 //p指向下一个结点 直到 p== 结束 P p=Lnext。 //p指向第一个结点
e. 3 25 操作 : ①在表左端插入结点 INSERT(x,FIRST(R),R)。 → LINSERT(x,R) Void LINSERT( elementtype x , LIST amp。 R ) { celltype *p。 p = new celltype。 p→element = x。 if ( R == NULL ) { p→next = p。 R = p。 } else {
数据不同时才并入链表。 其核心语句段如下。 pa=L1next。 pb=L2next。 ∥ pa、 pb是两链表的工作指针。 pc=L1。 ∥ L1作结果链表的头指针。 while(paamp。 amp。 pb) if(padatapbdata) {u=pa。 pa=panext。 free(u)。 }∥删除 L1表多余元素 else if (padatapbdata) pb=pbnext。 ∥
如下面的图所示。 假设指针 p指向单链表中的第 i个结点,指针 s指向已生成的新结点,链入新结点的操作如下: 将新结点 *s的链域指向结点 *p的后继结点 (即 snext=pnext); 将结点 *p的链域指向新结点 (即 pnext=s)。 head a1 a 2 a i a n ∧ a i +1 S x P insert(head) /*在第 i个结点 后 插入结点 S {