You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "loop_list.h"
  4. #define PKT_ASSERT(x) {if(!x){printf("assert failed!\n");while(1);}}
  5. typedef int data_type;
  6. typedef struct list_node *list_node_t;
  7. struct list_node
  8. {
  9. list_node_t next;
  10. data_type data;
  11. };
  12. int pkt_get_loop_list_length(list_node_t l)
  13. {
  14. int i = 0;
  15. list_node_t p = l->next;
  16. while (p != l)
  17. {
  18. printf("l[%d] = %d\n", i, p->data);
  19. p = p->next;
  20. i++;
  21. }
  22. return i;
  23. }
  24. list_node_t pkt_creat_loop_list(void)
  25. {
  26. list_node_t n;
  27. n = (list_node_t)malloc(sizeof(struct list_node));
  28. n->next = n;
  29. return n;
  30. }
  31. int pkt_insert_loop_list_head(list_node_t l, data_type data)
  32. {
  33. PKT_ASSERT(l);
  34. list_node_t n = (list_node_t)malloc(sizeof(struct list_node));
  35. if (!n)
  36. {
  37. printf("malloc failed!\n");
  38. return -1;
  39. }
  40. n->data = data;
  41. n->next = l->next;
  42. l->next = n;
  43. return 0;
  44. }
  45. int pkt_merge_loop_list(list_node_t des, list_node_t src)
  46. {
  47. PKT_ASSERT(des);
  48. PKT_ASSERT(src);
  49. if (!des->next || !src->next)
  50. {
  51. printf("is a empty list!\n");
  52. return -1;
  53. }
  54. list_node_t p = des;
  55. list_node_t q = src;
  56. while (p->next != des)
  57. {
  58. p = p->next;
  59. }
  60. while (q->next != src)
  61. {
  62. q = q->next;
  63. }
  64. q->next = p->next;
  65. p->next = src->next;
  66. free(src);
  67. return 0;
  68. }
  69. typedef struct dlist_node *dlist_node_t;
  70. struct dlist_node
  71. {
  72. dlist_node_t prev;
  73. dlist_node_t next;
  74. data_type data;
  75. };
  76. int pkt_get_loop_dlist_length(dlist_node_t l)
  77. {
  78. int i = 0;
  79. dlist_node_t p = l->next;
  80. while (p != l)
  81. {
  82. printf("dl[%d] = %d\n", i, p->data);
  83. p = p->next;
  84. i++;
  85. }
  86. return i;
  87. }
  88. dlist_node_t pkt_creat_loop_dlist(void)
  89. {
  90. dlist_node_t n;
  91. n = (dlist_node_t)malloc(sizeof(struct dlist_node));
  92. n->next = n->prev = n;
  93. return n;
  94. }
  95. int pkt_insert_loop_dlist(dlist_node_t l, data_type data)
  96. {
  97. PKT_ASSERT(l);
  98. dlist_node_t n = (dlist_node_t)malloc(sizeof(struct dlist_node));
  99. if (!n)
  100. {
  101. printf("malloc failed!\n");
  102. return -1;
  103. }
  104. n->data = data;
  105. dlist_node_t p = l;
  106. n->next = p;
  107. n->prev = p->prev;
  108. p->prev->next = n;
  109. p->prev = n;
  110. return 0;
  111. }
  112. int pkt_remove_loop_dlist(dlist_node_t l, data_type data)
  113. {
  114. PKT_ASSERT(l);
  115. dlist_node_t p = l->next;
  116. while (p->next != l && p->data != data)
  117. {
  118. p = p->next;
  119. }
  120. if (p->next == l)
  121. {
  122. printf("did not find the node\n");
  123. return -1;
  124. }
  125. p->prev->next = p->next;
  126. p->next->prev = p->prev;
  127. free(p);
  128. return 0;
  129. }
  130. dlist_node_t pkt_get_node_by_pos(dlist_node_t l, int pos)
  131. {
  132. PKT_ASSERT(l);
  133. if (pos < 0)
  134. {
  135. printf("the pos < 0\n");
  136. return NULL;
  137. }
  138. dlist_node_t p = l->next;
  139. int i = 0;
  140. while (p != l && pos > i)
  141. {
  142. p = p->next;
  143. i++;
  144. }
  145. if (p == l)
  146. {
  147. printf("the pos is too big\n");
  148. return NULL;
  149. }
  150. return p;
  151. }
  152. int main(int argc, char **argv)
  153. {
  154. #if 0
  155. list_node_t des = pkt_creat_loop_list();
  156. list_node_t src = pkt_creat_loop_list();
  157. pkt_insert_loop_list_head(des, 9899);
  158. pkt_insert_loop_list_head(des, 1);
  159. pkt_insert_loop_list_head(des, 8);
  160. pkt_insert_loop_list_head(des, 9);
  161. pkt_insert_loop_list_head(src, 99999);
  162. pkt_insert_loop_list_head(src, 66666);
  163. pkt_get_loop_list_length(des);
  164. printf("======================================\n");
  165. pkt_get_loop_list_length(src);
  166. pkt_merge_loop_list(des, src);
  167. printf("======================================\n");
  168. pkt_get_loop_list_length(des);
  169. #elif 1
  170. dlist_node_t dlist = pkt_creat_loop_dlist();
  171. pkt_insert_loop_dlist(dlist, 10);
  172. pkt_insert_loop_dlist(dlist, 89);
  173. pkt_insert_loop_dlist(dlist, 55);
  174. pkt_insert_loop_dlist(dlist, 98);
  175. pkt_insert_loop_dlist(dlist, 23);
  176. pkt_insert_loop_dlist(dlist, 969);
  177. pkt_get_loop_dlist_length(dlist);
  178. printf("======================================\n");
  179. pkt_remove_loop_dlist(dlist, 55);
  180. pkt_get_loop_dlist_length(dlist);
  181. printf("======================================\n");
  182. pkt_remove_loop_dlist(dlist, 155);
  183. pkt_get_loop_dlist_length(dlist);
  184. int pos;
  185. while (1)
  186. {
  187. scanf("%d", &pos);
  188. dlist_node_t node;
  189. if (node = pkt_get_node_by_pos(dlist, pos))
  190. {
  191. printf("l[%d].data = %d\n", pos, node->data);
  192. }
  193. }
  194. #endif
  195. return 0;
  196. }