当前位置:   article > 正文

数据结构学习日记(四)_(lnode *)malloc(sizeof(lnode));

(lnode *)malloc(sizeof(lnode));

一,双链表

单链表只包含后继节点的指针,从一个节点出发只能找到后继的各个节点

双链表又添加一个指针域,指向前驱节点,表头节点的prior指向null,表尾节点的next指向null。

(1)双链表的初始化

(2)双链表的插入

(3)双链表的删除

(4)双链表的遍历

二,循环链表

(1)循环单链表,从一个节点出发可以找到其他任何一个节点

(2)循环双链表,表头节点的prior指向表尾节点,表尾节点的next指向头结点。

三,单链表的基本操作代码示意:1-12

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. typedef struct LNode{
  4. int data;//每个节点存放一个int类型的数据元素
  5. Struct Lnode *next;//指针指向下一个节点
  6. }LNode,*LinkList;//将struct LNode重命名为LNode,并表示使用LinkList作为一个指针指向Struct lNODE.
  7. //1,初始化不带头节点 ,LNode *L等价与LinkList L,声明一个指向单链表的第一个节点的指针
  8. bool InitList1(LinkList &L){
  9. L=NULL;
  10. return true;
  11. }
  12. //2,初始化带头节点
  13. bool InitList2(LinkList &L){
  14. L=(LNode *)malloc(sizeof(LNode));
  15. L->next=NULL;
  16. return true;
  17. }
  18. //3, 带头节点的插入
  19. bool InsertList1(LinkList &L,int i,int e){
  20. if(i<1){
  21. return false;
  22. }
  23. LNode *p;//定义一个指针p指向当前扫描到的节点
  24. int j=0;//记录p指向第几个节点
  25. p=L;//从头节点开始 ,l指向头结点
  26. while(p!=NULL&&j<i-1){
  27. p=p->next;
  28. j++;
  29. }
  30. LNode *s=(LNode*)malloc(sizeof(LNode));
  31. s->data=e;
  32. s->next=p->next;
  33. p->next=s;
  34. return true;
  35. }
  36. //4,不带头结点的插入,需考虑第一个特殊节点
  37. bool InsertList1(LinkList &L,int i,int e){
  38. if(i<1){
  39. return false;
  40. }
  41. //插入第一个节点时候不同
  42. if(i==1){
  43. LNode *s=(LNode*)malloc(sizeof(LNode));
  44. s->data=e;
  45. s->next=L;//新节点指向l指向的节点也就是头结点
  46. L=s;//l指向新节点
  47. return true;
  48. }
  49. LNode *p;//定义一个指针p指向当前扫描到的节点
  50. int j=0;//记录p指向第几个节点
  51. p=L;//从头节点开始 ,l指向头结点
  52. while(p!=NULL&&j<i-1){
  53. p=p->next;
  54. j++;
  55. }
  56. LNode *s=(LNode*)malloc(sizeof(LNode));
  57. s->data=e;
  58. s->next=p->next;
  59. p->next=s;
  60. return true;
  61. }
  62. //5,不带头节点的插入之:前插,偷天换日,实际是与p节点交换了数据
  63. bool InsertList2(LinkList p,int e){
  64. if(p==NULL){
  65. return false;
  66. }
  67. LNode *s=(LNode *)malloc(sizeof(LNode));
  68. if(s==NULL){
  69. return false;
  70. }
  71. s->next=p->next;
  72. p->next=s;
  73. s->data=p->data;
  74. p->data=e;
  75. return true;
  76. }
  77. //6,不带头节点的插入之:后插
  78. bool InsertList2(LinkList &p,int e){
  79. if(p==NULL){
  80. return false;
  81. }
  82. LNode *s=(LNode*)malloc(sizeof(LNode));
  83. if(s==NULL){
  84. return false;
  85. }
  86. s->data=e;
  87. s->next=p->next;
  88. p->next=s;
  89. return true;
  90. }
  91. //7,带头节点的删除,循换找到位序-1的节点,定义q指向要被删除的节点,断开该节点,最后释放q节点存储空间
  92. bool DeleteList(LinkList &L,int i,int &e){//e为引用类型,要带回数据
  93. if(i<1){
  94. return false;
  95. }
  96. LNode *p; //定义一个指针指向当前扫描到的节点
  97. int j=0;//记录p指向第几个节点
  98. while(p!=NULL && j<i-1){
  99. p=p->next;
  100. j++;
  101. }
  102. if(p==NULL){
  103. return false;
  104. }
  105. if(p->next==NULL){
  106. return false;
  107. }
  108. LNode *q=p->next;//q指向被删除节点
  109. e=q->data;//e返回删除元素
  110. p->next=q->next;//断开
  111. free(q);
  112. return true;
  113. }
  114. //8,带头节点的指定节点删除
  115. bool DeleteList(LinkList &p){
  116. if(p==null){
  117. return false;
  118. }
  119. LNode *q=p->next;
  120. p->data=p->next->data;
  121. p->next=q->next;
  122. free(q);
  123. return true;
  124. }
  125. //9,带头节点按位查找
  126. LNode *LocateElem(LinkList &L,int i){
  127. if(i<1){
  128. return NULL;
  129. }
  130. LNode *p;//指针p指向当前扫描的节点
  131. p=L;//从头结点开始
  132. int j=0;
  133. while(p!=NULL&&j<i){
  134. p=p->next;
  135. j++;
  136. }
  137. return p;
  138. }
  139. //10,带头节点的按值查找
  140. LNode *Getelem(LinkList &L,int e){
  141. LNode *p=L;
  142. while(p!=NULL&&p->data!=e){
  143. p=p->next;
  144. }
  145. return p;
  146. }
  147. //11,求表的长度
  148. int Length(LinkList &L){
  149. LNode *p=L;
  150. int j=0;
  151. while(p->next!=NULL){
  152. p=p->next;
  153. j++;
  154. }
  155. return j;
  156. }
  157. //12,建立单链表,尾插法
  158. LinkList List_Tailnsert(LinkList &L){
  159. L=(LinkList)malloc(sizaof(LNode));
  160. LNode *s,*r=L;
  161. int x;
  162. scanf("%d",&x);
  163. while(x!=9999){
  164. s=(LNode *)malloc(sizeof(LNode));
  165. s->data=x;
  166. r->next=s;
  167. r=s;
  168. }
  169. r->next=NULL;//r为尾指针,此时为空
  170. return L;
  171. }
  172. //12,头插法
  173. LinkList List_Headnsert(LinkList &L){
  174. L=(LinkList)malloc(sizaof(LNode));
  175. L->next=NULL;
  176. LNode *s;
  177. int x;
  178. scanf("%d",&x);
  179. while(x!=9999){
  180. s=(LNode *)malloc(sizeof(LNode));
  181. s->data=x;
  182. s->next=L->next;
  183. L->next=s;
  184. scanf("%d",&x);
  185. }
  186. return L;
  187. }

四,每日一题:剑指 Offer 24. 反转链表

(1)双指针

  1. class Solution {
  2. public ListNode reverseList(ListNode head) {
  3. ListNode cur=head,per=null;//定义cur指向头节点,per指向null
  4. while(cur!=null){
  5. ListNode temp=cur.next;//定义temp
  6. cur.next=per;//修改指向
  7. per=cur;//per
  8. cur=temp;
  9. }
  10. return per;
  11. }
  12. }

五,理论知识:

(1)java向上转型,比如char自动转为int类型

(2)数组引用类型的变量的默认值为 null

(3)执行顺序优先级:静态域,main(),构造代码块,构造方法。

       静态块:用static申明,JVM加载类时执行,仅执行一次
       构造块:类中直接用{}定义,每一次创建对象时执行
  (4)线程安全问题:Vector相当于一个线程安全的List

                             HashMap是非线程安全的,其对应的线程安全类是HashTable

                              Arraylist是非线程安全的,其对应的线程安全类是Vector

                            StringBuffer是线程安全的,相当于一个线程安全的StringBuilder

                              Properties实现了Map接口,是线程安全的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/902666
推荐阅读
相关标签
  

闽ICP备14008679号