近期学习的算法与数据结构
自己按照原理实现的单链表
List.h:
/****************************************************************************************
*program: to come true the struct of list
*autor: kingduo
*date: 2015/4/18 First Release
* 2015/5/5 Second Release make the list simple :change the Node* head
* make the head = NULL in the initial , change the head->next to head
* change the all function about the head point.Change the Clear() by using ~List()
*****************************************************************************************/
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include "Node.h"
using namespace std;
class List
{
public:
List();
~List();
bool IsEmpty();
void Insert(int count, long value);
void Delete(long value);
void Clear();
int Find(long value);
void Swap(long val1, long val2);
void Print();
private:
Node* head;
int size;
};
#endif
List.cpp:
#include "List.h"
#include <cstdlib>
List::List()
{
head = NULL;
size = 0;
}
List::~List()
{
while(head != NULL)
{
Node* deletenode = head;
head = deletenode->next;
delete deletenode;
}
}
bool List::IsEmpty()
{
return (head == NULL);
}
void List::Insert(int count, long value)
{
if(count< 0)
{
cout<<"Plese input the count ( >= 0)!"<<endl;
}
else
{
Node* newnode = new Node;
newnode->value = value;
if(IsEmpty())
{
newnode->next = NULL;
head = newnode;
}else if(count == 0) //判断是否是第一个节点
{
newnode->next = head;
head = newnode;
}else if(count > 0 && count <= size) //当索引号大于一个节点的插入
{
Node* prenode = head;
for(int i = 1; i < count; i++) // 获得要插入节点的前一个节点
prenode = prenode->next;
newnode->next = prenode->next;
prenode->next = newnode;
}else
{
cout<<"Please input the number (< the large count)"<<endl;
return ;
}
size ++;
}
}
void List::Delete(long value)
{
if(IsEmpty())
cout<<"The list is empty! Please input number"<<endl;
else
{
int judge = Find(value);
if(judge >= 0)
{
Node* prenode = head;
if(prenode->next == NULL)
{
head = NULL;
delete prenode;
}else
{
for(int i = 1; i < judge; i++) //获得要删除的节点的前一个节点
prenode = prenode->next;
Node* deletenode = prenode->next;
prenode->next = deletenode->next;
delete deletenode;
}
size--;
}else
cout<<"No Find!"<<endl;
}
}
void List::Clear()
{
List::~List();
cout<<"clear the list"<<endl;
}
int List::Find(long value)
{
int i = 0;
Node* findnode = head;
while (findnode != NULL)
{
if(findnode->value == value)
return i;
findnode = findnode->next;
i++;
}
return -1;
}
void List::Swap(long val1, long val2) //交换两个相邻节点
{
if(val1 == val2)
cout<<"the two value is one number!"<<endl;
else
{
int num1 = Find(val1);
int num2 = Find(val2);
int num = -1;
if((num1 == -1) && (num2 == -1))
cout<<"No Find!"<<endl;
else
{
if(abs(num1 - num2) == 1) //判断输入的两个值是否为相邻节点
{
if( num1 > num2) //找到两节点中排在前面的节点
num = num2;
else num = num1;
Node* prenode = head;
if(num == 0)
{
prenode = head;
head = prenode->next;
prenode->next = prenode->next->next;
head->next = prenode;
}else
{
for(int i = 1; i < num ; i++)
prenode = prenode->next;
Node* val1node = prenode->next;
prenode->next = val1node->next;
val1node->next = val1node->next->next;
prenode->next->next = val1node;
}
}
else
cout<<"Please input the adjancent elements!"<<endl;
}
}
}
void List::Print()
{
if(IsEmpty())
cout<<"The list is empty"<<endl;
else
{
Node* loop_node = head;
while(loop_node != NULL)
{
cout<<loop_node->value<<endl;
loop_node = loop_node->next;
}
}
}
按照原理实现的双链表:
DoubleList.h:
/*******************************************************************
*program: to come true doublelist
*autor: kingduo
*date: 2015/4/18 First Realse
********************************************************************/
#ifndef DOUBLELIST_H
#define DOUBLELIST_H
#include "Node.h"
class DoubleList
{
public:
DoubleList();
~DoubleList();
bool IsEmpty();
void Insert(int count, long value);
void Delete(long value);
void Clear();
int IsFind(long value);
void Swap(long val1, long val2);
void Print();
private:
Node* head;
int size;
};
#endif
DoubleList.cpp:
#include "DoubleList.h"
#include <iostream>
#include <cstdlib>
using namespace std;
DoubleList::DoubleList()
{
head = new Node;
head->next = NULL;
head->last = NULL;
size = 0;
}
DoubleList::~DoubleList()
{
while(head->next != NULL)
{
Node* deletenode = head->next;
head->next = deletenode->next;
delete deletenode;
}
delete head;
}
bool DoubleList::IsEmpty()
{
return (head->next == NULL);
}
void DoubleList::Insert(int count, long value)
{
if(count < 0)
cout<<"Please input the count(> 0)."<<endl;
else
{
Node* newnode = new Node;
newnode->value = value;
if(IsEmpty())
{
newnode->next = head->next;
newnode->last = head;
head->next = newnode;
}else
{
if(count > size)
{
cout<<"Please input the count(< the large count)."<<endl;
return ;
}
else if(count == size) //判断是否是最后的节点
{
Node* currentnode = head;
for(int i = 0; i < count; i++)
currentnode = currentnode->next;
newnode->last = currentnode;
newnode->next = currentnode->next;
currentnode->next = newnode;
}else if(count >= 0) //非最后节点的添加
{
Node* currentnode = head;
for(int i = 0; i <= count; i++)
currentnode = currentnode->next;
newnode->last = currentnode->last;
newnode->next = currentnode;
currentnode->last->next = newnode;
}
}
size++;
}
}
void DoubleList::Delete(long value)
{
if(IsEmpty())
cout<<"The list is empty! Please input number"<<endl;
else
{
int num;
num = IsFind(value);
if(num >= 0)
{
Node* deletenode = head;
for(int i = 0; i <= num; i++)
deletenode = deletenode->next;
if(num == size - 1) //判断是否是最后节点
{
deletenode->last->next = deletenode->next;
deletenode->next = NULL;
}
if(num < size - 1) //删除非最后的节点
{
deletenode->last->next = deletenode->next;
deletenode->next->last = deletenode->last;
}
delete deletenode;
size--;
}else
cout<<"No Find!"<<endl;
}
}
void DoubleList::Clear()
{
while(head->next != NULL)
{
Node* deletenode = head->next;
head->next = deletenode->next;
delete deletenode;
}
cout<<"The doublelist is clear!"<<endl;
}
int DoubleList::IsFind(long value)
{
int i = 0;
Node* findnode = head->next;
while(findnode != NULL)
{
if(findnode->value == value)
return i;
findnode = findnode->next;
i++;
}
return -1;
}
void DoubleList::Swap(long val1, long val2)
{
if(val1 == val2)
cout<<"the two value is one number!"<<endl;
else
{
int num1 = IsFind(val1);
int num2 = IsFind(val2);
int num = -1;
if((num1 == -1) && (num2 == -1))
cout<<"No Find!"<<endl;
else
{
if(abs(num1 - num2) == 1) //判断输入的两个值是否为相邻节点
{
if( num1 > num2) //找到两节点中排在前面的节点
num = num2;
else num = num1;
Node* val1node = head;
for(int i = 0; i <= num ; i++)
val1node = val1node->next;
Node* val2node = val1node->next;
if(num == (size - 2)) //交换倒数的两个节点
{
val1node->last->next = val2node;
val2node->last =val1node->last;
val1node->next = val2node->next;
val2node->next = val1node;
val1node->last = val2node;
}
if(num < (size - 2)) //交换非倒数的两个节点
{
val1node->last->next = val2node;
val2node->last =val1node->last;
val1node->next = val2node->next;
val2node->next->last = val1node;
val2node->next = val1node;
val1node->last = val2node;
}
}
else
cout<<"Please input the adjancent elements!"<<endl;
}
}
}
void DoubleList::Print()
{
if(IsEmpty())
cout<<"The list is empty"<<endl;
else
{
Node* node = head->next;
while(node != NULL)
{
cout<<node->value<<endl;
node = node->next;
}
}
}