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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2010, 22:45   #1
Goose
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 4
По умолчанию Удаление последнего элемента из списка и реверс этого списка.

Разработать подалгоритм вывода односвязного списка в прямом или обратном направлении по желанию пользователя с одновременным удалением последнего выводимого на экран элемента.

вот задание а как удалить последний элемент из списка и сделать реверс не знаю.
Код:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>

#define SCREEN_WIDTH 80
#define ENTER 13


//---------------------------------------------------------------------
struct weight {
			int weight;
			struct weight *pc;

			};
//---------------------------------------------------------------------
//void del_last (void);
int sravnenie(char *mass);
void output (void);
void io_menu (void);
void input (void);


void main (void)
{
	int i,l,x,m;
	int True;
	True=1;

	int *t;

	char Teckcommand[81];
	clrscr();

	for(i=0;i<SCREEN_WIDTH;i++)
		printf("*");

	printf("\t\t\t\tInput/Output message\n");

	for(i=0;i<SCREEN_WIDTH;i++)
		printf("*");

	i=0;

	puts("Write help for more information");
	puts("Input commands please...");

	do
	{
		Teckcommand[i]=getch();
		printf("%c", Teckcommand[i]);

		if (Teckcommand[i]==ENTER)
		{
			Teckcommand[i]='\0';
			l=sravnenie(Teckcommand);
			switch (l)
			{
				case 1: True=0; break;

				case 2:
						puts("-------------------");
						puts("input - vvesti spisok");
						puts("output - vyvesti spidok");
						puts("exit - vyhod iz programmy");
						puts("--------------------");
						break;

				case 3: input();
						puts("-----------------------");
						puts("Oformlenie vvoda spiska");
						puts("-----------------------");

						struct weight *rex;
						struct weight *beg=NULL;
						struct weight *end=NULL;

						printf("Vvedite znachenia structur");
						do
						{
							rex=(struct weight*)malloc(sizeof(struct weight));

							printf("\nweight=");
							scanf("%d",&rex->weight);

							if (rex->weight==0)
							{
								free(rex);
								break;
							}

							if ((beg==NULL)&(end==NULL))
								beg=rex;
							else
								end->pc=rex;

							end=rex;
							end->pc=NULL;
						}
						while(1);
						break;

				case 4: io_menu();
						output();
                        scanf("%d",&l);

						switch(l)
						{
						case 1 :

									puts("Soderjimoe spiska");











									rex=beg;
									while(rex!=NULL)
									{
										printf("\n weight=%d" ,rex->weight);
										rex=rex->pc;

									}

									break;

						 case 2 :
									puts("Soderjimoe spiska");








						}
			}
			i=0;
		}
		else
			i++;
	}
	while(True);

}
//---------------------------------------------------------------------

int sravnenie(char *mass)
{
	if (!strcmp(mass,"help"))
		return 2;
	if (!strcmp(mass,"input"))
		return 3;
	if (!strcmp(mass,"output"))
		return 4;
	if (!strcmp(mass,"exit"))
		return 1;
	puts("bad command");

return 0;
}

//---------------------------------------------------------------------

void io_menu (void)
{
	puts("1.Vyvesti v priamom");
	puts("2.Vyvesti v obratnom");



}
//------------------------------------------------------
//------------------------------------------------------
void input (void)  // vvod spiska
{





}

//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void output (void)
{

	/*

	puts("Soderjimoe spiska");
	rex=beg;
	while(rex!=NULL)
	{
		printf("\n sign=%s\t weight=%d" , rex->sign ,rex->weight);
		rex=rex->pc;

	}
	*/
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void dell_last (void)
{





}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
Goose вне форума Ответить с цитированием
Старый 15.05.2010, 00:37   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Goose Посмотреть сообщение
вот задание а как удалить последний элемент из списка и сделать реверс не знаю.
Думаю вам имеет смысл почитать больше о списках в принципе, так как даже ввода списка я у вас не заметил, в выводе какой-то код, по-видимому из чужой программы, использующий переменные, которых у вас нет. Даже список описан неправильно. Раз по заданию требуется делать реверс списка, то очевидно, что он (список) должен быть двусвязным, а у вас односвязный. В общем читайте теорию, в гугл можно найти готовые реализации и разобрать их.
netrino вне форума Ответить с цитированием
Старый 15.05.2010, 11:43   #3
Goose
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 4
По умолчанию

Задание связано с односвязным списком а не двусвязном.

У меня ввод списка и вывод введнног списка оформленно все в главной функции чтоб не накосячить еще с аргументами.
Goose вне форума Ответить с цитированием
Старый 15.05.2010, 12:10   #4
miftayka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 17
По умолчанию реверс

Как-то так. Давно было написано.
Код:
void invert(weight *&beg, weight *&end)
{
	if (!beg)
		printf("\nThe list is empty.\n");
	else if(!beg->next)
		printf("\nThe list consist of just one element.\n");
	else
	{
		weight *p=beg;
                end = beg;
		beg=p->pc;
		weight *r;
		r=beg->pc;
		beg->pc=p;
		p->pc=0;
		while (r)
		{
			p=r;
			r=r->pc;
			p->pc=beg;
			beg=p;
		}
		printf("\nThe list was inverted.\n");
	}
}
miftayka вне форума Ответить с цитированием
Старый 15.05.2010, 12:19   #5
miftayka
Пользователь
 
Регистрация: 09.05.2010
Сообщений: 17
По умолчанию удаление последнего

тоже что-то вроде того
Код:
if (beg==0) printf("список пуст");
else if (beg->pc==0) delete beg;
else { 
  weight *p=beg;
  while (p->pc->pc) p=p->pc;
  end = p;
  delete p->pc;
  end->pc=0;
}
miftayka вне форума Ответить с цитированием
Старый 15.05.2010, 12:23   #6
Goose
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 4
По умолчанию

Спасибо сегодня вечером сяду за изучение)
Goose вне форума Ответить с цитированием
Старый 15.05.2010, 13:42   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Goose Посмотреть сообщение
У меня ввод списка и вывод введнног списка оформленно все в главной функции чтоб не накосячить еще с аргументами.
Пардон, не обратил внимания. И про реверс я глупость написал )
netrino вне форума Ответить с цитированием
Старый 16.05.2010, 15:44   #8
Goose
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 4
По умолчанию

delete - это что за фунция ? она где находится?
чет я этого не знаю либо туплю сильно
Goose вне форума Ответить с цитированием
Старый 16.05.2010, 16:12   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

delete - это оператор C++, он освобождает выделенную память. В C его нет, используйте вместо него ф-цию free
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки. Удаление элемента из списка. thexqn Помощь студентам 0 11.05.2010 09:04
удаление элемента из списка yagluboko Помощь студентам 1 10.04.2010 14:54
Турбо Паскаль 7.0 Удаление из списка элемента sir.andrey Помощь студентам 12 02.03.2010 17:08
удаление элемента из списка aurora_87 Общие вопросы C/C++ 1 18.06.2009 14:02