<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++自己實現list

       C++自己實現list

        前兩個博客發表了自己寫的stack(棧)和queue(隊列),感覺比較簡單,今天想試著實現list,結果發現,不是那么容易,感覺自己對STL的底層不是很了解,

      真要自己實現還真的很難,看STL的源代碼,那個暈啊...那代碼也寫得太難理解了,當然跟我不了解有關,但我相信,在將來的某一天我會懂的,你看我的代碼也會懂的。

        話說:STL中的list的內部結構就是一個雙向鏈表,這個東東以前還真沒有玩過,就憑他用的是雙向鏈表我就不想用他,指針太多,耗資源,當然存在就有他的價值,

      他能快速訪問其中的元素。 廢話總該少說,代碼就該多些。

        有那么一點高興的是實現雙向鏈表的翻轉,其他的沒什么了,list還沒有實現,由于現在能力有限,新的版本一定會發布的,你就將就著看吧!

      源碼
      #include <iostream>
      usingnamespace std;

      template
      <typename T>
      class list
      {
      public :
      list()
      {
      initialize();
      }

      list(
      int count)
      {
      initialize();
      if(count>0)
      {
      for(int i=0;i<count;i++)
      {
      push_front(
      0);
      }
      }
      }

      list(
      int count,T data)
      {
      initialize();
      if(count>0)
      {
      for(int i=0;i<count;i++)
      {
      push_front(data);
      }
      }
      }

      //顯示最后一個節點
      T& back()
      {
      checkEmpty();
      return cur->data;
      }

      T
      & back() const
      {
      return back();
      }

      //顯示第一個節點
      T& front()
      {
      checkEmpty();
      return head->next->data;
      }

      T
      & front() const
      {
      return front();
      }

      //彈出最后一個節點
      void pop_back()
      {
      checkEmpty();
      cur
      =cur->prev;
      delete cur
      ->next;
      cur
      ->next=NULL;
      --len;
      }

      //彈出第一個節點
      void pop_front()
      {
      checkEmpty();
      node
      * tmp=head->next;
      head
      ->next=tmp->next;
      tmp
      ->prev=head;
      delete tmp;
      --len;
      }

      //前插節點
      void push_front(const T& t)
      {
      node
      * newNode=new node(t);
      head
      ->next=newNode;
      newNode
      ->prev=head;
      ++len;
      }

      //后插節點
      void push_back(const T& t)
      {
      node
      * newNode=new node(t);
      newNode
      ->prev=cur;
      cur
      ->next=newNode;
      cur
      =newNode;
      ++len;
      }

      //刪除所有值為t的節點
      void remove(const T& t)
      {
      checkEmpty();
      node
      * tmp=head->next;
      for(int i=0;i<len;i++)
      {
      if(tmp->data!=t)
      {
      tmp
      =tmp->next;
      continue;
      }

      if(tmp->next==NULL)//刪除最后一個節點
      {
      cur
      =tmp->prev; //將當前節點指向最后一個節點的前一個節點
      cur->next=NULL;//由于保持當前節點指向最后一個節點,他的下一個節點當然為空
      }else//刪除中間節點
      {
      tmp
      ->prev->next=tmp->next; //要刪除節點的前一個節點的next指針指向要刪除節點的下一個節點
      tmp->next->prev=tmp->prev; //要刪除節點的下一個節點的prev指針指向要刪除節點的前一個節點
      }
      --len;
      node
      * t=tmp->next;
      delete tmp;
      tmp
      =t;
      }
      }


      //反轉鏈表
      //每次都修改當前節點的前后節點指針
      //最后一個節點的下一個指針指向前一個節點
      void reverse()
      {
      checkEmpty();

      node
      * prev = head;// 上一個節點
      node* pcur = head->next;//當前節點
      node* next;
      while (pcur !=NULL)
      {
      if(!pcur->next)
      {
      pcur
      ->next=prev;//最后一個節點的下一個節點指向前一個節點
      break;
      }

      next
      = pcur->next; //下一個節點

      pcur
      ->next=prev; //修改當前節點的下一個節點
      pcur->prev=next; //修改當前及誒單的上一個節點

      prev
      =pcur; //將當前節點設為上一個節點
      pcur=next; //將下一個節點設為當前節點
      }
      cur
      =head->next; //末節點指向頭節點
      head->next=pcur; //頭指針指向當前節點,也就是指向翻轉之前的末節點
      }

      //排序
      //節點之間直接交換數據,而沒有用修改指針指向
      void sort()
      {
      if(empty())
      {
      return;
      }
      node
      *p,*t;
      p
      =head->next;
      T d;
      while(p!=NULL)
      {
      t
      =p;
      while(t!=NULL)
      {
      if(p->data>t->data)
      {
      d
      =p->data;
      p
      ->data=t->data;
      t
      ->data=d;
      }
      t
      =t->next;
      }
      p
      =p->next;
      }
      }


      //鏈表元素個數
      int size()
      {
      return len;
      }

      void resize(int count)
      {
      resize(count,
      0);
      }

      //重新設置元素
      void resize(int count,T t)
      {
      if(count<0)
      {
      thrownew exception("元素的個數不能小于0!");
      }
      clear();
      //內存是必須釋放的
      while(count--)
      {
      push_front(t);
      }
      }

      //清空集合
      void clear()
      {
      if(empty())
      {
      return;
      }
      node
      *tmp=head;
      node
      *t=tmp->next;
      while(t!=NULL)
      {
      tmp
      =t;
      t
      =t->next;
      delete tmp;
      }
      tmp
      =NULL;
      t
      =NULL;

      cur
      =head;//當前節點指向頭指針
      }


      //鏈表是否為空
      bool empty() const
      {
      return len==0;
      }

      //判斷鏈表是否為空
      void checkEmpty()
      {
      if(empty())
      {
      thrownew exception("集合中沒有元素!");
      }
      }


      private :
      typedef
      struct node1
      {
      node1
      *prev,*next;
      T data;
      node1(T t):data(t),prev(NULL),next(NULL){}
      }node;

      node
      * head;//頭節點
      node* cur; //當前節點,指向末節點
      int len; //節點個數

      void initialize()
      {
      cur
      =head=new node(-1);
      len
      =0;
      }
      };

      作者:陳太漢

      posted @ 2011-07-21 19:00  古文觀芷  閱讀(8383)  評論(16)    收藏  舉報
      主站蜘蛛池模板: 丰满少妇被猛烈进出69影院| 国产成人不卡无码免费视频| 国产成人综合色就色综合| 亚洲精品国偷自产在线99人热| 国产日产免费高清欧美一区 | 26uuu另类亚洲欧美日本| 国产盗摄xxxx视频xxxx| 中文字幕av一区二区| 亚洲暴爽av天天爽日日碰| 男女男免费视频网站国产| 一区二区亚洲精品国产精| 日韩精品成人一区二区三区| 日韩中文日韩中文字幕亚| 铜陵市| 亚洲欧洲一区二区精品| 成人午夜大片免费看爽爽爽| 国产偷国产偷亚洲清高APP| 色www永久免费视频| 热久在线免费观看视频| 久久精品av国产一区二区| 国产对白叫床清晰在线播放| 强插少妇视频一区二区三区| 色香欲天天影视综合网| 欧美日韩精品一区二区三区高清视频| 国产乱色国产精品免费视频| 国内精品久久人妻无码网站| 亚洲综合无码日韩国产加勒比| 亚洲性av网站| 日韩乱码卡一卡2卡三卡四| 又粗又硬又黄a级毛片| 九九在线精品国产| 国产精品第一二三区久久| 亚洲AV高清一区二区三区尤物| 国产一区二区视频在线看| 亚洲欧美人成电影在线观看| 中文字幕国产精品日韩| 天堂av网一区二区三区| 国产成人一区二区三区在线| 成人污视频| 福建省| 国产av国片精品一区二区|