【SQL开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了SQL开源代码-数据结构源代码(清华大学+严蔚敏) - 大学课件的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
void UnionList ampLa List Lb // 算法 2.1 if i lt 1 i gt L.length1 return ERROR // i 值不合法 // 将所有在线性表 Lb 中但不在 La 中的数据元素插入到 La 中 if L.length gt L.listsize // 当前存储空间已满,增加容量 int La_lenLb_leni ElemType newbase ElemType reallocL.elem ElemType e L.listsizeLISTINCREMENTsizeof ElemType La_len ListLengthLa // 求线性表的长度 if newbase return ERROR // 存储分配失败 Lb_len ListLengthLb L.elem newbase // 新基址 for i1 iltLb_len i L.listsize LISTINCREMENT // 增加存储容量 GetElemLb i e // 取 Lb 中第 i 个数据元素赋给 e if LocateElemLa e equal // La 中不存在和 e 相同的数据元素 ElemType q ampL.elemi-1 // q 为插入位置 ListInsertLa La_len e // 插入 for p ampL.elemL.length-1 pgtq --p p1 p // 插入位置及之后的元素右移 // union q e // 插入 evoid MergeListList La List Lb List ampLc // 算法 2.2 L.length // 表长增 1 // 已知线性表 La 和 Lb 中的元素按值非递减排列。
return OK // 归并 La 和 Lb 得到新的线性表 Lc,Lc 的元素也按值非递减排列。
// ListInsert_Sq int La_len Lb_len Status ListDelete_SqSqList ampL int i ElemType ampe // 算法 2.5 ElemType ai bj // 在顺序线性表 L 中删除第 i 个元素,并用 e 返回其值。
int i1 j1 k0 // i 的合法值为 1≤i≤ListLength_
SqL。
InitListLc ElemType p q La_len ListLengthLa if ilt1 igtL.length return ERROR // i 值不合法 Lb_len ListLengthLb p ampL.elemi-1 // p 为被删除元素的位置 while i lt La_len ampamp j lt Lb_len // La 和 Lb 均非空 e p // 被删除元素的值赋给 e GetElemLa i ai q L.elemL.length-1 // 表尾元素的位置 GetElemLb j bj for p pltq p p-1 p // 被删除元素之后的元素左移 if ai lt bj --L.length // 表长减 1 ListInsertLc k ai return OK i // ListDelete_Sq else int LocateElem_SqSqList L ElemType e ListInsertLc k bj Status compareElemType ElemType // 算法 2.6 j // 在顺序线性表 L 中查找第 1 个值与 e 满足 compare的元素的位序。
// 若找到,则返回其在 L 中的位序,否则返回 0。
int i while i lt La_len ElemType p GetElemLa i ai ListInsertLc k ai i 1 // i 的初值为第 1 个元素的位序 p L.elem // p 的初值为第 1 个元素的存储位置 while j lt Lb_len while i lt L.length ampamp comparep e GetElemLb j bj ListInsertLc k bj i if i lt L.length return i // MergeList else return 0Status InitList_SqSqList ampL // 算法 2.3 // LocateElem_Sq // 构造一个空的线性表 L。
void MergeList_SqSqList La SqList Lb SqList ampLc // 算法 2.7 L.elem ElemType mallocLIST_INIT_SIZEsizeofElemType // 已知顺序线性表 La 和 Lb 的元素按值非递减排列。
if L.elem return OK // 存储分配失败 Lc // 归并 La 和 Lb 得到新的顺序线性表 Lc, 的元素也按值非递减排列。
L.length 0 // 空表长度为 0 ElemType papbpcpa_lastpb_last L.listsize LIST_INIT_SIZE // 初始存储容量 pa La.elem pb Lb.elem return OK Lc.listsize Lc.length La.lengthLb.length // InitList_Sq pc Lc.elem ElemType mallocLc.listsizesizeofElemTypeStatus ListInsert_SqSqList ampL int i ElemType e // 算法 2.4 if Lc.elem // 在顺序线性表 L 的第 i 个元素之前插入新的元素 e, exitOVERFLOW // 存储分配失败 // i 的合法值为 1≤i≤ListLength_
SqL1 pa_last La.elemLa.length-1 ElemType p pb_last Lb.elemLb.length-1 while pa lt pa_last ampamp pb lt pb_last // 归并 // ListDelete_L if pa lt pb pc pa void CreateList_LLinkList ampL int n // 算法 2.11 else pc pb // 逆位序输入(随机产生)n 个元素的值, // 建立带表头结点的单链线性表 L while pa lt pa_last pc pa // 插入 La 的剩余元素 LinkList p while pb lt pb_last pc pb // 插入 Lb 的剩余元素 int i // MergeList L LinkListmallocsizeofLNodeStatus GetElem_LLinkList ampLint i ElemType ampe // 算法 2.8 L-gtnext NULL // 先建立一个带头结点的单链表 // L 为带头结点的单链表的头指针。
for in igt0 --i // 当第 i 个元素存在时,其值赋给 e 并返回 OK,否则返回 ERROR p LinkListmallocsizeofLNode // 生成新结点 LinkList p p-gtdata random200 // 改为一个随机生成的数字200 以 p L-gtnext 内 int j 1 // 初始化,p 指向第一个结点,j 为计数器 p-gtnext L-gtnext L-gtnext p // 插入到表头 while p ampamp jlti //顺指针向后查找,直到 p 指向第 i 个元素或 p 为空 // CreateList_L p p-gtnext j void MergeList_LLinkList ampLa LinkList ampLb LinkList ampLc // 算法 2.12 if p jgti return ERROR // 第 i 个元素不存在 // 已知单链线性表 La 和 Lb 的元素按值非递减排列。
e p-gtdata // 取第 i 个元素 Lc // 归并 La 和 Lb 得到新的单链线性表 Lc, 的元素也按值非递减排列。
return OK LinkList pa pb pc // GetElem_L pa La-gtnext pb Lb-gtnextStatus ListInsert_LLinkList ampL int i ElemType e // 算法 2.9 Lc pc La // 用 La 的头结点作为 Lc 的头结点 // 在带头结点的单链线性表 L 的第 i 个元素之前插入元素 e while pa ampamp pb LinkList ps if pa-gtdata lt pb-gtdata p L pc-gtnext pa pc pa pa pa-gtnext int j 0 while p ampamp j lt i-1 // 寻找第 i-1 个结点 else pc-gtnext pb pc pb pb pb-gtnext p p-gtnext j pc-gtnext pa pa : pb // 插入剩余段 freeLb // 释放 Lb 的头结点 if p j gt i-1 return ERROR // i 小于 1 或者大于表长 // MergeList_L s LinkListmallocsizeofLNode // 生成新结点 int LocateElem_SLSLinkList S ElemType e // 算法 2.13 s-gtdata e s-gtnext p-gtnext // 插入 L 中 // 在静态单链线性表 L 中查找第 1 个值为 e 的元素。
p-gtnext s // 若找到,则返回它在 L 中的位序,否则返回 0。
return OK int i // LinstInsert_L i S0.cur // i 指示表中第一个结点Status ListDelete_LLinkList ampL int i ElemType ampe // 算法 2.10 while i ampamp Si.data e i Si.cur // 在表中顺链查找// 在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值 return i LinkList pq // LocateElem_SL p L void InitSpace_SLSLinkList space // 算法 2.14 int j 0 // 将一维数组 space 中各分量链成一个备用链表, while p-gtnext ampamp j lt i-1 // 寻找第 i 个结点,并令 p 指向其前趋 // space0.cur 为头指针, p p-gtnext // quot0quot表示空指针 j for int i0 iltMAXSIZE-1 i spacei.cur i1 if p-gtnext j gt i-1 return ERROR // 删除位置不合理 spaceMAXSIZE-1.cur 0 q p-gtnext // InitSpace_SL p-gtnext q-gtnext // 删除并释放结点 int Malloc_SLSLinkList ampspace // 算法 2.15 e q-gtdata // 若备用空间链表非空,则返回分配的结点下标,否则返回 0 freeq int i space0.cur return OK if space0.cur space0.cur spacespace0.cur.cur return i printfquotnquot // Malloc_SL // differencevoid Free_SLSLinkList ampspace int k // 算法 2.16 DuLinkList GetElemP_DuLDuLinkList va int i // 将下标为 k 的空闲结点回收到备用链表 // L 为带头结点的单链表的头指针。
spacek.cur space0.cur space0.cur k // 当第 i 个元素存在时,其值赋给 e 并返回 OK,否则返回 ERROR // Free_SL DuLinkList pvoid differenceSLinkList ampspace int ampS // 算法 2.17 p va-gtnext // 依次输入集合 A 和 B 的元素, int j 1 // 初始化,p 指向第一个结点,j 为计数器 //在一维数组 space 中建立表示集合A-B∪B-A while pva ampamp jlti // 的静态链表 S 为头指针。
//顺指针向后查找,直到 p 指向第 i 个元素或 p 为空 // 假设备用空间足够大,space0.cur 为头指针。
p p-gtnext int i j k m n p r j ElemType b InitSpace_SLspace // 初始化备用空间 if pva ampamp jlti return NULL // 第 i 个元素不存在 S Malloc_SLspace // 生成 S 的头结点 else return p r S // r 指向 S 的当前最后结点 // GetElem_L m random28 // 输入 A 的元素个数 n random28 // 输入 B 的元素个数 Status ListInsert_DuLDuLinkList ampL int i ElemType e //算法 2.18 printfquot A quot // 在带头结点的双链循环线性表 L 的第 i 个元素之前插入元素 e, initrandom_c1 // i 的合法值为 1≤i≤表长1。
for j1 jltm j // 建立集合 A 的链表 DuLinkList ps i Malloc_SLspace // 分配结点 if p GetElemP_DuLL i // 在 L 中确定第 i 个元素的位置指针 p //printfquotid quoti return ERROR // pNULL 即第 i 个元素不存在 spacei.data random_next_c1 // 输入 A 的元素值 if s DuLinkListmallocsizeofDuLNode printfquotc quot spacei.data // 输出 A 的元素 return ERROR spacer.cur i r i // 插入到表尾 s-gtdata e s-gtprior p-gtprior printfquotnquot p-gtprior-gtnext s spacer.cur 0 // 尾结点的指针为空 s-gtnext p initrandom_c1 p-gtprior s printfquot B quot return OK for j1 jltn j // ListInsert_DuL // 依次输入 B 的元素若不在当前表中则插入否则删除 DuLinkList GetElemP_DuLDuLinkList va int i b random_next_c1 // 输入 B 的元素值 // L 为带头结点的单链表的头指针。
printfquotc quot b // 输出 B 的元素 // 当第 i.