Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2014, 09:35   #1
Nickolay0512
Пользователь
 
Регистрация: 26.10.2013
Сообщений: 54
По умолчанию Перемещение элемента на n позиций назад по списку

Здравствуйте. Программа работает с двусвязным списком. Функция Search должна перемещать элемент на n позиций назад. Она работает только, если элемент перемещается в середину (т.е. не на первое место и не на последнее). Подскажите как написать правильно функцию Search
Код:
#include <stdlib.h>
#include <stdio.h>
struct student
{
	char name[20];
	char sort[20];
	int count;
	struct post
	{
		char name[20];
		char addres[20];
		char tel[20];
	}postavka;
};
struct List // Элемент списка
{
	struct student element;
	struct List *next, *prev;
};
struct List *add(struct List *end)
{
	struct List *new;
	new = malloc(sizeof(struct List));
	printf("Наименование овощи : ");
	scanf("%15s", new->element.name);
	printf("сорт овощи: ");
	scanf("%s", &new->element.sort);
	printf("Количество: ");
	scanf("%d", &new->element.count);
	printf("Название поставщика: ");
	scanf("%s", &new->element.postavka.name);
	printf("Адрес поставщика: ");
	scanf("%s", &new->element.postavka.addres);
	printf("Телефон поставщика: ");
	scanf("%s", &new->element.postavka.tel);

	new->next = NULL;
	new->prev = end;
	if (end != NULL) end->next = new;
	return new;
}

void ShowList(struct List *fs)
{
	int k = 0;
	struct List *ls = NULL;
	if (fs == NULL) puts("List is empty");
	puts("| N |  Название  |   Сорт   | Количество | Назв. пос. | Адрес пост.| Тел. пост.|");
	puts("|___|____________|__________|____________|____________|____________|___________|");
	ls = fs;
	while (ls != NULL)
	{
		printf("|%-3d|%-12s|%-10s|%-12d|%-12s|%-12s|%-11s\n", ++k, ls->element.name, ls->element.sort, ls->element.count, ls->element.postavka.name, ls->element.postavka.addres, ls->element.postavka.tel);
		puts("|___|____________|__________|____________|____________|____________|___________|");
		ls = ls->next;
	}
}


void Search(struct List *fs, int count)
{
	struct List *fsearch = NULL,*fcur=NULL;
	if (fs == NULL) 
	{
		printf("Список пуст!");  return;
	}
	fsearch = fs;
	int max = 0, k = 0,n,N;
	printf("Какой элемент будем переносить? ");
	scanf("%d", &N);
	printf("Введите n: ");
	scanf("%d", &n);
	if (n > count)
	{
		printf("Элемента с таким номером не существует!");
		return;
	}
	while (fsearch != NULL)
	{
		if (k == N-1 ) break;//добрались до элемента N
		fsearch = fsearch->next;
		k++;
	}
	fsearch->prev->next = fsearch->next;
	fsearch->next->prev = fsearch->prev;
	//переместимся на n позиций назад
	k = 0;
	fcur = fsearch;
	while (fsearch != NULL)
	{
		if (k == n) break; //дошли до элемента перед которым будем вставлять элемент N
		fcur = fcur->prev;
		k++;
	}
	//перенастроим указатели
	fsearch->next = fcur;
	fsearch->prev = fcur->prev;
	fcur->prev->next = fsearch;
	fcur->prev = fsearch;
}

int main(int argc, char *argv[])
{
	struct List *fcur = NULL, *fstart = NULL, *fend = NULL;
	char menu, file[50], s;
	int ball, count = 0, k;

	do
	{
		system("cls");
		puts("1.Добавить запись");
		puts("2.Просмотр списка");
		puts("3.Перемещение элемента с текущей позиции на n позиций назад по списку");
		puts("4.Выход");

		menu = getchar();

		switch (menu)
		{
		case '1': system("cls");
			if ((fcur = add(fend)) != NULL)
			{
				fend = fcur;
				if (fstart == NULL)
					fstart = fend;
				count++;
			}

			else puts("Запись не добавлена");
			system("pause");
			break;
		case '2': system("cls");
			ShowList(fstart);
			system("pause");
			break;
		case '3': //поиск
			Search(fstart, count);
		case '4': system("cls");

		}
	} while (menu != '4');
	system("cls");
	while (fstart != NULL){
		fcur = fstart->next;
		free(fstart);
		fstart = fcur;
	}
	system("PAUSE");
	return 0;
}
Nickolay0512 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение указателя в файле назад от текущей позиции oinari Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.04.2012 19:49
Найдите ошибку в добавлении элемента к списку alex-soft Помощь студентам 0 20.01.2012 18:55
ИЗМЕНЕНИЕ ПОЗИЦИЙ Leroy999 WordPress и другие CMS 0 22.10.2011 20:06
Вычисление позиций IraPr Microsoft Office Access 4 23.08.2010 20:15
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58