数据结构课件002剖析.ppt

数据结构课件002剖析

因此,在单链表中第 i 个结点之前进行插入的基本操作为: 找到线性表中第i-1个结点,然后修改其指向后继的指针。 可见,在链表中插入结点只需要修改指针。但同时,若要在第 i 个结点之前插入元素,修改的是第 i-1 个结点的指针。 Status ListInsert_L(LinkList L, int i, ElemType e) { // L 为带头结点的单链表的头指针,本算法 // 在链表中第i 个结点之前插入新的元素 e } // LinstInsert_L 算法的时间复杂度为: O(ListLength(L)) …… p = L; j = 0; while (p j i-1) { p = p-next; ++j; } // 寻找第 i-1 个结点 if (!p || j i-1) return ERROR; // i 大于表长或者小于1 s = (LinkList) malloc ( sizeof (LNode)); // 生成新结点 s-data = e; s-next = p-next; p-next = s; // 插入 return OK; e ai-1 ai ai-1 s p 线性表的操作ListDelete (L, i, e)在链表中的实现: 有序对ai-1, ai 和 ai, ai+1 改变为 ai-1, ai+1 ai-1 ai ai+1 ai-1 例如: (2,3,3,5,6,6,6,8,12) 对集合 B 而言, 值相同的数据元素必定相邻; 对集合 A 而言, 数据元素依值从小至大的顺序插入。 因此,数据结构改变了, 解决问题的策略也相应要改变。 void purge(List La, List Lb) { InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度 for (i = 1; i = Lb_len; i++) { } } // purge GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给 e if (ListEmpty(La) || !equal (en, e)) { ListInsert(La, ++La_len, e); en = e; } // La中不存在和 e 相同的数据元素,则插入之 最简单的一种顺序映象方法是: 令 y 的存储位置和 x 的存储位置相邻。 顺序映象 —— 以 x 的存储位置和 y 的存储位置之间某种关系表示逻辑关系x,y。 用一组地址连续的存储单元 依次存放线性表中的数据元素 a1 a2 … ai-1 ai … an 线性表的起始地址 称作线性表的基地址 以“存储位置相邻”表示有序对ai-1,ai 即:LOC(ai) = LOC(ai-1) + C 一个数据元素所占存储量↑ 所有数据元素的存储位置均取决于 第一个数据元素的存储位置 LOC(ai) = LOC(a1) + (i-1)×C ↑基地址 顺序映像的 C 语言描述 typedef struct { } SqList; // 俗称 顺序表 #define LIST_INIT_SIZE 80 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10 // 线性表存储空间的分配增量 ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量 // (以sizeof(ElemType)为单位) 线性表的基本操作在顺序表中的实现 InitList(L) // 结构初始化 LocateElem(L, e, compare()) // 查找 ListInsert(L, i, e) // 插入元素 ListDelet

文档评论(0)

1亿VIP精品文档

相关文档