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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2015, 17:48   #1
Александр Шатило
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 29
Сообщение Списки

Написать функцию удаления N последних элементов списка
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

struct Adr
{
	char name[30]; 
	char street[40];
	char city[20];
	struct Adr *next;
	struct Adr *prev;
};

struct Adr *head; 
struct Adr *last;

int Menu(void)
{
	char s[80];   
	int c;
	cout << endl;
	cout << "1. Ввод имени" << endl;
	cout << "2. Удаление имени" << endl;
	cout << "3. Вывод списка на экран" << endl;
	cout << "4. Поиск" << endl;
	cout << "5. Сохранить в файл" << endl;
	cout << "6. Загрузить из файла" << endl;
	cout << "7. Удалить последние k элементы";
	cout << "8. Выход" << endl; 
	cout << endl;
	do
	{
		cout << "Ваш выбор: "; 
		gets_s(s);  
		cout << endl;
		c = atoi(s);
	} 
	while (c<0 || c>8);
	return c;
}

void Sozdat(Adr *i, Adr **head, Adr **last)
{
	struct Adr *old, *p;
	if (*last == NULL)
	{
		i->next = NULL; 
		i->prev = NULL;
		*last = i;  
		*head = i;
		return;
	}
	p = *head;
	old = NULL;
	while (p)
	{
		if (strcmp(p->name, i->name)<0)
		{
			old = p; 
			p = p->next;
		}
		else
		{
			if (p->prev)
			{
				p->prev->next = i; 
				i->next = p;
				i->prev = p->prev;  
				p->prev = i;
				return;
			}
			i->next = p; 
			i->prev = NULL;
			p->prev = i; 
			*head = i;
			return;
		}
	}
	old->next = i;
	i->next = NULL;  
	i->prev = old;
	*last = i;
}

void Vvod(char *prompt, char *s, int count)
{
	char p[255];
	do
	{
		cout << (prompt); 
		fgets(p, 254, stdin);
		if (strlen(p) > count) cout << ("Слишком длинная строка");
	} 
	while (strlen(p) > count);
	p[strlen(p) - 1] = 0;
	strcpy(s, p);
}

void VvodSp(void)     
{
	struct Adr *t; 
	int i;
	t = new (struct Adr);
	if (!t) 
	{ 
		cout << ("Нет свободной памяти"); return; 
	}
	Vvod("Введите имя: ", t->name, 30);
	Vvod("Введите улицу: ", t->street, 40);
	Vvod("Введите город: ", t->city, 20);
	Sozdat(t, &head, &last);
}

void VyvodSp(void)     
{
	struct Adr *t;  
	t = head;
	while (t)
	{
		cout << t->name << ' ' << t->street << ' ' << t->city << endl; 
		t = t->next;
	}  
	cout << "" << endl;
}	

void Poisk(void) 
{
	char name[40];  
	struct Adr *t;  
	t = head;
	cout << "Введите имя: "; 
	gets(name);
	while (t)
	{
		if (!strcmp(name, t->name)) break;
		t = t->next;
	}
	if (!t) cout << "Имя не найдено" << endl;
	else cout << t->name << ' ' << t->street << ' ' << t->city << endl;
}

void Udalit(Adr **head, Adr **last)
{
	struct Adr *t; 
	char name[40];
	t = *head;
	cout << "Введите имя: ";
	gets(name);
	while (t)
	{
		if (!strcmp(name, t->name)) break;
		t = t->next;
	}
	if (t)
	{
		if (*head == t)
		{
			*head = t->next;
			if (*head) (*head)->prev = NULL;
			else *last = NULL;
		}
		else 
		{
			t->prev->next = t->next;
			if (t != *last) t->next->prev = t->prev;
			else  *last = t->prev;
		}
		delete t;
	}
}

/*bool DeleteKLast(Adr* t)
{
	if (t != NULL)
	{
		if (t->next != NULL) t->next->prev = t->prev;
		if (t->prev != NULL) t->prev->next = t->next;
		else
		{
			head = t->next;
			head->prev = NULL;
		}
		delete t;
		return true;
	}
	else
		return false;
}*/

void Zapisat(void)       
{
	struct Adr *t; 
	FILE *fp;
	fp = fopen("mlist", "wb");
	if (!fp)
	{ 
		cout << "Файл не открывается" << endl;  exit(1);
	}
	cout << "Сохранение в файл" << endl;
	t = head;
	while (t) 
	{
		fwrite(t, sizeof(struct Adr), 1, fp);
		t = t->next;
	}      
	fclose(fp);
}

void Schitat()          
{
	struct Adr *t; 
	FILE *fp;
	fp = fopen("mlist", "rb");
	if (!fp)
	{ 
		cout << "Файл не открывается" << endl; 
		exit(1); 
	}
	while (head)
	{
		last = head->next; 
		delete head;
		head = last;
	}   head = last = NULL;
	cout << "Загрузка из файла" << endl;
	while (!feof(fp))
	{
		t = new (struct Adr);
		if (!t) 
		{
			cout << "Нет свободной памяти" << endl; 
			return; 
		}
		if (1 != fread(t, sizeof(struct Adr), 1, fp)) break;	
		Sozdat(t, &head, &last);
	}
	fclose(fp);
}

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_CTYPE, "Rus");
	head = last = NULL;
	for (;;)
	{
		switch (Menu())
		{
		case 1: VvodSp();  break;
		case 2: Udalit(&head, &last); break;
		case 3: VyvodSp(); break;
		case 4: Poisk();   break;
		case 5: Zapisat(); break;
		case 6: Schitat(); break;
		//case 7: DeleteKLast(); break;
		case 8: exit(0);
		}
	}   return 0;
	return 0;
}
Тишка

Последний раз редактировалось Stilet; 13.04.2015 в 17:56.
Александр Шатило вне форума Ответить с цитированием
Старый 13.04.2015, 17:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну... И...?
Что в коде не устраивает?
Не стесняйся, рассказывай
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2015, 17:59   #3
Александр Шатило
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 29
По умолчанию

мне нужно удалить N последних элементов списка, а у меня удаление по имени и первого элемента
Тишка
Александр Шатило вне форума Ответить с цитированием
Старый 13.04.2015, 18:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мдя... Ладно, я понял )
Код:
void Udalyavka(Adr *ahead,int n){
 Adr *i=ahead;
 for(;i->next;i=i->next); //Добираемся до конца списка
 for(;i->prev && n;n--){ //Начинаем с конца возвращаться назад
   i=i->prev;
   free(i->next); //Освобождая города от захватчиков
   i->next=NULL;
 }
}
Такое устроит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2015, 18:43   #5
Александр Шатило
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 29
По умолчанию

а можно функцию с вызовом одного параметра т.е. N
Тишка
Александр Шатило вне форума Ответить с цитированием
Старый 13.04.2015, 18:51   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты у меня разрешения просишь? )
Ну ладно, разрешаю )))
Не передавай параметром голову, а сразу подставь head как начальное значение i.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2015, 19:00   #7
Александр Шатило
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 29
Сообщение

я уже так и сделал, спасибо большое)
Тишка
Александр Шатило вне форума Ответить с цитированием
Старый 13.04.2015, 19:18   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вотъ Пропало благословение. Кануло в тарътаръ...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Списки sir.andrey Помощь студентам 17 12.07.2011 14:28
(C++) списки Troi666 Помощь студентам 6 13.05.2009 00:47
Списки C++ Katya Melody Помощь студентам 0 07.05.2009 23:32
Списки? Chainic Microsoft Office Excel 13 06.05.2009 22:53