diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index d2c3cbe..f432a28 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "2.线性表/ex.md", + "file": "3.栈、队列、数组/ex.md", "mode": "source", "backlinks": true, "source": false @@ -86,7 +86,7 @@ "state": { "type": "backlink", "state": { - "file": "2.线性表/ex.md", + "file": "3.栈、队列、数组/ex.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -103,7 +103,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "2.线性表/ex.md", + "file": "3.栈、队列、数组/ex.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -126,7 +126,7 @@ "state": { "type": "outline", "state": { - "file": "2.线性表/ex.md" + "file": "3.栈、队列、数组/ex.md" } } }, @@ -161,8 +161,9 @@ }, "active": "90587f11c8ede650", "lastOpenFiles": [ - "未命名.canvas", "2.线性表/ex.md", + "3.栈、队列、数组/ex.md", + "未命名.canvas", "2.线性表/线性表.md", "1.绪论/ex.md", "树/树.md", diff --git a/2.线性表/ex.md b/2.线性表/ex.md index 7ebd293..f138291 100644 --- a/2.线性表/ex.md +++ b/2.线性表/ex.md @@ -1,10 +1,10 @@ -ls2.1.3 P12 +### 2.1.3 P12 1. 数据元素 2. B 3. 只有一个前驱元素 -2.2.3 P16 +### 2.2.3 P16 选择 1. A 密度大 @@ -266,7 +266,7 @@ void Converse(int R[], int n ,int p ) ``` -2.3.7 +### 2.3.7 P35 1. B 2. B @@ -277,4 +277,364 @@ void Converse(int R[], int n ,int p ) 7. B x D 8. A x C 9. C -10. +10. B +11. B A +12. C +13. B x D +14. A +15. D x B +16. D +17. D +18. A +19. C +20. B x C +21. D x C +22. D x B +23. D +24. D +25. D +26. B x D + +二.应用 +1. 递归,删除不带头节点L中x +```c +Del_x(Linklist &L,ElemType x) +{ + LNode *p; + if (L == NULL) + return ; + if (L->data == x ) + { + p=L; + L = L->next; + free(p); + Del_x(L.x); + } + else + Del_x(L->next,x); +} +``` +O(n) O(n) + + +2. 带头节点L,删除X,释放空间 +```c +void Del_x(Linklist &L, ElemType x) +{ + LNode *p = L->next, *pre=L ,*q; + while( p != NULL ) + { + if ( p->data == x) + { + q = p; + p = p->next; + pre->next = p; + free(q); + } + else + { + pre = p; + p = p->next; + } + } +} +``` + +3. L带头节点,请反向输出 +```c +void Print_next_node(Linklist L) +{ + if ( L->next != NULL) + Print_next_node(L->next); + if(L != NULL ) print(L->data); +} + +void Print_ignore_head(Linklist L) +{ + if ( L->next != NULL) + Print)next_node(L->next); +} +/// +void posh_stack(LinkList L) +{ + stack *p_stack; + LNode *p = L->next, *pre=L; + while( p != NULL ) + { + posh(P_stack,p); + p = p->next + } + + which(s != null ) + pop(p_stack,s) + print(s) +} + +``` + +4. L 删除最小 +```c +void del_min(Linklist &L) +{ + LNode *p = L->next, *pre = L; + Lnode *min = L->next, *min_pre = L; + + while( p != NULl) + { + if( p->data < min->data) + { + min = p; + min_pre = pre; + } + pre = p; + p = p->next; + } + + //del + min_pre->next = min->next; + free(min); + return L; +} +``` +时间O(n) 空间O(1) + + +5. 头节点 逆置 辅助空间O(1) +```c +//头插法 +void Rev_Link(Linklist &L) +{ + LNode *p, *q; + p = L->next; + L->next = NULL; + while( p != NNULL) + { + q = p->next; + p->next = L->next; + L->next = p + p = q; + } + return L; +} + +// +Linklinst Reverse_2(Linklist L) +{ + // 3个点,遍历反转。 + +} + +``` + +6. 头节点,递增 ??? +```c +void Sort_list(Linklist &L) +{ + LNode *p=L->next,*pre; + LNode *r=p->next; + + p->next=NULL; //当个先 + + p = r; + + while(p != NULL ) + { + r = p->next; + pre = L ; + while ( pre->next != NULL && pre->next->data < p->data) + pre = pre->next; + p->next = pre->next; + pre->next = p ; + p = r ; + + } +} +``` +7. 无序 删除范围 +```c +void Del_x_y(Linklist &L,int min, int max) +{ + LNode *p=L->next,*pre = L,q; + + while(p != NULL) + { + if( p->data > min && p->data < max ) + { + pre->next = p->next; + free(p); + p = p->next; + } + else + { + pre = p; + p = p->next; + } + } + +} + +``` + +8. 找出2个链表的公共节点 +成Y型,AB长度,然后A—B,开始同步。 +```c +Linklist Search_common(Linklist A,Linklist B) +{ + int len_A=Length(A),len_B=Length(B1); + int dist; + + Linklist Longlist,Sortlist; + + if(len_A > len_B) + { + longlist=A->next; + sortlist=B->next; + dist=len_A-len_B; + } + else + { + longlist=B->next; + sortlist=A->next; + dist=len_B-len_A; + } + + while(dist--) + longlist=longlist->next; + while(longlist != NULL) + { + if(longlist == shortlist) + return longlist; + else + { + longlist = longlist->next; + sortlist = sortlist->next; + } + } + return NULL; +} +``` + +9. L min最小 +```c +void free_min_to_max(Linklist &head) +{ + LNode *p,*pre,*u; + + if( head->next != NULL){ + pre=head; + p=pre->next; + while(p->next!=NULL) + { if(p->next->data < pre->next->data) + pre=p + p=p->next; + } + print(pre->next->data) + u=pre->next; + pre->next=u->next; + free(u); + } + free(head); +} +``` +10. A-> A(奇数)和B(偶数) +```c +Linklist DisCreat(Linklist A) +{ + int i=0; + Linklist B = (Linklist)maclloc(sizeof(LNode)); + B->next=NULL; + LNode *ra=A,*rb=B;*p; + + p=A->next; + A->next=NULL; + while(p!=NULL) + { + i++; + if(i%2 == 0) + { + rb->next=p; + rb=p; + } + else + { + ra->next=p; + ra=p; + } + p=p->next; + } + ra->next=NULL; + rb->next=NULL; + return B; +} +``` + +11. {a1,b1,a2,b2,a3,b3....} -> {a1,a2,a3,...}、{bn,bn-1,bn-2,...,b2,b1} +一个头插法一个尾插法 + + +12. 递增有序,删除重复。 +释放后面一个相同的,或者尾插法。 + +13. 2个递增线性表,何为一个,需要递减。 +头插法。比较,时间O(mn) + +14. AB,递增。-> C 公共元素。 + +15. 与14一样 + +16. B 是否是 A 的子 + +17. 双循环是否对称 +p<->q + +18. 合并循环指针. +找尾,交叉合并就行 + +19. 找最小删除。 + +20. + +21. 环,判断 +快指针与慢指针。 + +22. 查找倒数第k个, +2个指针,相隔k个,同时运行。 +```c +typedef int ElemType; +typedef struct LNode{ + ElemType data; + struct LNode *link; +}LNode, *Linklist; + +int search_k(Linklist list, int k) +{ + LNode *p=list->link,*q=list->list; + int count=0; + while(p!=NULL) + { + if(countlink; + p=p->link; + } + + if(countdata); + return 1; + } +} +``` + +23. 共同后缀起始位置。 +先求长度。尾对齐,再同步指针对比。 +O(n) O(1) + +24. + +25. + + diff --git a/3.栈、队列、数组/ex.md b/3.栈、队列、数组/ex.md new file mode 100644 index 0000000..8fab2f0 --- /dev/null +++ b/3.栈、队列、数组/ex.md @@ -0,0 +1,20 @@ +### 3.1.4 P64 +1. A +2. A +3. B +4. C +5. A +6. A +7. D +8. D +9. D +10. A +11. C +12. D +13. D +14. D +15. D +16. C +17. + +