有序的双向链表实现

 自己写的个有序的双向链表:

#include<iostream>
using namespace std;
template<class T>
class dNode
{
  public:
   dNode* pre;
   dNode* next;
   T content;

};


template<class T>
dNode<T>*  insertNode(dNode<T> *&head ,const T &n)
{
 dNode<T> *newNode = new dNode<T>;
 newNode->content = n;
    dNode<T> *move = head;
 if(head == NULL)//链表为空
 {
  head = newNode;
     head->pre = NULL;
    head->next = NULL;
  return head;
 }
 else
 {
    if(n<=head->content)//表头插入
    {
       newNode->pre = 0;
    newNode->next = head;
    head->pre = newNode;
    head = newNode;
    return head;
    }
    else
    {
       while(n>move->content&&move->next!=NULL)
    {
      move=move->next;
    }
    if(n>move->content)///插入链表末端
    {
       newNode->pre = move;
    newNode->next = 0;
    move->next = newNode;
    }
    else 表中间插入
    {
   newNode->pre = move ->pre;
   newNode->next = move;
   move->pre->next = newNode;
   move->pre = newNode;
    } 
    return newNode;
    }
 }
}

template<class T>
void displayLink(const dNode<T>  *const head)
{
    const dNode<T> *move = head ;
 while(move!=0)
 {
     cout<<move->content<<endl;
     move=move->next;
 }
}

 


template<class T>
dNode<T>*  searchNode(dNode<T> *&head ,const T &n)
{
     dNode<T> *move = head ;
  while(n>move->content&&move->next!=0)
  { 
     
  move = move->next;
  
    
  }
  if(n==move->content)
  {
  return move;
  }
     else
  {
     return NULL;
  }
 

}

 

template<class T>
void find(dNode<T> *&head ,const T &n)
{
 dNode<T> *key = searchNode(head ,n);
 if(key==0)
 {
    cout<<"无此记录"<<endl;
 }
 else
 {
    cout<<key->content<<endl;
 }
}


template<class T>
dNode<T>*  deleteNode(dNode<T> *&head ,const T &n)
{
   dNode<T> *move = searchNode(head ,n);
   if(move!=0)
   {
      if(move->pre == 0)/删除表头
   {
      move->next->pre = 0;
   head = head->next;
   delete move;
   move = 0;
   return head;
   }
   else if(move->next== 0)/删除链表尾部
   {
      move->pre->next = 0;
   }
      else/删除中间元素
   {
  move->pre->next = move->next;
  move->next->pre = move->pre;
   
   }
   move = move->pre;
   return  move;
   }
   else
   {
    return NULL;
   }
}


int main()
{
  dNode<int>   *head = 0;
 //dNode<int> *head=new dNode<int>;
  int a = 6;
  insertNode(head,a);
 
  insertNode(head,4);
  insertNode(head,5);
 insertNode(head,7);
 // cout<<k->pre->content<<endl;
  displayLink(head);
  dNode<int> *k = searchNode(head,1);
  deleteNode(head ,7);
  find(head,7);
  displayLink(head);
 // cout<<k->content<<endl;
  return 1;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值