C++链表模板

#include
using  namespace  std;
template    
class  MyLinkList;    //链表类声明
template  
class  Node{
        public:
        Node()      
            {
                    next=NULL;
            }

        Node(ElemType  val)  
          {
                  data=val;
                  next=NULL;
            }
        friend  class  MyLinkList;          //友元说明
        private:      
        ElemType    data;//值
        Node  *  next;//指向下一个节点的指针
};
template  
class  MyLinkList{
        private:
        unsigned  int  listlength;
        Node  *  pTemp;//临时节点
        Node  *  pTail;//头结点
        Node  *  pHead;//尾节点
        public:
                MyLinkList();//初始化
                void  addAtTail(ElemType    x);//表尾添加元素
                void  traversal();//遍历整个链表并打印
//该函数请同学完成
                void  Delete(ElemType  x);//删除第一个值为x的节点
                void  insertHead(ElemType    x);//在链表的头部插入节点
};
template  
MyLinkList::MyLinkList()
{
        pTemp=NULL;
        pTail=NULL;
        pHead=NULL;
        listlength=0;
}
template  
void  MyLinkList::addAtTail(ElemType    x)
{
        pTemp=new  Node(x);//申请一个新的节点
        if(pTail==NULL)//如果没有尾节点则链表为空,pTemp既为头结点,又是尾节点
        {
                pHead=pTemp;
                pTail=pTemp;
        }
        else//如果链表非空
        {
                pTail->next=pTemp;//pTemp既为尾节点的下一个节点
                pTail=pTemp;//pTemp变成了尾节点,把尾节点赋值为pTemp
        }
        ++listlength;//元素个数+1
}
template  
void  MyLinkList::traversal()
{
        pTemp=pHead;//用临时节点指向头结点
        while(pTemp!=NULL)//遍历链表并输出
        {
                cout<data<<"      ";      //""内三个空格
                pTemp=pTemp->next;
        }
        cout<
void  MyLinkList::Delete(ElemType  x)
{       if(!pHead) return; //如果为空链表则直接返回
        pTemp=pHead;//用临时节点指向头结点
        Node *pre = NULL;       //要删除结点的前驱结点 
        while(!(pTemp->data==x)&&pTemp==NULL)//遍历链表寻找 
        {       pre =pTemp;
                pTemp=pTemp->next;
        }
        if(pTemp->data==x){
        	if(pTemp== pHead)// 如果x是头结点所在的节点
			pHead = pTemp->next; // 修改头结点指向 
			else{
        	pre->next =pTemp->next;
        	delete pTemp;}
		}
}

template  
void  MyLinkList::insertHead(ElemType    x)
{
        pTemp=new  Node(x);
        if(pTail==NULL)
              pTail=pTemp;
        pTemp->next=pHead;
        pHead=pTemp;
}
class  Student
      {
      public:
            Student(int  id  =  0,  int  height  =  0)
        {
              this->ID  =  id;
              this->Height  =  height;
          }
          bool    operator  ==(Student  &a2);
          friend  ostream  &operator  <<(ostream  &out,  const  Student  &s)
      {  
              out  <<  "ID:"  <<  s.ID  <<  "  Height:"  <<  s.Height;  
              return  out;
        }
    private:
      int  ID;
      int  Height;
};
//重载==运算符函数,注意删除的是ID相同的结点
bool Student::operator  ==(Student& a2)
{
    return this->ID == a2.ID ? 1 : 0;
}

int  main()
{
      MyLinkList  list1;
      for(int  i=0;i<10;i++)
          list1.insertHead(i);
          list1.insertHead(9);
          list1.insertHead(9);
          list1.insertHead(9);
          list1.traversal();
          list1.Delete(9);
          list1.traversal();
          MyLinkList  list2;
          list2.insertHead(Student(1,174));
          list2.addAtTail(Student(2,176));
          list2.addAtTail(Student(3,173));
          list2.traversal();
          list2.Delete(Student(1,174));
          list2.traversal();
          return  0;
}

你可能感兴趣的:(C++,链表,c++,数据结构)