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

> Внимание!

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

> Линейные списки на Си, Сортировка и подсчет по условию
Gera
сообщение 21.03.2007 0:15
Сообщение #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(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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 

- Текстовая версия 26.07.2025 9:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"