Сортировка односвязного списка (пузырьком) - 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