/***********************************************/
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;}