Created
June 8, 2012 09:10
-
-
Save oxitnik/2894639 to your computer and use it in GitHub Desktop.
Simple List Implementation C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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