Skip to content

Instantly share code, notes, and snippets.

@oxitnik
Created June 8, 2012 09:10
Show Gist options
  • Save oxitnik/2894639 to your computer and use it in GitHub Desktop.
Save oxitnik/2894639 to your computer and use it in GitHub Desktop.
Simple List Implementation C++
#include <iostream>
using namespace std;
class List
{
private:
struct ListItem
//структура для хранения списка
{
int value; // заначение
ListItem* next; //указатель на следующий элемент
};
ListItem* head; // указатель на голову списка
int length; // длина списка
void _clear(ListItem* &h)
//вспомогательная рекрсивная функция для очистки
{
if(h != NULL)
{
_clear(h->next);
}
delete h;
h = NULL;
}
public:
List()
//конструктор
{
head = NULL;
length = 0;
}
List(const List &other)
{
ListItem* tmp1 = other.head;
head = NULL;
length = 0;
while(tmp1 != NULL)
{
this->InsertAt(length+1, tmp1->value);
tmp1= tmp1->next;
}
}
void Print()
//печать списка
{
ListItem* tmp = head;
while(tmp != NULL)
{
cout << tmp->value << " ";
tmp = tmp->next;
}
cout << endl;
}
void InsertAt(int pos, int val)
//вставка в заданную позицию
{
if(pos <= length)
{
ListItem* tmp = head;
for(int i = 0; i < pos - 2; i++)
tmp = tmp->next;
ListItem* tmp2 = tmp->next;
tmp->next = new ListItem();
tmp->next->value = val;
tmp->next->next = tmp2;
length++;
}
else if(pos == length+1)
{
if(head == NULL)
{
head = new ListItem();
head->value = val;
head->next = NULL;
length++;
}
else
{
ListItem* tmp = head;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = new ListItem();
tmp->next->value = val;
tmp->next->next = NULL;
length++;
}
}
}
void RemoveAt(int pos)
//удаление заданной позиции
{
if(pos <= length)
{
ListItem* tmp = head;
for(int i = 0; i < pos - 2; i++)
tmp = tmp->next;
ListItem* tmp2 = tmp->next->next;
delete tmp->next;
tmp->next = tmp2;
}
}
void Clear()
//очистка
{
_clear(head);
length = 0;
}
int Max()
//позиция максимального элемента
{
if(head != NULL)
{
int maxpos = 1;
int maxval = head->value;
ListItem* tmp = head;
for(int i = 1; i <= length; i++, tmp=tmp->next)
{
if(tmp->value > maxval)
{
maxpos = i;
maxval = tmp->value;
}
}
return maxpos;
}
else
{
return -1;
}
}
void Swap(int pos1, int pos2)
// обмен значениями
{
if(pos1 <= length && pos2 <=length)
{
ListItem* tmp1 = head;
for(int i = 0; i < pos1 - 1; i++)
tmp1 = tmp1->next;
ListItem* tmp2 = head;
for(int i = 0; i < pos2 - 1; i++)
tmp2 = tmp2->next;
int tmpval = tmp1->value;
tmp1->value = tmp2->value;
tmp2->value = tmpval;
}
}
int IsSorted()
{
// проверка на упорядоченность
if(length > 1)
{
int st = 0;
int prev = head->value;
ListItem* tmp = head->next;
if(prev > tmp->value)
st = 2;
else
st = 1;
prev = tmp->value;
tmp = tmp->next;
while(tmp != NULL)
{
if((st == 1 && tmp->value > prev) || (st == 2 && tmp->value < prev))
{
prev = tmp->value;
}
else
{
st = 0;
break;
}
tmp = tmp->next;
}
return st;
}
else
{
return 1;
}
}
List Merge(List &other)
{
// слияние списков
List newlist;
int newlen = 0;
ListItem* tmp1 = head;
ListItem* tmp2 = other.head;
while(true)
{
if(tmp1 != NULL)
{
newlen++;
newlist.InsertAt(newlen, tmp1->value);
tmp1 = tmp1->next;
}
if(tmp2 != NULL)
{
newlen++;
newlist.InsertAt(newlen, tmp2->value);
tmp2 = tmp2->next;
}
if(tmp2 == NULL && tmp1 == NULL)
break;
}
return newlist;
}
};
int main()
{
List list;
list.InsertAt(1,42);
list.InsertAt(2,23);
list.InsertAt(3,16);
list.InsertAt(4,15);
list.InsertAt(5,8);
list.InsertAt(6,4);
list.InsertAt(3,17);
list.Print();
cout << list.IsSorted() << endl;
list.RemoveAt(5);
list.Print();
list.Clear();
list.InsertAt(1,26);
list.InsertAt(2,26);
list.InsertAt(3,25);
list.Swap(2,3);
list.Print();
cout << list.Max() << endl;
List list2;
list2.InsertAt(1,10);
list2.InsertAt(2,20);
list2.InsertAt(3,30);
list2.InsertAt(4,40);
list2.InsertAt(5,50);
list2.Print();
List list3 = list2.Merge(list);
list3.Print();
getchar();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment