Сортировка односвязного списка (пузырьком) - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д