日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

数据结构 单链表 (C++)(转载)

發布時間:2025/3/17 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 单链表 (C++)(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線性表包含 數據域和指針域 其中,data存儲數據本身的值,next存儲后繼元素的地址 下面的圖表示的是一個數據節點

單鏈表的結構示意圖(包括空的單鏈表):

?

?

?

  • 單鏈表的節點類: template<class T> class Node {public:T data;//數據Node<T> *next;//next指針 Node(){this->next=NULL;//構造空的節點 }Node(T data,Node<T> *next=NULL)//構造一個節點 {this->data=data;this->next=next;} };
  • 單鏈表類聲明如下: #include<iostream> #include "Node.h" //單鏈表節點類 template<class T> class SinglyLinkedList //單鏈表類 {public:Node<T> *head;//單鏈表的頭指針。SinglyLinkedList();//構造空的單鏈表。SinglyLinkedList(T value[], int n);//構造由指定的數組提供的單鏈表~SinglyLinkedList();//析構bool isEmpty();//判斷是否為空。int length();//獲取長度Node<T>* getNode(int i);//返回第i(i>=0)個節點指針T get(int i);//返回第i個元素bool set(int i,T x);//設置第i個元素為xtemplate<class T> friend std::ostream& operator<<(std::ostream& out,SinglyLinkedList<T> &list);Node<T>* insert(int i,T x);//插入第I個節點并返回第i個節點的指針bool remove(int i,T& old);//刪除第i個元素,將刪除的元素存放到oldvoid clear();//清空單鏈表void concat(SinglyLinkedList<T> &list);//將List鏈接在當前單鏈表之后 };

    ?

  • 單鏈表部分如構造空的鏈表對象,析構,判斷為空的實現,沒有要講的算法,實現如下: template<class T> SinglyLinkedList<T>::SinglyLinkedList()//構造空的單鏈表 {this->head=NULL; } template<class T> SinglyLinkedList<T>::~SinglyLinkedList()//析構 {clear(); } template<class T> bool SinglyLinkedList<T>::isEmpty()//判斷鏈表是否為空 {return this->head==NULL; }

    ?

  • 單鏈表的遍歷操作,遍歷單鏈表是指從第一個節點開始訪問,沿著節點的Next可依次訪問單鏈表中的各個節點,并且各個節點只被訪問一次。實現的單鏈表遍歷的基本算法如下: int j=0;Node<T> *p=head;while(p!=NULL&&j<i){j++;p=p->next;}

    ?

  • 單鏈表的length(),get(),set(),clear()和輸出等操作都基于以上算法。 template<class T> int SinglyLinkedList<T>::length() {int i=0;Node<T> *p=head;//創建一個用于遍的變量while(p!=NULL){i++;std::cout<<p->data;p=p->next;}return i; } template<class T> Node<T>* SinglyLinkedList<T>::getNode(int i) {if(i<0)return NULL;int j=0;Node<T> *p=head;while(p!=NULL&&j<i){j++;p=p->next;}return p; } template<class T> T SinglyLinkedList<T>::get(int i) {Node<T> *p=getNode(i);if(p!=NULL)return p->data;T d;return d;//throw "單鏈表為空或者參數指定的元素不存在"; } template<class T> bool SinglyLinkedList<T>::set(int i,T x) {Node<T> *p=getNode(i);if(p!=NULL){p->data=x;return true;}return false; } template<class T> std::ostream& operator<<(std::ostream& out,SinglyLinkedList<T> &list) {Node<T> *p=list.head;out<<"(";while(p!=NULL){out<<p->data;p=p->next;if(p!=NULL)out<<",";}out<<")\n";return out; } template<class T> void SinglyLinkedList<T>::clear() {Node<T> *p=head;while(p!=NULL){Node<T> *q=p;p=p->next;delete q;}head=NULL; }

    ?

  • 單鏈表的插入操作,單鏈表不像順序表,對與表的插入和刪除很簡單:
  • 空表插入/頭插入 Node<T> *q=NULL;
    if(head==NULL||i<0)//頭插入(單鏈表為空或者)
    {
    q=new Node<T>(x,head);
    head=q;
    }
  • 中間插入/尾插入 p->next=new Node<T>(x,p->next);
  • 單鏈表insert()以及參數構造函數: template<class T>
    Node<T>* SinglyLinkedList<T>::insert(int i,T x)
    {
    Node<T> *q=NULL;
    if(head==NULL||i<0)//頭插入(單鏈表為空或者)
    {
    q=new Node<T>(x,head);
    head=q;
    }
    else
    {
    int j=0;
    Node<T> *p=head;
    while(p->next!=NULL&&j<i-1)
    {
    j++;
    p=p->next;
    }
    q=new Node<T>(x,p->next);
    p->next=q;
    }
    return q;
    }

    template<class T>
    SinglyLinkedList<T>::SinglyLinkedList(T table[],int n)
    {
    head=NULL;
    if(n>0)
    {
    head=new Node<T>(table[0]);//創建節點
    Node<T> *rear=head;//創建一個指向頭節點的指針
    int i=1;
    while(i<n)
    {
    rear->next=new Node<T>(table[i++]);
    rear=rear->next;
    }
    }
    }
  • 單鏈表的刪除操作也分兩類:
  • 頭刪除 Node<T> *q=head;
    head=head->next;
    delete q;
  • 中間/尾刪除 Node<T> *q=p->next;
    if(q!=NULL)//判斷刪除節點
    {
    p->next=q->next;//讓刪除節點的前驅Next指針下一節點
    delete q;//刪除該節點
    }
  • 單鏈表的刪除函數remove()實現: template<class T>
    bool SinglyLinkedList<T>::remove(int i,T &old)
    {
    if(i<0||head==NULL)
    {
    Node<T> *q=head;
    old=q->data;
    head=head->next;
    delete q;
    }
    else
    {
    Node<T> *p=getNode(i-1);//獲取刪除節點的前驅
    if(p!=NULL&&p->next!=NULL)//判斷刪除節點和刪除節點是否為空
    {
    Node<T> *q=p->next;//新建一個節點指針,將刪除接點復制過去
    old=q->data;
    p->next=q->next;//讓刪除節點的前驅Next指針下一節點
    delete q;//刪除該節點
    return true;
    }
    }
    return false;
    }
  • 單鏈表的鏈接函數:concat() template<class T>
    void SinglyLinkedList<T>::concat(SinglyLinkedList<T> &list)
    {
    if(this->head==NULL)
    {
    this->head=list->head;
    }
    else
    {
    Node<T> *p=head;
    while(p->next!=NULL)
    {
    p=p->next;
    }
    p=list->head;
    }
    list->head=NULL;//設置單鏈表為空,否則運行出錯
    }
  • 以上對C++單鏈表的分析 添加一個學生結構和一個測試函數:

    Student.h

    struct Student {char number[10]; //學號char name[20]; //姓名double score; //得分friend std::ostream& operator<<(std::ostream& out,Student &stu){out<<"學號:"<<stu.number<<" 姓名:"<<stu.name<<" 得分:"<<stu.score;return out;} };

    ?

    主函數:

    #include<iostream> #include "SinglyLinkedList.h" #include "Student.h" void _TestToSinglyLinkedList() {Student data[]={{"090313018","Silvester",45.4},{"090313018","捐贈",45.4},{"090313018","版主",45.6}};SinglyLinkedList<Student> m(data,3);Student t;std::cout<<(m.isEmpty()?"不為空!":"該鏈表為空!")<<std::endl;std::cout<<"長度:"<<m.length()<<std::endl;std::cout<<"移除2個學生"<<m.remove(1,t)<<std::endl;std::cout<<"t:"<<t<<std::endl;std::cout<<"2個學生信息"<<m.getNode(1)<<std::endl;Student s={"415646","fdsfs",453.1};std::cout<<m.get(1)<<m.set(1,s)<<m.insert(5,s)<<std::endl; } void main() {_TestToSinglyLinkedList();system("pause"); }

    ?

    ?提供源代碼下載地址:http://39327.42la.com.cn/DataFile/Code/C++/SinglyLinkedList.zip

    轉載于:https://www.cnblogs.com/cosmo89929/archive/2013/03/04/2942567.html

    總結

    以上是生活随笔為你收集整理的数据结构 单链表 (C++)(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。