Сортировка двустороннего списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Товарищи! Подскажите в чем ошибка! Пытаюсь отсортировать двусторонний , я только учусь, пишу сам алгоритм Пузырька и что то не хочет вообще ни чего печатать. Подозреваю что я где то запутался с указателями и они в конце выполнения программы перекосячены и поэтому не выводит на печать . Ниже код. Буду очень благодарен!
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct L {
  5. int value;
  6. char name[10];
  7. struct L *next, *prev;
  8. } ListItem;
  9. static ListItem base;
  10. static ListItem *current;
  11. static ListItem *pos;
  12. static ListItem *prev2;
  13. static ListItem *next2;
  14. static ListItem *current2;
  15. static int a,b,c,k,g;
  16. static int num;
  17. void print_pos(void);
  18. void creation_zero(void);
  19. void creation(void);
  20. void scan_creation(void);
  21. void sort(void);
  22. int main(){
  23. creation_zero();
  24. do{
  25. scan_creation();
  26. if(pos->value==0){
  27. free(pos);
  28. break;
  29. }
  30. creation();
  31. }
  32. while(1);
  33. sort();
  34. print_pos();
  35. return 0;
  36. }
  37. void print_pos()/*Печать всего списка*/
  38. {
  39. pos=current->prev;
  40. while(pos!=&base){
  41. printf("\nname=%s\ttall=%d\n",pos->name,pos->value);
  42. pos=pos->prev;
  43. }
  44. return 0;
  45. }
  46. void creation_zero()/*Создать нулевое звено*/
  47. {
  48. current = &base;
  49. base.next = base.prev = &base;
  50. num=0;
  51. return 0;
  52. }
  53. void scan_creation()/*Выделение памяти и запись значений*/
  54. {
  55. pos = (ListItem*)malloc(sizeof(ListItem));
  56. printf("\nWhat is your name? \t");
  57. scanf("%s",&pos->name);
  58. printf("\nHow tall are you? \t");
  59. scanf("%d",&pos->value);
  60. return 0;
  61. }
  62. void creation()/*Создание звена и определение его местоположения*/
  63. {
  64. pos->next = current->next;
  65. pos->prev = current;
  66. current->next->prev = pos;
  67. current->next = pos;
  68. num++;
  69. return 0;
  70. }
  71. void sort()// Сортировка пузырьком
  72. {
  73. next2=current->prev;//указатель для главного цикла(передвигает вперед по списку, после завершения внутреннего цикла)
  74. current->next=current->prev->prev;//Смотрим на следующий элемент после current->prev
  75. current2=current->prev;//Запоминем значения current->prev для перестановки местами.
  76. while(next2!=&base) /*Если next2 попадед в base то останавливаем цикл*/{
  77. while(current->prev->prev!=&base)//Если следующий элемнт ceurrent->prev будет base, останавливаем цикл
  78. {
  79. if(current->prev->value>current->next->value){//Сама сортировка
  80. if(current->next->prev==&base){//Условие для того чтобы можно было сравнить посление элемнты и перставить current-prev на поледний
  81. current->prev->prev=current->next->prev;
  82. current->prev->next=current->next->prev->next;
  83. current->next->prev->next=current->prev;
  84. current->next->prev=current->prev;
  85. current->next->next=current2->next;
  86. current->prev=current->next;
  87. }
  88. else{
  89. current->prev->prev=current->next->prev;
  90. current->prev->next=current->next->prev->next;
  91. current->next->prev->next=current->prev;
  92. current->next->prev=current->prev;
  93. current->next->next=current2->next;
  94. current->next=current->prev->prev;
  95. current2=current->prev;
  96. }
  97. }
  98. current->prev=current->next;
  99. current->next=current->prev->prev;
  100. current2=current->prev;
  101. }
  102. while(current->prev->next!=&base){//Возвращаем на место указатели
  103. current->prev=current->prev->next;
  104. }
  105. current2=current->prev;
  106. current->next=current->prev->prev;
  107. next2=next2->prev;
  108. }
  109. while(current->next->prev!=&base){//По оканчанию сортировки , возвращаем Current->next на место, current->prev уже должен быть на месте
  110. current->next=current->next->prev;
  111. }
  112. }
голову ломаю, но не могу найти причины(

Решение задачи: «Сортировка двустороннего списка»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct L {
  6.     char name[10];
  7.     struct L* next;
  8.     struct L* prev;
  9. } list_t;
  10.  
  11. int  list_add(list_t** head, list_t** tail, const char* s);
  12. void list_clear(list_t** head, list_t** tail);
  13.  
  14.  
  15. //сортировка
  16. void list_sort(list_t** ph, list_t** pt){
  17.     list_t* p, *n, *e, *t, *i, *l;
  18.  
  19.     if((*ph == NULL) || ((*ph)->next == NULL))
  20.         return;
  21.  
  22.     p = n = e = NULL;
  23.     for(i = l = t = *ph; (t != NULL) && (t->next != NULL); t = t->next->next) {
  24.         l = i;
  25.         i = i->next;
  26.     }
  27.     l->next = NULL;
  28.  
  29.     list_sort(ph,  pt);
  30.     list_sort(&i, pt);
  31.  
  32.     while((*ph != NULL) || (i != NULL)){
  33.         if(i == NULL) {
  34.             n   = *ph;
  35.             *ph = (*ph)->next;
  36.         } else if(*ph == NULL) {
  37.             n   = i;
  38.             i   = i->next;
  39.         } else if(strcmp((*ph)->name, i->name) < 0) {
  40.             n   = *ph;
  41.             *ph = (*ph)->next;
  42.         } else {
  43.             n  = i;
  44.             i  = i->next;
  45.         }
  46.  
  47.         if(p == NULL)
  48.             p = n;
  49.         else
  50.             e->next = n;
  51.  
  52.         n->prev = e;  
  53.         e       = n;
  54.     }
  55.     *ph = p;
  56.     *pt = e;
  57. }
  58.  
  59.  
  60. int main(void) {
  61.     list_t* p, *head = NULL, *tail = NULL;
  62.    
  63.     list_add(&head, &tail, "cccccc");
  64.     list_add(&head, &tail, "xxxxxx");
  65.     list_add(&head, &tail, "zzzzzz");
  66.     list_add(&head, &tail, "bbbbbb");
  67.     list_add(&head, &tail, "dddddd");
  68.     list_add(&head, &tail, "eeeeee");
  69.     list_add(&head, &tail, "aaaaaa");
  70.  
  71.     list_sort(&head, &tail);
  72.     list_sort(&head, &tail);
  73.  
  74.     for(p = head; p != NULL; p = p->next)
  75.         printf("%s ", p->name);
  76.     putchar('\n');
  77.  
  78.     for(p = tail; p != NULL; p = p->prev)
  79.         printf("%s ", p->name);
  80.     putchar('\n');
  81.  
  82.     list_clear(&head, &tail);
  83.     return 0;
  84. }
  85.  
  86. //добавление
  87. int list_add(list_t** head, list_t** tail, const char* s){
  88.     list_t* p = (list_t*)malloc(sizeof(list_t));
  89.     if(p != NULL){
  90.         strcpy(p->name, s);
  91.         p->next = p->prev = NULL;
  92.  
  93.         if(*head == NULL)
  94.             *head = *tail = p;
  95.         else {
  96.             p->prev = *tail;
  97.             (*tail)->next = p;
  98.             *tail   = p;
  99.         }
  100.     }
  101.     return (p != NULL);
  102. }
  103.  
  104. //удаление
  105. void list_clear(list_t** head, list_t** tail){
  106.     list_t* t;
  107.     while(*head != NULL){
  108.         t = *head;
  109.         *head = (*head)->next;
  110.         free(t);
  111.     }
  112.     *tail = NULL;
  113. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы