diff --git a/2 线性表/2 线性表.md b/2 线性表/2 线性表.md index 1677f9f..fa8bf79 100644 --- a/2 线性表/2 线性表.md +++ b/2 线性表/2 线性表.md @@ -111,9 +111,52 @@ char CompareAB(SqList A, SqList B) { ### 2.13 试写一算法在带头结点的单链表结构上实现线性表操作 `LOCATE(L, X)`。 +```cpp +int Locate(LinkList L, int x) { + p = L -> next; + int i = 1; + while (p && p -> data != x) { + p = p -> next; + } + return i; +} +``` + ### 2.14 试写一算法在带头结点的单链表结构上实现线性表操作 `LENGTH(L)`。 -### 2.15 已知指针 `ha` 和 `hb` 分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。 +```cpp +int Length(LinkList L) { + p = L -> next; + int length = 0; + while (p) { + p = p -> next; + length++; + } + return length; +} +``` + +### 2.15 已知指针 `ha` 和 `hb` 分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。 + +```cpp +void MergeList(LinkList &a, LinkList &b, LinkList &c) { + if (m < n) { + length = m; + hc = ha; + p = ha -> next; + q = hb -> next; + } else { + length = n; + hc = hb + p = hb -> next; + q = ha -> next; + } + while (length--) { + p = p -> next; + } + p = q; +} +``` ### 2.16 已知指针 `la` 和 `lb` 分别指向两个无头结点单链表中的首元结点。下列算法是从表 `la` 中删除自第 `i` 个元素起共 `len` 个元素后,将它们插入到表 `lb` 中第 `j` 个元素之前。试问此算法是否正确?·若有错,则请改正之。 @@ -146,6 +189,10 @@ Status DeleteAndInsertSub (LinkedList la, LinkedList lb , int i, int j, int len) ### 2.17 试写一算法,在无头结点的动态单链表上实现线性表操作 `INSERT(L, i, b)`,并和在带头结点的动态单链表上实现相同操作的算法进行比较。 +```cpp +void Insert(Linklist &L) +``` + ### 2.18 同 2.17 题要求。试写一算法,实现线性表操作 `DELETE(L, i)`。 ### 2.19 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于 `mink` 且小于 `maxk` 的元素(若表中存在这样的元素) \ No newline at end of file