SamForum.org  
SamLab.ws
Заблокированные пользователи

Вернуться   SamForum.org > Программирование > С
Важная информация

Ответ
 
Опции темы Опции просмотра
Примерчики
Старый Добавлено: 27.05.2007, 11:03
  (#1)
Romantic
TranceSmile
Заслуженный пользователь
 
Аватар для Romantic

По умолчанию Примерчики

Вот пример первой проги на С++, "Hello word".
Код:
#include <iostream.h>
int main()
{
      cout << "Hello Word";
      return 0;
}


Сегодня сижу за компом... Из старой пластмассовой компьютерной колонки вылез паук, посмотрел по сторонам и обратно уполз в колонку... Первая мысль - Доктор Веб...обновления проверял...))
Я веду себя как положено, а положено у меня на все....
Жизнь нужно прожить так, чтобы было приятно вспомнить, но стыдно рассказать детям...
Пишу на С++ за еду...
Romantic вне форума Отправить личное сообщение для Romantic
Вверх
Ответить с цитированием
Эти 2 пользователя(ей) сказали cпасибо за это полезное сообщение:
Sanek (14.07.2008)
Старый Добавлено: 13.03.2008, 14:20
  (#21)
Reset
Заслуженный
Заслуженный пользователь
 
Аватар для Reset

Смех

делаем сложение двух сумм:

Код:
// Запрашиваем и складываем две суммы выводя формулу и результат.
//
// Используем <iostream> или <iostream.h> в зависимости от используемого компилятора.
//

#include <iostream> 
using namespace std;

int main() {
	//Создаем необходимые переменные с плавающей точкой
	double atemp, btemp, ctemp;
	//Приветствуем посетителя
	cout << "Wellkome! << endl;
	// Просим вставить первое число
	cout << "Input 1 numm and press ENTER: ";
	// Получаем данные от ввода и помещаем их в переменную atemp 
	cin >> atemp;
	// Просим вставить второе число
	cout << "Input 2 numm and press ENTER: ";
	// Получаем данные от ввода и помещаем их в переменную btemp 
	cin >> atemp;
	// Запускаем формулу сложения и помещаем её в переменную 	
	//ctemp
	ctemp = (atemp + btemp);
	// выводим на экран введенные цифры и результат
	cout << atemp << " + " << btemp << " = " << ctemp << endl;
	cout << "End Summary" << endl;

	//Ставим паузу чтоб окно не хахлопывалось само - работает не всегда
	getch();

	// Обозначаем конец успешного выполнения программы.
	return 0; 
}
Вот такой кодец... проверяем...

Зы комментарии к коду - это хороший тон в программинге, во первых самим легче будет разобраться, а в случае оптимизации или отладки поможет найти глюки...

пробуем код и отписываемся...
Reset вне форума
Вверх
Ответить с цитированием
Старый Добавлено: 17.03.2008, 12:17
  (#22)
blameage
Гость
 
Аватар для blameage

По умолчанию

Цитата:
Сообщение от Reset Посмотреть сообщение
делаем сложение двух сумм:

Код:
// Запрашиваем и складываем две суммы выводя формулу и результат.
//
// Используем <iostream> или <iostream.h> в зависимости от используемого компилятора.
//

#include <iostream> 
using namespace std;

int main() {
	//Создаем необходимые переменные с плавающей точкой
	double atemp, btemp, ctemp;
	//Приветствуем посетителя
	cout << "Wellkome! << endl;
	// Просим вставить первое число
	cout << "Input 1 numm and press ENTER: ";
	// Получаем данные от ввода и помещаем их в переменную atemp 
	cin >> atemp;
	// Просим вставить второе число
	cout << "Input 2 numm and press ENTER: ";
	// Получаем данные от ввода и помещаем их в переменную btemp 
	cin >> atemp;
	// Запускаем формулу сложения и помещаем её в переменную 	
	//ctemp
	ctemp = (atemp + btemp);
	// выводим на экран введенные цифры и результат
	cout << atemp << " + " << btemp << " = " << ctemp << endl;
	cout << "End Summary" << endl;

	//Ставим паузу чтоб окно не хахлопывалось само - работает не всегда
	getch();

	// Обозначаем конец успешного выполнения программы.
	return 0; 
}
Вот такой кодец... проверяем...

Зы комментарии к коду - это хороший тон в программинге, во первых самим легче будет разобраться, а в случае оптимизации или отладки поможет найти глюки...

пробуем код и отписываемся...

Еще одна бессмысленная программа. Кстати такие комментарии плохой тон. Комментировать очевидные вещи только нагромождает программу и кстати затрудняет чтение кода и отладку. Такой пример будет хорош в качестве первой программе для книги С++ для начинающих или что-то в этом роде.
Код с понятными именами переменных и функций, без вычурных конструкций, и краткие понятные комментарии - вот хороший тон.

Хотя если честно для некоторых преподов я комментирую исходники даже похлеще, вставлая анекдоты, случаи из жизни, цитаты. Чтобы потом в графе хорошие комментарии он мне не снимал баллы.
Вверх
Ответить с цитированием
Старый Добавлено: 18.03.2008, 16:34
  (#23)
Reset
Заслуженный
Заслуженный пользователь
 
Аватар для Reset

По умолчанию

ну так это и есть примерчик для соовсем начинающих... насчет его бессмысленности - эт само собой. виндовый calc.exe все одно лучше будет...
но эт примерчик приведен только в качестве примера...
а насчет комментов - думаю они все таки не помешают начинающим... ну а из конечной проги перед компиляцией можно и вычистить их напрочь...
Reset вне форума
Вверх
Ответить с цитированием
Старый Добавлено: 23.03.2008, 01:04
  (#24)
DefiToR
Гость
 
Аватар для DefiToR

По умолчанию

вот примерчик - программа подсчитывает и показывает N-ную строчку из треугольника Паскаля (т.е. коэффициенты для разложенного на слагаемые выражения (a+b)^N ):

Код:
#include <iostream>
#include <vector>

using std::vector;
using std::cout;
using std::cin;
using std::endl;

int main() {
   while(1) {
      cout << "Enter power (or row number in Pascal triangle): ";
      int n;
      cin >> n;
      vector<int> coefArr(n+1); // заполнена нулями по умолчанию
      coefArr[0] = coefArr[1] = 1;

      int tmpSize = 3;
      for(int i = n - 1; --i >= 0; tmpSize++) {
         for(int k = tmpSize; --k > 0;) {
            coefArr[k] += coefArr[k-1];
         }
      }

      for (int i = n + 1; --i > 0;) {
         cout << coefArr[i] << " ";
      }
      cout << coefArr[0] << endl;

      cout << "One more time? Yes(y) or No(n): ";
      char ch;
      cin >> ch;
      if (ch == 'y' || ch == 'Y')
         continue;
      else
         break;
   }
Вверх
Ответить с цитированием
Старый Добавлено: 07.07.2008, 13:00
  (#25)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Еще примерчик: программа подсчитывает x^k. Используется свойство степеней (a^(k + n) = a^k * a ^n) и представления чисел в компьютере.

Код:
#include <iostream>
using namespace std;

// Функция возвращает результат возведения x в k-ую степень за O(log(k))
int power(int x, int k)
{
	int a = 1;
	for (; k; k >>= 1)
	{
		if (k & 1)
			a *= x;
		x *= x;
	}
	return a;
}

int main()
{
	for (;;) //То же самое, что и while (1)
	{
		int x, k;
		cout << "Enter x: ";
		cin >> x;

		cout << "Enter power: ";
		cin >> k;

		cout << "Answer: " << power(x, k) << '\n';

		char ch;
		cout << "One more time? Yes(y) or No(n): ";
		cin >> ch;
		if (ch == 'y' || ch == 'Y')
			continue;
		else
			break;
	}
	return 0;
}
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Старый Добавлено: 07.07.2008, 14:34
  (#26)
Ander8
Наблюдающий
Пользователь
 
Аватар для Ander8

По умолчанию

Классная тема, но, я как новичек, хочу у вас спросить:
1) Какой компилятор надо для ВыньХР и для Линукс
2) Посоветуйте хороший учебник по программированию и по Си/Си++
Ander8 вне форума Отправить личное сообщение для Ander8
Вверх
Ответить с цитированием
Старый Добавлено: 08.07.2008, 10:14
  (#27)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Цитата:
Классная тема, но, я как новичек, хочу у вас спросить:
1) Какой компилятор надо для ВыньХР и для Линукс
2) Посоветуйте хороший учебник по программированию и по Си/Си++

1) для WinXP - Compiler C++ (Этот компилятор точно есть в MS Visual Studio) или Intel Compiler C++.
для Линукс - GNUC.
2) Учебники по программированию - Кормен "Алгоритмы: построение и анализ"; Кнут "Искусство программирования".
по Си/Си++ - MSDN.
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Этот пользователь сказал cпасибо за это полезное сообщение:
Sanek (26.08.2008)
Старый Добавлено: 11.07.2008, 02:43
  (#28)
JIexa
Гость
 
Аватар для JIexa

По умолчанию

Не буду новую тему создавать, может тут ответите. Вобщем поставил себе БДС2006, начал изучать с++. Решил сделать элементарную программу - часы. Значит в форму поставил Label, поставил Timer. Таймер срабатывает раз в секунду и обновляет поле Label текущим временем:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1 ->Caption = Time();
}
Компилирую - все работает, запускается, время рисует, все зашибись. Ну ес-но первая мысль была кому-нибудь это показать. Скинул соседу, а у него не запускается. Явно нужны какие-нибудь длл. В связи с чем вопрос - как собрать все используемые длл чтобы работало не только у меня? В меню builder ничего подобного не нашел.
Вверх
Ответить с цитированием
Старый Добавлено: 13.07.2008, 13:56
  (#29)
AnriRS
Наблюдающий
Пользователь
 
Аватар для AnriRS

По умолчанию

2 JIexa:
Мне кажется правильнее так:
Label1->Caption= TimeToStr(Time());

Проверь в Project|Options галку Build with runtime options
AnriRS вне форума Отправить личное сообщение для AnriRS
Вверх
Ответить с цитированием
Старый Добавлено: 13.07.2008, 18:00
  (#30)
JIexa
Гость
 
Аватар для JIexa

По умолчанию

Цитата:
Сообщение от AnriRS Посмотреть сообщение
2 JIexa:
Мне кажется правильнее так:
Label1->Caption= TimeToStr(Time());

Проверь в Project|Options галку Build with runtime options

Ну как я написал, так и скопировал прям из проекта - все работает.

А вот такую опцию найти не могу.
Вверх
Ответить с цитированием
Старый Добавлено: 05.12.2008, 17:15
  (#31)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Вот еще класный примерчик, как помять переменые местами, без использования дополнительной памяти.
Код:
#include <stdio.h>

void swap(int &x, int &y)
{
	x ^= y;
	y ^= x;
	x ^= y;
}

int main()
{
	int x, y;
	scanf("%d %d", &x, &y);
	swap(x, y);
	printf("%d %d\n", x, y);
	return 0;
}
PS: не используйте этот пример, т.к. он работает слишком медлено. Лучше всего использовать std::swap(x, y);
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Старый Добавлено: 02.05.2009, 18:59
  (#32)
Romantic
TranceSmile
Заслуженный пользователь
 
Аватар для Romantic

По умолчанию

Может хто делал, когда нибудь лабу по с++ по теме "Двунаправленые списки"? Нужен исходник, обезательно с классом узлом, и классом списком, обезательно должен быть организован метод сортировки, методом вставки


Сегодня сижу за компом... Из старой пластмассовой компьютерной колонки вылез паук, посмотрел по сторонам и обратно уполз в колонку... Первая мысль - Доктор Веб...обновления проверял...))
Я веду себя как положено, а положено у меня на все....
Жизнь нужно прожить так, чтобы было приятно вспомнить, но стыдно рассказать детям...
Пишу на С++ за еду...
Romantic вне форума Отправить личное сообщение для Romantic
Вверх
Ответить с цитированием
Старый Добавлено: 06.05.2009, 16:00
  (#33)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Цитата:
Сообщение от Romantic Посмотреть сообщение
Может хто делал, когда нибудь лабу по с++ по теме "Двунаправленые списки"? Нужен исходник, обезательно с классом узлом, и классом списком, обезательно должен быть организован метод сортировки, методом вставки

Никогда не писал сортировку на списке (обычно я пользуюсь массивами и STL), но нашлось 30 минут свободного времени для этой задачи:
Код:
Код:
#include <queue>

struct Node
{
	int Value1;
	int Value2;

	bool operator < (const Node &a)
	{
		return Value1 < a.Value1 || (Value1 == a.Value1 && Value2 < a.Value2);
	}

	void operator = (const Node &a)
	{
		memcpy(this, &a, sizeof(a));
	}

	void print(const char *s)
	{
		printf("%sValue1 = %5d\n", s, Value1);
		printf("%sValue2 = %5d\n", s, Value2);
	}
};

struct List
{
	Node Value;
	List *next;
	List *pred;

	List()
	{
		memset(this, 0, sizeof(*this));
	}

	void push_back(const Node &newValue)
	{
		List *lpTemp  = new List;
		lpTemp->Value = newValue;
		lpTemp->next  = 0;

		if (pred)
		{
			lpTemp->pred = pred;
			pred->next   = lpTemp;
		}
		else
		{
			lpTemp->pred = this;
			next         = lpTemp;
		}
		pred = lpTemp;
	}

	void free()
	{
		List *lpTemp = next;
		List *lpDel;
		while (lpTemp)
		{
			lpDel  = lpTemp;
			lpTemp = lpTemp->next;
			delete lpDel;
		}
	}

	void insertion_sort()
	{
		for (List *lpList = next; lpList; lpList = lpList->next)
		{
			List *lpTemp = next;
			while (lpTemp->Value < lpList->Value)
			{
				lpTemp = lpTemp->next;
			}
			if (lpTemp != lpList)
			{
				List *lpSwap = lpList->pred;

				lpTemp->pred->next = lpList;
				lpList->pred->next = lpList->next;
				if (lpList->next)
					lpList->next->pred = lpList->pred;
				else
					pred = lpList->pred;
				lpList->pred       = lpTemp->pred;
				lpList->next       = lpTemp;
				lpTemp->pred       = lpList;

				lpList = lpSwap;
			}
		}
	}

	void print(const char *s1, const char *s2)
	{
		unsigned int i = 1;
		for (List *lpTemp = next; lpTemp; lpTemp = lpTemp->next, i++)
		{
			printf("%sNode No %u:\n", s1, i);
			lpTemp->Value.print(s2);
		}
		putchar('\n');
	}

};

List head;
Node node;

int main()
{
	for (int i = 0; i < 20; i++)
	{
		node.Value1 = rand() & 255;
		node.Value2 = rand() & 255;
		head.push_back(node);
	}

	puts("After:");
	head.print("\t", "\t\t");

	head.insertion_sort();

	puts("Before:");
	head.print("\t", "\t\t");
	
	head.free();

	return 0;
}
PS: написал структуры. Для классов просто меняем слово struct на class.
PSS: В классе List ничего менять не нужно (вроде бы он без багов). Изменения в классе Node переносят изменения и в List.


Помог, скажи спасибо

Последний раз редактировалось L.E.O.; 07.05.2009 в 06:08..
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Старый Добавлено: 29.05.2009, 18:24
  (#34)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Цитата:
Сообщение от AnderLP Посмотреть сообщение
У меня в курсаке есть такая задача: сделать программу для нахождение обратной матрицы

Обратная матрица:

Использую обычный метод Гаусса.
Код:
#include <stdio.h>
#include <memory>

typedef double TElem;

#define MAX_SZ 128

TElem a[MAX_SZ][MAX_SZ + 1];
TElem b[MAX_SZ][MAX_SZ + 1];

TElem inverse[MAX_SZ][MAX_SZ];

TElem sw[MAX_SZ + 1];
int n;

inline TElem abs(TElem x)
{
	return (x < 0) ? -x : x;
}

inline int Equal(TElem x)
{
	return abs(x) < 1e-9;
}

void ReadMatrix()
{
	memset(a, 0, sizeof(a));

	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%lf", &a[i][j]);
		}
	}
}

void swap(int x, int y)
{
	memcpy(sw,   a[y], sizeof(TElem) * (n + 1));
	memcpy(a[y], a[x], sizeof(TElem) * (n + 1));
	memcpy(a[x], sw,   sizeof(TElem) * (n + 1));
}

int Gauss(int inv)
{
	for (int i = 0; i < n; i++)
	{
		//Init
		if (Equal(a[i][i]))
		{
			int j = i + 1;
			while (Equal(a[j][i]))
			{
				j++;
				if (n <= j)
					return 1;
			}
			swap(i, j);
		}

		//Gaus
		for (int j = i + 1; j < n; j++)
		{
			TElem temp = a[j][i];
			a[j][i] = 0.0;
			for (int k = i + 1; k <= n; k++)
				a[j][k] = a[j][k] * a[i][i] - a[i][k] * temp;
		}
	}

	for (int i = n - 1; i >= 0; i--)
	{
		TElem temp = 0.0;
		for (int j = i + 1; j < n; j++)
			temp += inverse[j][inv] * a[i][j];
		inverse[i][inv] = (a[i][n] - temp) / a[i][i];
	}
	return 0;
}

int Inverse(void)
{
	memcpy(b, a, sizeof(a));
	for (int i = 0; i < n; i++)
	{
		memcpy(a, b, sizeof(a));
		a[i][n] = 1;
		if (Gauss(i))
			return 1;
		a[i][n] = 0;
	}
	return 0;
}

void WriteMatrix()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%9.4lf ", inverse[i][j]);
		}
		putchar('\n');
	}
}

int main()
{
	ReadMatrix();
	if (Inverse())
		puts("don't exist");
	else
		WriteMatrix();

	return 0;
}


Помог, скажи спасибо
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Старый Добавлено: 01.06.2009, 00:36
  (#35)
Хакер007
Пользователь
Пользователь
 
Аватар для Хакер007

По умолчанию

Цитата:
Сообщение от Mete0 Посмотреть сообщение
можно и так

Код:
#include <stdio.h>
main() {
printf("Hello world\n");
}

В таком случае, лучше и быстрее так

Код:
#include <stdio.h>
main() {
 puts("Hello world");
return 0;
}
Перевод строки ставится сам, а по скорости чуть быстрее )))


One Man Can Make a difference.
Один человек, может многое изменить!
Хакер007 вне форума Отправить личное сообщение для Хакер007
Вверх
Ответить с цитированием
Старый Добавлено: 18.01.2011, 17:24
  (#36)
pactok
Заблокирован
Заблокирован
 
Аватар для pactok

По умолчанию

Всем привет,Помогите с задачкой плз...косячит в с++ пишет кучу ошибок,но вроде всё верно
Вот Задание : Необходимо реализовать двусвязный список. В качестве информационной части выступают указатели на массивы строк. Необходимо реализовать следующие функции: добавление элементов в начало/конец массива, вывод конкатенации строк всех элементов на экран, удаление из списка памяти (включая информационную часть, поскольку она тоже определяется указателями).

а Вот Текст Программки -
[HIDE="Текст"]#ifndef list
#define list

typedef struct lplist{
char* str;
lplist* next;
lplist* previous;
} NODE;

void add(NODE*& first, NODE newItem);
void del(NODE*& first);
void output(NODE* first);
void flush(NODE*& first);
#endif
#include "stdafx.h"
#include <iostream>
#include "list.h"
using namespace std;


void add(NODE*& first, NODE Item){
if (first==NULL) {
first = new NODE;
first->str = Item.str;
first->next = NULL;
first->previous = NULL;

}
else {
NODE* p;
p = new NODE;
p->str = Item.str;
p->next = first;
first->previous = p;
first = p;
}


}

void addLast(NODE*& first, NODE Item) {

NODE q,p=First;
While(p->Next != NULL)
p = p->Next;
q=new Node;
q-> Item.str = Item.str;
p->Next=q;
q->Next = NULL;
}
void output(NODE*first){
while (first!=NULL)
{
cout<<first->str;
first=first->next;
}
}

void flush(NODE*& first){
while (first!=NULL)
{
NODE * prev = first;
first=first->next;
delete prev;
}
}

#include "stdafx.h"
#include <iostream>
#include "list.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
NODE * first = NULL;
NODE Mc, Mc1, Mc2;
Mc.str="Cat";
Mc1.str="Come";
Mc2.str="Home";
add(first, Mc);
add(first, Mc1);
add(first, Mc2);
output(first);
cout<<" ";
del(first);
output(first);
flush(first);
return 0;
}
[/HIDE]
pactok вне форума
Вверх
Ответить с цитированием
Старый Добавлено: 19.01.2011, 11:38
  (#37)
L.E.O.
Пользователь
Пользователь
 
Аватар для L.E.O.

По умолчанию

Цитата:
Сообщение от pactok Посмотреть сообщение
Всем привет,Помогите с задачкой плз...косячит в с++ пишет кучу ошибок,но вроде всё верно
Вот Задание : Необходимо реализовать двусвязный список. В качестве информационной части выступают указатели на массивы строк. Необходимо реализовать следующие функции: добавление элементов в начало/конец массива, вывод конкатенации строк всех элементов на экран, удаление из списка памяти (включая информационную часть, поскольку она тоже определяется указателями).

Вообще то, не совсем верно. Ошибок много. Начиная с того, что зарегистрированное слово "While" пишется строчными буквами (грубая ошибка) и заканчивая ошибками логики. Пропуская все мелкие ошибки (если нужно и такие ошибки прокомментирую), остановлюсь на ошибке логики в реализации двухсвязного списка:
1) Все реализации списка коректно делать с фиктивным головой и хвостом. В этом суть двухсвязного списка. В вашей реализации этого нет. Если вы не пишите фиктивные голову и хвост, то нет смысла делать его двухсвязным и уж тем более делать для него естественные функции, такие как добавление в начало и конец списка.
2) Копировать ссылку на строку как вы делаете неверно, т.к. если в одном месте она очистится, то во всех местах она вылетит с ошибкой. Здесь нужна более хитрая структура или же нужно копировать строку (а не ссылку).
Все остальное ошибки, не касающиеся логики.

Вот моя реализация задачи. В ней я использую фиктивную голову и хвост, которые равны друг другу (дял простоты использую зациклиный список, если нужен не зациклиный, сообщите, напишу и такой). Я использовал "empty project" поэтому у меня нет #include "stdafx.h" и за место int _tmain(int argc, _TCHAR* argv[]) у меня простой int main(). И еще, я изменил некоторые названия: previous стал prev (меньше букв ), add заменился на push.

Описание функций:

void merge(NODE* node1, NODE* node2) - соединяет список node1 с node2
void pop(NODE* head) - удаляет узел head из списка, но не удаляет из памяти
bool empty(NODE* head) - проверяет, пустой ли список head, где head - фиктивная голова
NODE* create_head(const char* str = "") - Создает голову для нового списка, с информационный частью str
void push_back(NODE* head, const char* str) - добавляет новый элемент с информационный частью str в конец списка head, где head - фиктивная голова
void push_front(NODE* head, const char* str) - добавляет новый элемент с информационный частью str в начало списка head, где head - фиктивная голова
void pop_back(NODE* head) - удаляет элемент из конца списка head и очищает память, где head - фиктивная голова
void pop_front(NODE* head) - удаляет элемент из начала списка head и очищает память, где head - фиктивная голова
NODE* top_back(NODE* head) - возвращает первый элемент списка head, где head - фиктивная голова
NODE* top_front(NODE* head) - возвращает последний элемент списка head, где head - фиктивная голова
void clear(NODE* head) - удаляет все элементы, но не голову, из списка head и очищает память, где head - фиктивная голова
void delete_head(NODE* &head) - удаляет все элементы с головой из списка head и очищает память, где head - фиктивная голова
void output(NODE* head) - выводит список head на экран (голова не выводится на экран), где head - фиктивная голова


Файл: list.h:

Код:
#ifndef list
#define list

typedef struct lplist
{
    char* str;
    lplist* next;
    lplist* prev;
} NODE;

void merge(NODE* node1, NODE* node2);
void pop(NODE* head);
bool empty(NODE* head);
NODE* create_head(const char* str = "");
void push_back(NODE* head, const char* str);
void push_front(NODE* head, const char* str);
void pop_back(NODE* head);
void pop_front(NODE* head);
NODE* top_back(NODE* head);
NODE* top_front(NODE* head);
void clear(NODE* head);
void delete_head(NODE* &head);
void output(NODE* head);

#endif


Файл: list.cpp:

Код:
#include <iostream>
#include "list.h"
using namespace std;

void merge(NODE* node1, NODE* node2)
{
    node1->next->prev = node2->prev;
    node2->prev->next = node1->next;
    node1->next = node2;
    node2->prev = node1;
}

void pop(NODE* head)
{
    head->next->prev = head->prev;
    head->prev->next = head->next;

    //head->prev = head->next = head;
}

bool empty(NODE* head)
{
    return head->next == head;
}

NODE* create_head(const char* str)
{
    NODE* head = new NODE;
    head->next = head;
    head->prev = head;
    head->str = strdup(str);
    return head;
}

void push_back(NODE* head, const char* str)
{
    merge(top_back(head), create_head(str));
}

void push_front(NODE* head, const char* str)
{
    merge(head, create_head(str));
}

void pop_back(NODE* head)
{
    NODE* n = top_back(head);
    pop(n);
    delete n->str;
    delete n;
}

void pop_front(NODE* head)
{
    NODE* n = top_front(head);
    pop(n);
    delete n->str;
    delete n;
}

NODE* top_back(NODE* head)
{
    return head->prev;
}

NODE* top_front(NODE* head)
{
    return head->next;
}

void clear(NODE* head)
{
    while (!empty(head))
    {
        pop_back(head);
    }
}

void delete_head(NODE* &head)
{
    clear(head);
    delete head->str;
    delete head;
}

void output(NODE* head)
{
    for (NODE* n = top_front(head); n != head; n = n->next)
    {
        cout << n->str;
    }
}


Файл: main.cpp:

Код:
#include <iostream>
#include "list.h"
using namespace std;

int main()
{
    NODE *head = create_head();

    push_back(head, "Cat_back");
    push_back(head, "Come_back");
    push_back(head, "Home_back");

    output(head);
    cout << endl;

    push_front(head, "Cat_front");
    push_front(head, "Come_front");
    push_front(head, "Home_front");

    output(head);
    cout << endl;

    pop_front(head);
    pop_front(head);

    output(head);
    cout << endl;

    pop_back(head);

    output(head);
    cout << endl;

    clear(head);

    output(head);
    cout << endl;

    delete_head(head);

    return 0;
}


А вот реализая двухсвязного списка с использованием STL. Точнее список берется из STL
Реализая двухсвязного списка с использованием STL. Файл: main.cpp:

Код:
#include <iostream>
#include <list>
using namespace std;

list<char*> lst;

int main()
{
    lst.push_back("Cat_back");
    lst.push_back("Come_back");
    lst.push_front("Cat_front");
    lst.push_front("Come_front");

    for (list<char*>::iterator i = lst.begin(); i != lst.end(); ++i)
    {
        cout << *i;
    }

    return 0;
}


Помог, скажи спасибо
L.E.O. вне форума Отправить личное сообщение для L.E.O.
Вверх
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.10
Copyright ©2000 - 2019, vBulletin Solutions, Inc. Перевод: zCarot

Время генерации страницы 0.16041 секунды с 21 запросами