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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2011, 22:21   #1
soirkar
Пользователь
 
Регистрация: 21.06.2011
Сообщений: 13
По умолчанию Работа со списком

Нужно найденный товар пихнуть вверх двусвязного списка, а остальные элементы должны съехать вниз. Как это осуществить? Не понимаю как работать с двусвязными списками. Если можно, то поясните код на пальцах.

Код:
puts("\tВведите код товара для поиска: ");
scanf("%s",&code);

while (p != NULL)
{
if(strcmp(p->code, code)==0)
{
system("CLS");
puts("\n\tЗАПИСЬ НАЙДЕНА...\n");
puts("\n\tКод товара\tНаименование\tКоличество\tЦена");
printf("\t%s",p->code);
printf("\t%15s",p->name);
printf("\t\t%d",p->quant);
printf("\t\t%d",p->price);
printf("\n\n");
soirkar вне форума Ответить с цитированием
Старый 20.07.2011, 05:06   #2
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Е-мое, printf и puts в C++? strcmp? Это точно не чистый C?
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 20.07.2011, 07:59   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как это осуществить?
Показывай структуру элемента списка.
Цитата:
Если можно, то поясните код на пальцах.
Каждому элменту дописывают два поля: Указатели на следующий элемент и предидущий.
Если нужно перецепить то просто меняют эти поля

ВременнаяПеременка=Текущий элемент.Следующий
Текущий элемент.Следующий=ПервыйЭлемент.Сле дующий
ПервыйЭлемент.Предидущий=Текущий элемент.Предидущий
Текущий элемент.Предидущий=0;
ПервыйЭлемент.Следующий=ВременнаяПе ременка
Текущий элемент.Следующий.Предидущий=Текущи й элемент
ПервыйЭлемент.Следующий.Предидущий= ПервыйЭлемент
ПервыйЭлемент.Предидущий.Следующий= ПервыйЭлемент

ПервыйЭлемент=Текущий элемент

Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.07.2011, 08:22   #4
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Stilet, не осилил ваш псевдокод. Как-то все мудрено. Автору задано добавить элемент в начало списка. Как я понял, старые указатели на начало должны остаться актуальными. Так что я предлагаю добавить элемент в начало, а потом поменять местами "старый первый" и "новый первый"
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 20.07.2011, 09:14   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Е-мое, printf и puts в C++? strcmp? Это точно не чистый C?
О да, это самый что ни на есть чистый Си.
ds.Dante вне форума Ответить с цитированием
Старый 20.07.2011, 09:37   #6
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
О да, это самый что ни на есть чистый Си.
Если это был сарказм - то вообще-то я знаю, что на C++ этот код работает, но возможно автор просто ошибся разделом, а мы можем ему напредлагать решений из STL.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 20.07.2011, 09:58   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
Если это был сарказм - то вообще-то я знаю, что на C++ этот код работает, но возможно автор просто ошибся разделом, а мы можем ему напредлагать решений из STL.
Полагаю, автор пишет в MS VS на Си, потому и отпостил в этой теме. Хотя, возможно, и на плюсах. А вообще действительно не вполне понятно - нужно автору сделать в Си собственную реализацию списка или использовать STL'евские контейнеры. К чему, собственно, и был вопрос.

Если нужен свой список, то выглядеть это будет примерно так:
Код:
struct Node
 {
 struct Node* next;
 struct Node* prev;
 int value;
 };

struct List
 {
 struct Node* top;
 struct Node* bottom;
 };
Функция помещения в начало списка - создаем новый узел, в него передаем значение хранящегося элемента. Элементу prev нового узла присваиваем 0 (нет у него предшественников, он щас будет на верхушке), элементу next - текущий top. Нынешнему узлу top присваиваем элементу prev значение указателя на новый узел. А указателю top - указатель на новый узел.
Ну и еще надо сделать проверку, не пуст ли список - не нулевые ли у него top (bottom тоже тогда будет нулевым, к слову). Если пуст - присваиваем top и bottom указатель на новый узел, а его prev и next делаем нулями.
Как-то так. Дальше попробуйте сами.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 20.07.2011, 10:27   #8
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Если это был сарказм - то вообще-то я знаю, что на C++ этот код работает.
Я буквально имел в виду, что это чистый Си. Только для него на форуме нет специального раздела.
ds.Dante вне форума Ответить с цитированием
Старый 20.07.2011, 10:41   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от ds.Dante Посмотреть сообщение
Только для него на форуме нет специального раздела.

"Общие вопросы C/C++" чем не подходит?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 20.07.2011, 16:48   #10
soirkar
Пользователь
 
Регистрация: 21.06.2011
Сообщений: 13
По умолчанию

Пишу на c++. Как поставить элемент на первое место все-равно не понял, перепробовал кучу вариантов. Гаданием больше заниматься не могу, напишите, пожалуйста, для моего куска кода, как это осуществить, если можно с комментариями.
Цитата:
Показывай структуру элемента списка.
Код:
struct goods
{
	int quant;
	char name[128];
	char code[5];
	int price;
	goods * next;
	goods * last;
};

void add(goods *&head, goods *&tail, goods *p)
{
	p->next=NULL;
	p->last=tail;
	if (head == NULL) head=p;
	else tail->next=p;
	tail=p;
}

void main()
{
	int action=0;
	int size;
	goods * head=NULL;
	goods * tail=NULL;
	setlocale(LC_ALL, "russian");

	FILE * fo;
	goods * p;

	fo=fopen("Список.txt","r");
	if(fo != NULL)
{
	fscanf( fo,"\t%d",&size);
	if(size != 0)
{
	for(int i=0; i<size; i++)
{
	p=new goods;
	fscanf(fo,"\n%[^\t]s", p->code);
	fscanf(fo,"\t%s", &p->name);
	fscanf(fo,"\t%d", &p->price);
	fscanf(fo,"\t%d", &p->quant);
	add(head, tail, p);
}
}
fclose(fo);
}

while (true)
{ 
system("CLS");
puts("\t1. Для Добавления Записи\n");
puts("\t2. Для Поиска По Коду Товара\n");

scanf("%d",&action);
system("CLS");

if (action == 1)
{
p=new goods;
puts("\tВведите код товара: ");
scanf("%s",p->code);
puts("\tВведите наименование товара: ");
fflush(stdin);
scanf("%[^\n]s",p->name);
puts("\tВведите количество товара: ");
scanf("%d",&p->quant);
puts("\tВведте цену товара: ");
scanf("%d",&p->price);
add(head, tail, p);
}

else if (action == 2)
{
if (head == NULL)
{
puts("\tСПИСОК ПУСТ...\n\n");
}
else if (head != NULL)
{
char code[5];
p=head;
puts("\tВведите код товара для поиска: ");
scanf("%s",&code);

while (p != NULL)
{
if(strcmp(p->code, code)==0)
{
system("CLS");
puts("\n\tЗАПИСЬ НАЙДЕНА...\n");
puts("\n\tКод товара\tНаименование\tКоличество\tЦена");
printf("\t%s",p->code);
printf("\t%15s",p->name);
printf("\t\t%d",p->quant);
printf("\t\t%d",p->price);
printf("\n\n");

break;
}
soirkar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с списком soirkar Visual C++ 0 28.06.2011 16:29
работа с динамическим списком Medik07 Общие вопросы C/C++ 2 08.03.2011 20:54
Работа со списком Delphi novi4ok_Delphi Помощь студентам 3 11.03.2010 15:28