IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Линейные списки на Си, Сортировка и подсчет по условию
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Женский

Репутация: -  0  +


Для заданного варианта представления линейного списка составить и отладить программу, которая выполняет по выбору: первоначальное формирование списка, включение элемента в список, удаление элемента из списка, сортировку списка по заданному полю, печать списка и решение дополнительной задачи. Двунаправленный кольцевой список. Упорядочить список поездов в порядке убывания их номеров. Подсчитать количество поездов, отправляющихся до заданного пункта назначения. Список содержит сведения об отправлении поездов дальнего следования на железнодорожном вокзале (номер поезда, станция назначения, время отправления).
Вот текст получившейся у меня программы:
#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© { /*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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Gera   Линейные списки на Си   21.03.2007 4:15
Алена   Что-то у тебя накручено с программой... Я бы сдела…   21.03.2007 6:51
Gera   Большое спасибо, прямо спасла меня Алена. :) Прог…   22.03.2007 1:04
Алена   То есть? Моя программа не удаляет? Естественно...…   22.03.2007 1:09
Gera   То есть? Моя программа не удаляет? Да, Ален, все…   22.03.2007 1:16
Алена   Странно. У меня удаляет. Смотри: Запуск программы …   22.03.2007 1:31
Gera   Ой, Алена, прости, да у тебя все правильно, просто…   22.03.2007 2:56
Алена   Каким образом? У меня все нормально и в случае …   22.03.2007 3:01
Gera   Мне прямо неудобно, я уже замучала наверное своей …   22.03.2007 3:10
Алена   А, вот ты о чем... Тогда замени старые функции на …   22.03.2007 3:27
Gera   Еще раз спасибо, теперь вроде все работает, надеюс…   22.03.2007 12:16
Gera   У меня новая головная боль; :dry: оказывается, н…   25.03.2007 1:57
volvo   Gera, смотри: Что изменилось? 1. Добавлено меню…   25.03.2007 6:59
Gera   Спасибо, volvo, все гениальное, оказывается, прост…   25.03.2007 16:52


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.09.2021 19:41
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name