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

> Внимание!

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

> Структуры со списками в Си
Nike0
сообщение 7.01.2011 13:16
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Мужской
Реальное имя: Илья

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


Доброго времени суток, задача состоит в том, чтобы создать структуру, текстовый ввод-вывод(консольный и файловый), также накоряжил очень много кода, есть проблемки, кое-что работает, кое-что нет, поэтому прошу помочь найти ошибки и исправить их, если есть возможность и желание. Комментарии присутствуют, поэтому думаю будет проще разобраться, чем читать сырой код:
/* Для сокращения записи типа структуры введем следующую константу */
#define emlp struct _emlp
#include  <stdio.h>
#include <alloc.h>
/* Описание структуры */
emlp
{
   char name[30]; /* Вид траспорта */
   int  num; /* Номер маршрута */
   char nachalo[30]; /* Начальная остановка */
   char konec[30]; /* Конечная остановка */
   char time[20]; /* Время пути */
   emlp *next; /* Указатель на следующий элемент */
};

emlp *emlph=NULL; /* Начало списка */
char fname[]="D_STRUCT.txt"; /* Файл для хранения списка */

/* Функция печати списка */
int f_print()
{
		emlp *a; /* Указатель на структуру */
		int i, j;
		/* Если списка нет в памяти,то вывод соотвтствуюшего
		   сообщения */
		/* Иначе - вывод всего списка на экран */
		if (emlph==NULL)
			printf("List empty\n");
		else
		{
			for (a=emlph,i=1,j=1; a!=NULL; a=a->next,j++,i++)
			{
				printf("#%-2d %-30s  %-4d  %-30s %-30s %-20s\n",
					i,a->name,a->num,a->nachalo,a->konec,a->time);
				if (j==10)
				{
					printf("Press any key for continue...\n");
					getch();
					j=1;
				}
			}
			printf("======= end of list ========\n");
		}
		return 0;
}

/* Функция ввода списка */
int f_input()
{
		int cc;
		printf("Enter name=* for end of stream\n");
		/* Конец ввода - при вводе '*' вместо имени */
		while (!(cc=f_add())); /* Вызов функции добавления */
		return cc;
}

/* Добавление элемента в список */
int f_add()
{
		emlp *a, *b;
		char ss[60];
		int i=1;
		/* Если список существует,осуществляем вставку элемента */
		if (emlph!=NULL)
			for (i++,a=emlph; a->next!=NULL; a=a->next,i++);
			/* Приглашение к вводу */
				printf("Line #%d. Enter: 'Vid transporta' 'Nomer marshruta' 'Nachalnaya ostanovka' 'Konechanaya ostanovka' 'Vremya v puti' >",i);
				scanf("%s",ss);
				if (ss[0]=='*')
					return 2;
			/* Выделение памяти под новый элемент */
			b = (emlp *)malloc(sizeof(emlp));
			strcpy(b->name,ss);
			scanf("%d",&(b->num));
			strcpy(b->nachalo,ss);
			strcpy(b->konec,ss);
			strcpy(b->time,ss);
			b->next=NULL;
			/* Элемент вставляется после головы списка или в начало,
			если список пустой */
			if (emlph==NULL)
				emlph=b;
			else
				a->next=b;
		return 0;
}

/* Уничтожение элемента списка */
int f_delete ()
{
		int ln;
		emlp *a, *b;
		/* Если списка нет в памяти,то вывод соотвтствуюшего
		сообщения */
		if (emlph==NULL)
			printf("List empty\n");
		/* Иначе-ввод номера элемента с помощью функции GET_LN */
		else
		{
			ln=get_ln()-1;
			if (!ln)
			{
				/*  Если номер корректен - переприсваивание указателей
				и освобождение памяти */
				a=emlph;
				emlph=a->next;
				free(a);
			}
			else
			{
				/* Иначе- ??????? */
				for(ln--, a=emlph; ln&&(a!=NULL); a=a->next,ln--);
					if (a!=NULL)
						if ((b=a->next)!=NULL)
						{
							a->next=b->next;
							free(b);
						}
			}
		}
		return 0;
}

/* Изменение значения полей элемента списка */
int f_change()
{
		char ss[60];
		int ln;
		emlp *a;
		ln=get_ln()-1; /* Ввод номера элемента */
		for (a=emlph; ln && a!=NULL; ln--, a=a->next);
			if (ln)
				return 0;
		/* Вывод старых и ввод новых значений */
		/* Запись новых значений в список */
			printf("Old name  = %s   New name >",a->name);
			gets(ss);
		if (*ss)
			strcpy(a->name,ss);
			printf("Old num = %d   New num >",a->num);
			gets(ss);
		if (*ss)
			sscanf(ss,"%d",&(a->num));
			printf("Old nachalo = %s   New nachalo >",a->nachalo);
			gets(ss);
		if (*ss)
			strcpy(a->nachalo,ss);
			printf("Old konec = %s   New konec >",a->konec);
			gets(ss);
		if (*ss)
			strcpy(a->konec,ss);
			printf("Old time = %s   New time >",a->time);
			gets(ss);
		if (*ss)
			strcpy(a->time,ss);
			return 0;
}

/* Функция сортировки списка */
int f_sort()
{
		int n;
		emlp *a, *b, *c;
		/* Если список пустой или в нем один элемент,
		то выход из функции */
		if ((emlph==NULL)||(emlph->next==NULL))
			return 0;
		/* Сортировка списка методом "пузырька" */
		for (n=1; n; )
		{
			n=0;
			for (a=emlph, b=emlph->next; b!=NULL;)
				if (strcmp(a->name,b->name)>0)
				{
					a->next=b->next;
					b->next=a;
					if (a==emlph)
						emlph=b;
					else
						c->next=b;
						c=b;
						b=a->next;
						n=1;
				}
				else
				{
					c=a;
					a=b;
					b=b->next;
				}
	   }
	   return 0;
}

/* Функция сохранения списка на диске */
int f_save()
{
		FILE *dat;
		emlp *a;
		dat=fopen(fname,"w"); /* Открытие файла на запись */
		/* Запись в файл осуществляется  полями */
		for (a=emlph; a!=NULL; a=a->next)
		fprintf(dat,"%s %d %s %s %s\n",a->name,a->num,a->nachalo,a->konec,a->time);
		/* В конце файла - спецкод '***' */
		fprintf(dat,"***\n");
		fclose(dat);        /* Закрытие файла */
		return 0;
}

/* Перезапись списка из файла в динамическую память */
int f_restore()
{
		FILE *dat;
		char ss[60];
		emlp *a, *b;
		/* Открытие файла для чтения,если файл не найден-вывод
			соответствующего сообщения */
		if ((dat=fopen(fname,"r"))==NULL)
		{
			printf("File not found : %s\n",fname);
			return 1;
		}
		else
		{
			emlph=NULL;
			do
			{
				/* Чтение из файла по полям пока не дошли до
				спецкода '* '*/
				fscanf(dat,"%s",ss);
				if (ss[0]!='*')
				{
					/* Выделение памяти под новый элемент */
					b = (emlp *)malloc(sizeof(emlp));
					if (emlph==NULL)
						emlph=b;
					else
						a->next=b;
						strcpy(b->name,ss);
						scanf("%d",&(b->num));
						strcpy(b->nachalo,ss);
						strcpy(b->konec,ss);
						strcpy(b->time,ss);
						b->next=NULL;
						a=b;
				}
			} while (ss[0]!='*');
			fclose(dat);  /* Закрытие файла */
	   }
	   return 0;
}
/* Ввод номера элемента */
int get_ln ()
{
		int ln;
		printf("Enter line number >");
		do
		{
			/* Ввод номера элемента и проверка его(если он меньше единицы-
			выдается сообщение об ошибке */
			scanf("%d",&ln);
			if (ln<1)
			{
				printf("Illegial line number. Try again >");
				ln=0;
			}
		} while (!ln);
		return ln;
}

main()
{
	char eoj; /* Флаг окончания работы */
	int i; /* Вспомогательная переменная */
	/* Структура меню */
	struct
	{
		int op; /* Номер операции */
		(*opf)(); /* Функция обработки */
	}
		m[9] =
		{
		{'1',f_print},{'2',f_input},{'3',f_add},
		{'4',f_delete},{'5',f_change},{'6',f_sort},
		{'7',f_save},{'8',f_restore},{'0',}
	};
	int  opcode; /* Код операции */
	for ( ; ; )  /* Пока не конец работы */
	{
		clrscr();           /* Очистка экрана */
		printf("1. Print\n");  /* Вывод пунктов меню на экран */
		printf("2. Input\n");
		printf("3. Add\n");
		printf("4. Delete\n");
		printf("5. Change\n");
		printf("6. Sort\n");
		printf("7. Save\n");
		printf("8. Restore\n");
		printf("0. Quit\n");
		printf("Enter operation code > "); /* Запрос на ввод номера
										  пункта для выполнения */
		opcode=getche(); /* Ввод номера пункта */
		putchar('\n');
		if (opcode=='0') /* выход из программы, если выбран QUIT */
		{
		  printf("Press any key...");
		  getch();
		  exit(0);
		}
		for (i=0; i<9;i++)
		{  /* Запуск соответствующей функции обработки */
			if (opcode==m[i].op)
			{
				if (m[i].opf()==1)
					exit(0);
					break;
			}
		}
	}
	getch();
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 

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