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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2014, 13:38   #1
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию (c++) однонаправленный список

Здравствуйте. Не получается реализовать функцию удаления выбранного элемента из однонаправленного списка. Работает не так, как нужно. Нужна ваша помощь:
Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
using namespace std;

int x;  //кол-во элементов

struct spis
{
	int ch;
	spis *next;
};
spis *make_spis ()   //создание списка
{
	spis *P, *l, *top;
	int n;
	cout << "Введите количество вводимых элементов: ";
	cin >> x;
	for (int i=0; i<x; i++)
	{
		if (i == 0)
		{
			P = new spis;
			cout << "\nвведите " << 1 << " элемент списка: ";
			cin >> n;
			P->ch = n;
			P->next = NULL;
			top = P;
			continue;
		}
		cout << "\nвведите " << i+1 << " элемент списка: ";
		cin >> n;
		l = new spis;
		l->ch = n;
		l->next = NULL;
		P->next = l;
		P = l;
	}
	return top;
}

void vivod_spis (spis *s)   //вывод списка
{
if (s == NULL)
{
	cout << "список пуст";
	getch();
	return;
}
spis *P = s;
while(P != NULL)
{
	cout << P->ch << " ";
	P = P->next;
}
getch();
}

void del_el (spis *s)  //удаление элемента
{
	int m;
	spis *P;
	P = s;
	cout << "Введите номер элемента, который следует удалить: ";
	cin >> m;
	if( m <= x)
	{
	 for (int i=0; i<=m-2; i++)
	 {
		 P = P->next;
		 if(i == m-2)
			 P->next = P->next->next;
	 }
	}
	else
		cout << "ошибка";
}


void main ()
{
	setlocale (0, "");
	int n;
	spis *s = NULL;
	while (true)
{
	cout << "1. Создать список\n";
	cout << "2. Вывести список\n";
	cout << "3. Добавить элемент\n";
	cout << "4. Удалить элемент\n";
	cout << "5. Сохранить\n";
	cout << "6. Загрузить\n";
	cout << "7. Выход\n";
	cout << "Выберите пункт меню:\n";
	cin >> n;
	switch (n)
	{
	case 1:  s = make_spis(); break;
	case 2:  vivod_spis (s); break;
	case 3:  break;
	case 4:  del_el (s); break;
	case 5:  break;
	case 6:  break;
	case 7: return ; 
	};
	system ("cls");
}
	system ("pause");
}

Последний раз редактировалось Stilet; 25.05.2014 в 13:33.
Uefa вне форума Ответить с цитированием
Старый 24.05.2014, 14:28   #2
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Все, разобрался сам.
Uefa вне форума Ответить с цитированием
Старый 24.05.2014, 18:35   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Интересно, поделитесь.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 25.05.2014, 13:23   #4
Uefa
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 59
По умолчанию

Код:
spis *del_el (spis *s)  //удаление элемента
{
	int m;
	spis *P;
	P = s;
	cout << "Введите номер элемента, который следует удалить (от 0 до " << x << "): ";
	cin >> m;
	if( m <= x)      //если введенное число меньше количества элементов в массиве
	{
		if (m == 0)         //если удалить первый элемент
		{
			s = s->next;
			x--;
			return s;
		}
		else
			if (m == 1)         //если удалить второй элемент
			{
				s->next = s->next->next;
				x--;
				return s;
			}
			else                               //если удалить последующие элементы
			    for (int i=0; i<=m-2; i++)   
			        {
			        	P = P->next;     //переходим в элемент, стоящий в списке перед удаляемым
			        	if(i == m-2)     //когда перешли
						{
							P->next = P->next->next;     //меняем указатель next на элемент, стоящий после удаляемого
							x--;                     //уменьшаем кол-во элементов в списке
						}
			        }
	}
	else
		cout << "ошибка";
	return s;
}

Последний раз редактировалось Stilet; 25.05.2014 в 13:34.
Uefa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленный список Мулли C++ Builder 1 28.03.2014 19:32
Однонаправленный список Си nikitasnv Помощь студентам 6 02.07.2012 21:13
однонаправленный список Arthur92 Общие вопросы C/C++ 5 03.07.2011 20:51
однонаправленный список Nata-Tata Помощь студентам 3 14.04.2011 11:28
[C] Однонаправленный список ordoss Помощь студентам 8 30.01.2010 14:43