Сортировка односвязного списка (пузырьком) - C (СИ)

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

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

нужно отсортировать информацию о поездах по номеру поезда. Сортировку нужно сделать изменением узлов. При сортировке просто исчезает вторая строка. подскажите в чем ошибка
 #include<stdio.h>
 #include<conio.h>
 #include<stdlib.h> 
 #include<string.h>
 
struct train {
       char punkt[10];  
       int nomer;
       float time;
       struct train *next;
};
 
 // присоединение элемента к голове, возврат адреса головы 
struct train *create(struct train *head, int n,float t,char *p) {
       struct train *element; // указатель на новую структуру
       element = (struct train *)malloc(sizeof(struct train)); // выделяем память
       element->next = head;
       element->nomer = n;
       element->time = t;
       strcpy(&element->punkt[0],&p[0]);
 
       return element;
}
 
 // печать стека
 void print(struct train *p)
 {
      printf(" ___________________________________\n");
      printf("|punkt nazn |nom marsh|otpravlenije\n");
      printf("|___________________________________\n");   
         
     while (p != NULL) 
     { 
           printf("%10s | %7d | %.2f \n ", p->punkt, p->nomer, p->time);
           p = p->next; // продвижение по списку
     }
     printf("\n");
}
 
void sort(train * list) 
{
    train *p1,* p2;
       int n;float t;char pk[10];
    
    if (list != NULL) {                                           //если стек не пустой
        while (list->next != NULL) 
        {                                                        // пока стек не закончится
 
            p1=list;                                             
            p2=p1->next;
  
            do 
            {
                if (p2->nomer < p1->nomer) {
     
                                                p1->next=p2->next;
                                                p2->next=p1;
                                                p1=p2;
                                             }
                p2 = p2->next;
            } while (p2 != NULL);
            list = list->next;
        }
    }
}
 
void info(train * list) 
{
       int n,k=0;
  
    printf("Vvedite nomer poezda\n");
    scanf("%d",&n);
          while (list->next != NULL) 
        {
               if (list->nomer==n) { printf("%10s | %7d | %.2f \n ", list->punkt, list->nomer, list->time);break;}
               else k++;
            list = list->next;
            if(list->next == NULL || k==0){printf("poezd ne najden\n");}
        }
}
 
int main() 
{
       int n,k=0;float t;char p[10];
       struct train *head; // адрес, указывающий на голову стека
       head = NULL;
        FILE *f;
     
    f = fopen("train.txt","r");
    
    while (!feof(f))
    { 
       fscanf(f,"%s %d %f", &p, &n, &t);
       head=create(head,n,t,p);
    }
    
    print(head);
for(;;)
{
    printf("Vyberite operaciju\n 1 - sortirovka po nomeru poezda\n 2 - poisk poezda po nomeru\n");
    scanf("%d",&k);
    if (k==1){sort(head);
                 print(head);}
    else{if(k==2) {info(head);}
         else break;        
        }      
}
       
       fclose(f);   
       free(head);
       getch(); 
       return 0;
}

Решение задачи: «Сортировка односвязного списка (пузырьком)»

textual
Листинг программы
struct train *udal(struct train * head, struct train * del) {   // element pered udal
    struct train *prev;

Объяснение кода листинга программы

  1. В первой строке объявляется структура train и переменная prev типа struct train*
  2. Переменная prev инициализируется значением head
  3. Переменная del передается в функцию udal
  4. В цикле while выполняется условие, пока del не станет равным NULL
  5. Внутри цикла prev присваивается значение del
  6. Переменная del присваивается значение prev->next
  7. В цикле while выполняется условие, пока prev не станет равным NULL
  8. Внутри цикла prev->next присваивается значение del
  9. Переменная del присваивается значение prev
  10. Переменная prev присваивается значение NULL
  11. В конце функции возвращается значение head

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


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

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

13   голосов , оценка 4.231 из 5
Похожие ответы