C++模板--------双向链表

 

/***********************************************/

 

                    CListT.h

 

POSITION        是参照C++标准模板CList写的

/***********************************************/   

#ifndef  CLISTT_H
#define  CLISTT_H

#include "stdafx.h"

#include <iostream>
using namespace std;
struct __POSITION {};
typedef __POSITION* POSITION;

template <typename Type>
class CListT{
protected:
 class Node{
 public:
  Node(const Node* pNode):data(pNode->data),
   pre(pNode->pre),
   next(pNode->next){};
  Node(void):data(0),
   pre(NULL),
   next(NULL){};
  Node(Type v):data(v),
   pre(NULL),
   next(NULL){};
  ~Node(void){data=0;delete pre;delete next;};
  Type  data;
  Node* pre;
  Node* next;
 };

public:
 
 CListT(void):pHead(NULL),
  pEnd(NULL){};
 ~CListT();
 void Insert(POSITION pos,Type v);
 void Append(Type v);
 void Remove(POSITION pos);
 POSITION posFindPositionByIndex(int index);
 void printCListT();
private:
 Node* pHead;
 Node* pEnd;


};
template <typename Type>
CListT<Type>::~CListT()
{

}
template <typename Type>
void CListT<Type>::Insert(POSITION pos,Type v)
{
 if (pos==NULL||((Node*)pos)->next==NULL)
 {
  Append(v);
 }
 else
 {
  Node* pTemp=new Node(v);
  ((Node*)pos)->next->pre=pTemp;
  pTemp->next=((Node*)pos)->next;
  pTemp->pre=((Node*)pos);
  ((Node*)pos)->next=pTemp;
 }
}

template <typename Type>
void CListT<Type>::Append(Type v)
{
 Node* pTemp=new Node(v);
 if (pHead==NULL)
 {
  pHead=pTemp;
  pEnd=pHead;
 }
 else
 {
  pTemp->pre=pEnd;
  pEnd->next=pTemp;
  pEnd=pEnd->next;
 }
}

template <typename Type>
void CListT<Type>::Remove(POSITION pos)
{
 if (!pos)
 {
  return;
 }
 if (((Node*)pos)->pre)
 {
  ((Node*)pos)->next->pre=((Node*)pos)->pre;
  ((Node*)pos)->pre->next=((Node*)pos)->next;
  ((Node*)pos)->next=NULL;
  ((Node*)pos)->pre=NULL;
 }
 else
 {
  pHead=pHead->next;
  pHead->pre=NULL;
  ((Node*)pos)->next=NULL;
  ((Node*)pos)->pre=NULL;
 }
 
 delete ((Node*)pos);

}

template <typename Type>
POSITION CListT<Type>::posFindPositionByIndex(int index)
{
 int i=1;
 Node * pTemp=pHead;
 while (pTemp)
 {
  if (i==index)
  {
   return (POSITION)pTemp;
  }
  else if (i>index)
  {
   break;
  }
  pTemp=pTemp->next;
  i++;
 }
 return NULL;
}

template <typename Type>
void CListT<Type>::printCListT()
{
 Node * pTemp=pHead;
 while (pTemp)
 {
  if (pTemp->next)
  {
   cout<<pTemp->data<<"->";
  }
  else
  {
   cout<<pTemp->data;
  }
  
  pTemp=pTemp->next;
 }
 cout<<endl;
}
#endif

 

 

 

 

/*******************************************/

 

                   CListT.c======测试代码

 

/*******************************************/

// CListT.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "CListT.h"


int _tmain(int argc, _TCHAR* argv[])
{
 CListT<float> test1;
    test1.Append(2.0);
 test1.Append(3.0);
 test1.Append(5.3);//
 test1.printCListT();
 cout<<"在第2个节点插入元素"<<endl;
 test1.Insert(test1.posFindPositionByIndex(2),6);
 test1.printCListT();
 cout<<"删除第2个元素"<<endl;
 test1.Remove(test1.posFindPositionByIndex(2));
 test1.printCListT();
 cout<<"Append:"<<endl;
 test1.Append(90);
 test1.printCListT();


 cout<<endl<<endl;
 CListT<char*> test2;
 cout<<"字符串操作 :"<<endl;
 test2.Append("gg");
 test2.Append("hh");
 test2.printCListT();
 cout<<"在第2个节点插入元素"<<endl;
 test2.Insert(test2.posFindPositionByIndex(2),"insert");
 test2.printCListT();
 cout<<"删除第1个元素"<<endl;
 test2.Remove(test2.posFindPositionByIndex(1));
 test2.printCListT();

 

 system("pause");
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值