代码改变世界

数据结构:链表

2009-03-08 21:34  Iron  阅读(248)  评论(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;
}