注:我是一個編程菜鳥,哪個大神看出來缺陷提點一下,感激不盡。
鏈表由一個個的節點串聯而成,同一由first頭指針管理,屬於線性表中相比於數組,添加刪除方便,但訪問又有點慢的數據結構。
第一步:節點 Node的類。
class Node
{
friend class List;//把List聲明為友類,好在List類中容易訪問Node的私有成員。
private:
char Data;
Node* next;
} ;//節點有兩個數據成員,數據域的字符類型的 Data,以及指向下一個節點的指針域 next。
第二步: 鏈表List的類。
class List
{
Node* first;//第一個節點的指針
Node* end;//最后一個節點的指針。。。這一個數據成員可有可無,我用來記錄最后一個節點的指針,添加新元素將會很快。
public:
//構造函數
List()
{
first=nullptr;
end=nullptr;
}
/*添加元素*/
Node* push_back(char p_back)
{
Node* a=new Node;
a->Data=p_back;
a->next=nullptr;
if(a!=nullptr)
{
if (!first) //添加時是第一個節點的情況
{
first=a;
end=a;
}
end->next=a;//已添加的最后一個節點的next指針賦值新添加的節點地址
end=a;//end賦新的節點的地址。
return end;
}
else
{
cout<<"節點分配空間失敗"<<endl;
return nullptr;
}
}
/*顯示鏈表中的各個元素*/
void print()
{
Node* h=first;
if (!h)
{
cout<<"空鏈表"<<endl;
}
else
{
while (h)
{
cout<<h->Data<<" ";
h=h->next;
}
}
}
/*鏈表元素計數*/
long count()
{
long acount=0;
Node* start=first;
while (start) {
acount++;
start=start->next;
}
return acount;
}
/*鏈表逆序*/
void reverse()
{
//尾指針指向first
end=first;
//第一個節點指針域設為Null ,為逆序鏈表的尾節點,在這之前需要找到下一個節點
Node* behind=first;//這個指針要做為下一個節點的next域。
Node* pre=first->next;//當前第一個節點的的next域,靠它尋找第二個節點
first->next=nullptr;//第一個節點變為尾節點
first=pre;//first指向第二個節點
while (first->next!=nullptr)
{
pre=first->next;//用於對first賦值
first->next=behind;
behind=first;
first=pre;//first指向第二個節點
}
//還得執行最后一步
first->next=behind;
}
};
驗證:
#include <iostream>
#include "List.h"
using namespace std;
int main(int argc, const char * argv[])
{
List a;
a.push_back('h');
a.push_back('e');
a.push_back('l');
a.print();
cout<<endl;
cout<<"該鏈表有:"<<a.count()<<"個元素。"<<endl;
cout<<endl;
cout<<"鏈表逆序之后輸出:"<<endl;
a.reverse();
a.print();
cout<<endl;
cout<<"該鏈表有:"<<a.count()<<"個元素。"<<endl;
return 0;
}
結果:
h e l
該鏈表有:3個元素。
鏈表逆序之后輸出:
l e h
該鏈表有:3個元素。
Program ended with exit code: 0
注:我沒有寫析構函數,這會造成該程序運行時它的內存空間泄露,不過程序結束后,內存會被全部回收的。所有便於演示就沒有寫析構,不過大家千萬不要學我呀。