链表的实现基于C++

#include "stdafx.h"
#include "linklist.h"
#include <iostream>
using namespace  std;


int _tmain(int argc, _TCHAR* argv[])//super man yes
{
    linklist<int>mylinklist;
    mylinklist.InsertNode(1,1);
    mylinklist.InsertNode(2,2);
    mylinklist.InsertNode(2,3);
    mylinklist.InsertNode(3,4);
    mylinklist.DeleteNode(2);

    mylinklist.PrintNode();
    getchar();

	return 0;
}
#pragma  once
#include <iostream>
using namespace std;
template<class T>
class linklist
{
public:
        linklist():length(0),mlist(nullptr){}
      ~linklist(){}
public:
    bool  IsEmpty();
  linklist<T>*   InsertNode(int index,T value);
  linklist<T>*    DeleteNode(int index);
  linklist<T>*  ChangeNodeValue(int index ,T value);
    void PrintNode();
    void Clear();
    int GetLenght();
private:
    typedef struct Node
    {
        int index;
        T value;
        struct Node * next;

    }node,*pnode;
private:
pnode mlist;
int length;



};

template<class T>
bool linklist<T>::IsEmpty( )//verity whether the linklist is empty!
{ 
            if(this->mlist==nullptr)
            {
                return true;

            }
   return false;
}



template<class T>
 linklist<T>*  linklist<T>::InsertNode(int Index,T value)//insert the node  pointer of the mlist ,can't ne used as the move pointer~
{

     pnode pnewnode = new node;
     pnode tempnode=mlist;
    memset(pnewnode, 0, sizeof(node));
    memcpy_s(&pnewnode->value ,sizeof(T), &value,sizeof(T));
    if(Index-1<=length)
    { 
     
            if(mlist==nullptr&&Index==1)
            {

              mlist=pnewnode;
               length++;
               return this;
            }
          for(int j=1;j<Index-1;j++)
          {
              mlist=mlist->next;
          }
           
          pnewnode->next=mlist->next;
          mlist->next=pnewnode;
          length++;
          this->mlist=tempnode;
          return this ;
    }



    else 
        return NULL;


}

template<class T>
 linklist<T>* linklist<T>::DeleteNode(int Index)
{

    pnode tempnode; 
    pnode nodetp;
    tempnode=mlist;
  if(Index>length||Index<0)
  {

      return 0;
  }
 if(1==Index)  
      {
           delete mlist;

     }
        for(int j=1;j<Index-1;j++)
        mlist=mlist->next;
          
         nodetp=mlist->next;
        mlist->next=mlist->next->next;
          length--;
         delete  nodetp;
         this->mlist=tempnode;
         return this;

}


template<class T>
linklist<T>* linklist<T>::ChangeNodeValue(int Index,T value)
{
    pnode tempnode;//the temp node is just the return node to flag the old linklist pointer
    if(Index<0||Index>length)
    {
        return 0;
    }
    for(int j=1;j<=Index;j++)
    {
        mlist=mlist->next;
    }

    mlist->value=value;

    this->mlist=tempnode;
    return this;
    
}
template<class T> 
void linklist<T>::Clear()
{
    pnode tempnode;
  if(0==length)
      return NULL;
  while(mlist)
  {
    tempnode=mlist->next;//every time  
    delete mlist;
    mlist=tempnode;

  }



}

template<class T>
int linklist<T>::GetLenght()
{
    return length;
}
template<class T>
void linklist<T>::PrintNode()
{

   while(length>0)
   {
        cout<<mlist->value<<' '<<endl;
        mlist=mlist->next;
        length--;
  
   
   }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值