Сортировка односвязного списка (пузырьком) - 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;
Объяснение кода листинга программы
- В первой строке объявляется структура
train
и переменнаяprev
типаstruct train*
- Переменная
prev
инициализируется значениемhead
- Переменная
del
передается в функциюudal
- В цикле while выполняется условие, пока
del
не станет равнымNULL
- Внутри цикла
prev
присваивается значениеdel
- Переменная
del
присваивается значениеprev->next
- В цикле while выполняется условие, пока
prev
не станет равнымNULL
- Внутри цикла
prev->next
присваивается значениеdel
- Переменная
del
присваивается значениеprev
- Переменная
prev
присваивается значениеNULL
- В конце функции возвращается значение
head
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д