数据结构:链表
2009-03-08 21:34 Iron 阅读(249) 评论(0) 编辑 收藏 举报#include <vld.h>//测试内存泄露
#include <iostream>
#include <string>
#include <sstream>//整型到string的转化类库
using namespace std;
//链表节点定义
class Node
{
public:
int data;
Node* pre;
Node* next;
Node(int n):data(n)//以整型初始化
{
}
};
//链表
class sqlist
{
public:
Node* head;//头指针
int length;//链表中的元素个数
sqlist()
{
//初始化链表
this->head = NULL;
this->length = 0;
}
bool insertElement(int x, int position = -1);//向链表插入一个元素
bool deleteElement(int position);//删除链表中位置position处的节点
string toString();//将链表的元素取出来连成字符串
~sqlist();//析构每一个节点
};
bool sqlist::insertElement(int x, int position)
{
Node* tempNode = new Node(x);
if(0 == this->length)
{
tempNode->pre = tempNode->next = NULL;
head = tempNode;
length++;
}
else
{
if(-1 == position)
{
//插入到最后一个元素后面
Node* iterator = head;
for(;;)
{
if(NULL == iterator->next)break;
iterator = iterator->next;
}
iterator->next = tempNode;
tempNode->pre = iterator;
tempNode->next = NULL;
length++;
}
else if(position <= this->length)
{
//插入到指定位置后面
Node* iterator = head;
int index = 1;
for(;;)
{
if(index == position)break;
iterator = iterator->next;
index++;
}
iterator->next = tempNode;
tempNode->pre = iterator;
tempNode->next = iterator->next;
length++;
}
else
{
//插入位置超出界限
return false;
}
}
return true;
}
//删除position处的元素
bool sqlist::deleteElement(int position)
{
Node* iterator = head;
//删除头元素
if(1 == position)
{
cout<< "will delete:" << iterator->data << endl;
head = head->next;
head->pre = NULL;
delete iterator;
return true;
}
Node* tempNode;
int index = 1;
for(;;)
{
if(index == position)break;
iterator = iterator->next;
index++;
}
tempNode = iterator;//得到所要删除的节点的指针
cout<< "will delete:" << iterator->data << endl;
if(length == position)
{
//如果删除最后一个节点则没有这步iterator->next->pre = iterator->pre;
}
else
{
iterator->next->pre = iterator->pre;
}
iterator->pre->next = iterator->next;
delete tempNode;
length--;
return true;
}
string sqlist::toString()
{
string s = "";
Node* iterator = head;
for(;;)
{
stringstream ss;
ss<<iterator->data;
s += ss.str()+" ";
if(NULL == iterator->next)break;//如果下一个元素为NULL则跳出
iterator = iterator->next;
}
return s;
}
//析构函数
sqlist::~sqlist()
{
Node* iterator = head;
//析构申请的内存
for(;;)
{
if(NULL == iterator)break;
Node* temp = iterator->next;//先复制到临时变量中,以免析构iterator后访问不到iterator
cout<< iterator->data << " ";
delete iterator;
iterator = temp;
}
}
int main()
{
sqlist* myList = new sqlist();
myList->insertElement(12);
myList->insertElement(23);
myList->insertElement(43);
myList->insertElement(24);
myList->insertElement(16);
myList->insertElement(27);
myList->insertElement(18);
myList->insertElement(28);
myList->insertElement(10);
myList->insertElement(2);
myList->insertElement(22);
myList->insertElement(5433);
myList->insertElement(125);
myList->insertElement(2254);
myList->insertElement(1254);
myList->insertElement(233);
cout << myList->toString() << endl;
myList->deleteElement(16);
cout << "Total nums:" << myList->length << endl;
delete myList;
return 0;
}