![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Gera |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Женский Репутация: ![]() ![]() ![]() |
Для заданного варианта представления линейного списка составить и отладить программу, которая выполняет по выбору: первоначальное формирование списка, включение элемента в список, удаление элемента из списка, сортировку списка по заданному полю, печать списка и решение дополнительной задачи. Двунаправленный кольцевой список. Упорядочить список поездов в порядке убывания их номеров. Подсчитать количество поездов, отправляющихся до заданного пункта назначения. Список содержит сведения об отправлении поездов дальнего следования на железнодорожном вокзале (номер поезда, станция назначения, время отправления).
Вот текст получившейся у меня программы: #include <stdio.h> /* podkluchenie bibliotek*/
#include <string.h>
#include <conio.h>
#include <alloc.h>
#include <dos.h>
#define LIST struct list
LIST
{
int Nomer; /*nomer poezda*/
char Stanc[25]; /*stanciya naznacheniya*/
float Vremya; /*vremya otpravleniya*/
LIST *next, *pred; /*ykazateli na sledyushii i predudyshii elementu*/
};
LIST *ptr_Beg;
void Insert_List(char Stc[],int Nmr,float Vrm) /*dobavlenie novogo elementa*/
{
LIST *ptrX,*ptr_Ls;
ptrX = (LIST *) malloc(sizeof(LIST));
strcpy(ptrX->Stanc,Stc);
ptrX->Nomer=Nmr;
ptrX->Vremya=Vrm;
ptr_Ls=ptr_Beg;
while (ptr_Ls->next != ptr_Beg)
{
if(ptr_Ls->next->Nomer<Nmr)
break;
ptr_Ls=ptr_Ls->next;
}
ptrX->next=ptr_Ls->next;
ptrX->pred=ptr_Ls;
ptr_Ls->next->pred=ptrX;
ptr_Ls->next=ptrX;
return;
};
void Del_List (int Nmr) /*ydalenie elementa*/
{
LIST *ptr,*ptr_Ls;
ptr=ptr_Beg->next;
ptr_Ls=ptr_Beg;
while (ptr != ptr_Beg) {
if(ptr->Nomer >= Nmr)
ptr_Ls->next=ptr->next;
ptr_Ls=ptr;
ptr=ptr->next;
}
return;
};
void Change(LIST *a,LIST *b) /*obmen mestami elementov*/
{
a->next=b->next;
a->pred->next=b;
b->next->pred=a;
b->next=a;
b->pred=a->pred;
a->pred=b;
};
void Sortirovka() /*sortirovka spiska po nomery poezdov*/
{
LIST *ptr,*ptr_Ls;
ptr= (LIST *) malloc(sizeof(LIST));
ptr_Ls= (LIST *) malloc(sizeof(LIST));
ptr_Ls=ptr_Beg->next;
while (ptr_Ls != ptr_Beg) {
ptr=ptr_Beg;
while (ptr->next->next != ptr_Beg) {
if(ptr->next->Nomer < ptr->next->next->Nomer)
Change(ptr->next,ptr->next->next);
ptr=ptr->next;
}
ptr_Ls=ptr_Ls->next;
}
return;
};
void Print_List() /*pechat spiska*/
{
LIST *ptr_Ls;
ptr_Ls=ptr_Beg;
while (ptr_Ls->next != ptr_Beg) {
ptr_Ls=ptr_Ls->next;
printf(" %-15s%-12d%-4.2f\n", ptr_Ls->Stanc, ptr_Ls->Nomer, ptr_Ls->Vremya);
}
return;
};
void Pynkt_List (char *Stc) /*podschet kolichestva poezdov do opredelennogo goroda*/
{
int Count=0;
LIST *ptr_Ls;
ptr_Ls=ptr_Beg->next;
while (ptr_Ls != ptr_Beg) {
if(ptr_Ls->Stanc == Stc)
Count++;
ptr_Ls=ptr_Ls->next;
}
return;
};
main() /*osnovnaya programma*/
{
char c,Stc[25];
int Count,Nmr;
float Vrm;
LIST *ptr,*ptrX,*ptr_Ls;
/*inicializaciya spiska*/
ptr_Beg = (LIST *)malloc(sizeof(LIST));
clrscr();
do { /*vuvod na ekran menu*/
window(41,1,80,8);
gotoxy(1,1);puts("1.Formirovanie spiska");
gotoxy(1,2);puts("2.Vkluchenie elementa v spisok");
gotoxy(1,3);puts("3.Ydalenie elementa iz spiska");
gotoxy(1,4);puts("4.Nahojdenie kol-va poezdov do pynkta");
gotoxy(1,5);puts("5.Pechat' spiska");
gotoxy(1,6);puts("6.Vuhod");
c = getch(); /*ojidanie najatiya klavishi*/
window(1,1,40,25);
clrscr();
switch(c) { /*vubor punkta menu*/
case '1': { /*formirovanie spiska*/
ptr=ptr_Beg;
while(1) {
printf("Vvedite pynkt naznacheniya: ");
scanf("%s",Stc);
if(strcmp(Stc,"*")==0) {
ptr->next = ptr_Beg; break;
}
printf("Vvedite nomer poezda: ");
scanf("%d",&Nmr);
printf("Vvedite vremya otpravleniya: ");
scanf("%f",&Vrm);
ptrX=(LIST *) malloc(sizeof(LIST));
strcpy(ptrX->Stanc,Stc);
ptrX->Nomer=Nmr;
ptrX->Vremya=Vrm;
ptr->next=ptrX;
ptr=ptrX;
}
Sortirovka();
break;
}
case '2': {
printf("Vvedite pynkt nazn-ya, nomer i vremya: \n");
scanf("%s%d%f",Stc,&Nmr,&Vrm);
Insert_List(Stc,Nmr,Vrm);
break;
}
case '3': { /*ydalenie elementa iz spiska*/
Del_List(300); break;
}
case '4': {
printf("Vvedite pynkt naznacheniya");
scanf("%s",Stc);
Pynkt_List(Stc);
printf("Kol-vo poezdov do pynkta nazn-ya = %d\n",Count);
break;
}
case '5': { /*pechat' vseh elementov spiska*/
printf("Pynkt nazn-ya Nomer p-da Vremya otpr-ya \n");
Print_List();
break;
}
case '6': { /*vuhod*/
break;
}
}
} while(c>'0' && c<'6');
}
Проблем у меня несколько: формируется, печатается и добавляется все вроде нормально, а вот удаляется по заданному условию по очень странному алгоритму: когда я первый раз вызываю функцию удаления, то удаляются все элементы, кроме самого близкого к 300 (см.условие), а потом ещё раз вызываю функцию удаления и тот элемент тоже удаляется; что касается сортировки и поиска с подсчетом по условию, тут вообще беда - ничего не выходит. Пожалуйста, помогите разобраться с этими проблемами, я уже столько раз пыталась что-то переделать... -------------------- Errare humanum est.
|
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 9:12 |