Achiber

代码改变世界,让我们一起默默的努力!
随笔 - 4, 文章 - 2, 评论 - 0, 引用 - 0
数据加载中……

模板类

#include <iostream>
#include 
<stdio.h>
#include 
<iostream.h>

template 
<class T>

struct SLNode{
     T data;
     SLNode
<T> *next;
     SLNode(SLNode
<T> *nextNode=NULL){
         next 
= nextNode;
     }

     SLNode(
const T &item,SLNode<T> *nextNode=NULL){
         data 
= item;
         next 
= nextNode;
     }

 }
;

template 
<class T>
class SLList{
 
private:
     SLNode
<T> *head;
     SLNode
<T> *tail;
     SLNode
<T> *currptr;
     
int size;
 
public:
     SLList();
     SLList(
const T &item);
     
~SLList();
     
bool IsEmpty()const;
     
int Length()const;
     
bool Find(int k, T &item)const;
     
int Search(const T &item)const;
     
void InsertFromHead(const T &item);
     
void InsertFromTail(const T &item);
     
bool DeleteFromHead(T &item);
     
bool DeleteFromTail(T &item);
     
void Insert(int k,const T &item);
     
void Delete(int k,T &item);
     
void ShowListMember();
 }
;
 
//构造函数
template <class T>
SLList
<T>::SLList(){
     head 
= tail = currptr = new SLNode<T>();
     size 
= 0;
}

 
//构造函数
template <class T>
SLList
<T>::SLList(const T &item){
     tail 
= currptr = new SLNode<T>(item);
     head 
= new SLNode<T>(currptr);
     size 
= 1;
 }

 
//析构函数
template <class T>
SLList
<T>::~SLList(){
      SLNode
<T> *temp;
     
while(!IsEmpty()){
         temp 
= head->next;
         head 
-> next = temp -> next;
         delete temp;
     }

}

 
//判断链表是否为空
template <class T>
bool SLList<T>::IsEmpty()const{
     
return head->next == NULL;
}

 
//返回链表的长度
template <class T>
int SLList<T>::Length()const{
      
return size;
}

 
//查找第k个节点的阈值
template <class T>
bool SLList<T>::Find(int k,T &item)const {
     
if(k < 1){
         cout
<<"illegal position !"<<endl;
     }

     SLNode
<T> *temp = head;
     
int count = 0;
     
while(temp != NULL && count < k){
         temp 
= temp->next;
         count
++;
     }

     
if(temp == NULL){
         cout
<<"The list does not contain the K node !"<<endl;
         
return false;
     }

     item 
= temp->data;
     
return true;
}

 
//查找data阈值为item是表的第几个元素
template <class T>
int SLList<T>::Search(const T &item)const {
     SLNode
<T> *temp = head->next;
     
int count = 1;
     
while(temp != NULL && temp->data != item) {
         temp 
= temp->next;
         count
++;
     }

     
if(temp == NULL) {
         cout
<<"The node does not exist !"<<endl;
         
return -1;
     }

     
else {
         
return count;
     }

}

 
//从表头插入
template <class T>
void SLList<T>::InsertFromHead(const T &item) {
     
if(IsEmpty()) {
         head
->next = new SLNode<T>(item,head->next);
         tail 
= head->next;
     }

     
else {
         head
->next = new SLNode<T>(item,head->next);
     }

     size
++;
 }

 
//从表尾插入
 template <class T>
 
void SLList<T>::InsertFromTail(const T &item) {
     tail
->next = new SLNode<T>(item,NULL);
     tail 
= tail->next;
     size
++;
 }

 
//从表头删除
 template <class T>
 
bool SLList<T>::DeleteFromHead(T &item) {
     
if(IsEmpty()) {
         cout
<<"This is a empty list !"<<endl;
         
return false;
     }

     SLNode
<T> *temp = head->next;
     head
->next = temp->next;
     size
--;
     item 
= temp->data;
     
if(temp == tail) {
         tail 
= head;
     }

     delete temp;
     
return true;
 }

 
//从表尾删除
 template <class T>
 
bool SLList<T>::DeleteFromTail(T &item) {
     
if(IsEmpty()) {
         cout
<<"This is a empty list !"<<endl;
         
return false;
     }

     SLNode
<T> *temp = head;
     
while(temp->next != tail) {
         temp 
= temp->next;
     }

     item 
= tail->data;
     tail 
= temp;
     tail
->next=NULL;
     temp 
= temp->next;
     delete temp;
     size
--;
     
return true;
 }

 
//在第k个节点后插入item值
 template <class T>
 
void SLList<T>::Insert(int k,const T &item) {
     
if(k < 0 || k > size) {
         cout
<<"Insert position Illegal !"<<endl;
         
return;
     }

     
if(k == 0{
         InsertFromHead(item);
         
return;
     }

     
if(k == size) {
         InsertFromTail(item);
         
return;
     }

     SLNode
<T> *temp = head->next;
     
int count = 1;
     
while(count < k) {
         count
++;
         temp 
= temp->next;
     }

     SLNode
<T> *= temp->next;
     temp
->next = new SLNode<T>(item,p);
     size
++;
 }

 
//删除第k个节点的值,保存在item中
 template <class T>
 
void SLList<T>::Delete(int k,T &item) {
     
if(k <= 0 || k > size) {
         cout
<<"Ileegal delete position !"<<endl;
         
return;
     }

     
if(k == 1){
         DeleteFromHead(item);
         
return;
     }

     
if(k == size){
         DeleteFromTail(item);
         
return;
     }

     SLNode
<T> *temp = head->next;
     
int count = 1;
     
while(count < k-1{
         count
++;
         temp 
= temp->next;
     }

     SLNode
<T> *= temp->next;
     temp
->next = p->next;
     p
->next = NULL;
     item 
= p->data;
     delete p;
     size
--;
 }

template 
<class T>
 
void SLList<T>::ShowListMember() {
     cout
<<"List Member : ";
     SLNode
<T> *temp = head->next;
     
while(temp != NULL){
         cout 
<< temp -> data << " ";
         temp 
= temp -> next;
     }

     cout
<<endl;
 }


 
/*
 1.引入了InsertFronHead,InsertFromTail,DeleteFromHead和DeleteFromTail用来实现
   Insert和Delete函数,是一个比较好的方法。
 2.SLNode(T &item,SLNode<T> *nextNode)这个构造函数设计的非常巧妙,便于其他成员
   函数的实现。
 3.插入,删除分为:表头,表尾,中间插入(删除)三种情况
 
*/


 
int main()
 
{
     
int item;
     SLList
<int> list(12);

     list.Insert(
0,11);
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();

     list.Insert(
2,14);
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();

     list.Insert(
2,13);
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();

     list.Delete(
2,item);
     cout
<<"item = "<<item<<endl;
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();

     list.Delete(
1,item);
     cout
<<"item = "<<item<<endl;
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();

     list.Delete(
2,item);
     cout
<<"item = "<<item<<endl;
     cout
<<"list number:"<<list.Length()<<endl;
     list.ShowListMember();
     
return 0;
}

posted on 2012-11-23 22:43 王文豪 阅读(270) 评论(0)  编辑 收藏 引用 所属分类: C++learning


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理