双链表-双链表的排序(非节点值排序,而是节点排序)

柔情只为你懂 2023-02-19 08:25 96阅读 0赞
  1. 双链表的排序
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. // 双链表
  5. typedef struct node_t{
  6. int val;
  7. int idx;
  8. struct node_t *next, *prev;
  9. }in, *in_p;
  10. void showList( struct node_t *h )
  11. {
  12. printf("++++++++++++showList+++++++++++++\n");
  13. while( h ){
  14. printf("h->idx = %d , h->val = %d\n", h->idx, h->val );
  15. h = h->next;
  16. }
  17. }
  18. void showRList( struct node_t *h )
  19. {
  20. printf("+++++++++++showReverse++++++++++++++\n");
  21. while( h->next ){
  22. h = h->next;
  23. }
  24. while( h ){
  25. printf("h->idx = %d , h->val = %d\n", h->idx, h->val );
  26. h = h->prev;
  27. }
  28. }
  29. void insertHead( struct node_t **h, struct node_t *n )
  30. {
  31. n->next = *h;
  32. if( *h != NULL ){
  33. (*h)->prev = n;
  34. }
  35. *h = n;
  36. }
  37. void insertTail( struct node_t **h, struct node_t *n )
  38. {
  39. if( *h == NULL ){
  40. *h = n;
  41. return;
  42. }
  43. struct node_t *p = *h;
  44. while( p->next ){
  45. p = p->next;
  46. }
  47. p->next = n;
  48. n->prev = p;
  49. }
  50. in_p sort_list(in_p h){
  51. in_p newhead = NULL, min = NULL, head = NULL;
  52. while(h){
  53. min = h;
  54. head = h;
  55. while(head->next){
  56. if(min->val > head->next->val){
  57. min = head->next;
  58. }
  59. head = head->next;
  60. }
  61. if(min == h){
  62. h = h->next;
  63. }
  64. else{
  65. min->prev->next = min->next;
  66. if(min->next){ //以防最后一个节点是最小值,如果没有这判断,可能段错误
  67. min->next->prev = min->prev;
  68. }
  69. }
  70. min->next = NULL; //
  71. min->prev = NULL; //让min指向的这个节点完全脱开链表
  72. min->next = newhead;
  73. if(newhead != NULL){
  74. newhead->prev = min;
  75. }
  76. newhead = min;
  77. }
  78. return newhead;
  79. }
  80. int main()
  81. {
  82. int arr[] = { 10,10,9,8,5,20,10,10,30,20,10,10};
  83. struct node_t *head = NULL;
  84. int i = 0;
  85. struct node_t *newnode = NULL;
  86. while( i < sizeof(arr)/sizeof(int) ){
  87. newnode = malloc( sizeof(struct node_t) );
  88. newnode->val = arr[i];
  89. newnode->idx = i;
  90. newnode->next = NULL;
  91. newnode->prev = NULL;
  92. insertTail( &head , newnode );
  93. // head = insertTail( head, newnode );
  94. // insertTail1( &head, newnode );
  95. i++;
  96. }
  97. showList( head );
  98. head = sort_list(head);
  99. showList( head );
  100. return 0;
  101. }

发表评论

表情:
评论列表 (有 0 条评论,96人围观)

还没有评论,来说两句吧...

相关阅读