C++利用靜態(tài)成員或類模板構(gòu)建鏈表的方法講解
更新時(shí)間:2016年04月09日 12:05:17 作者:hzy3774
這篇文章主要介紹了C++利用靜態(tài)成員或類模板構(gòu)建鏈表的方法講解,鏈表是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),而在C++中構(gòu)件單鏈表還是稍顯復(fù)雜,需要的朋友可以參考下
直接上代碼了,說(shuō)明看注釋就可以:
利用靜態(tài)成員構(gòu)建鏈表
#include <IOSTREAM.H>
class Node
{
public:
Node(int val, Node* next):val(val),next(next){}
//~Node(){cout<<"del "<<val<<endl;}
static void showAll();//打印全部節(jié)點(diǎn)的值
static void insertHead(int);//頭插
static void insertTail(int);//尾插
static void delHead();//刪頭
static void delTail();//刪尾
static void clear();//清空
protected:
int val;
Node *next;
static Node *head;
private:
};
Node* Node::head = 0;
void Node::showAll(){//打印全部節(jié)點(diǎn)的值
Node *p = head;
while (p)
{
cout<<p->val<<" ";
p = p->next;
}
cout<<endl;
}
void Node::insertHead(int val){//頭插
Node *p = new Node(val, head);
head = p;
}
void Node::insertTail(int val){//尾插
Node *p = new Node(val, 0);
if (!head)
{
head = p;
return;
}
Node *q = head;
while (q->next)
{
q = q->next;
}
q->next = p;
}
void Node::delHead(){//刪頭
Node *p = head;
if (head)
{
head = head->next;
delete p;
}
}
void Node::delTail(){//刪尾
if (!head)
{
return;
}
if (!(head->next))
{
delete(head);
head = NULL;
return;
}
Node *p = head;
while (p->next->next)
{
p = p->next;
}
delete(p->next);
p->next = NULL;
}
void Node::clear(){//清空
Node *p = head;
Node *q = 0;
head = 0;
while (p)
{
q = p;
p = p->next;
delete q;
}
}
void main(){
Node::delHead();
Node::delTail();
Node::insertTail(2);
Node::delTail();
for (int i = 0; i < 10; i++)
{
Node::insertTail(i + 1);
}
Node::delTail();
Node::showAll();
}
利用類模板構(gòu)建鏈表
這有點(diǎn)類似于list<>:
#include <iostream>
#include <string>
using namespace std;
template<class T> class Node//創(chuàng)建一個(gè)類模板,一個(gè)可以放入任何類型節(jié)點(diǎn)的鏈表
{
public:
Node(T val, Node* next):val(val),next(next){}
static void showAll();//打印全部節(jié)點(diǎn)的值
static void insertHead(T);//頭插
static void insertTail(T);//尾插
static void delHead();//刪頭
static void delTail();//刪尾
static void clear();//清空
protected:
T val;
Node *next;
static Node *head;
private:
};
template<class T> Node<T>* Node<T>::head = 0;
template<class T> void Node<T>::showAll(){//打印全部節(jié)點(diǎn)的值
Node *p = head;
while (p)
{
cout<<p->val<<" ";
p = p->next;
}
cout<<endl;
}
template<class T> void Node<T>::insertHead(T val){//頭插
Node *p = new Node(val, head);
head = p;
}
template<class T> void Node<T>::insertTail(T val){//尾插
Node *p = new Node(val, 0);
if (!head)
{
head = p;
return;
}
Node *q = head;
while (q->next)
{
q = q->next;
}
q->next = p;
}
template<class T> void Node<T>::delHead(){//刪頭
Node *p = head;
if (head)
{
head = head->next;
delete p;
}
}
template<class T> void Node<T>::delTail(){//刪尾
if (!head)
{
return;
}
if (!(head->next))
{
delete(head);
head = NULL;
return;
}
Node *p = head;
while (p->next->next)
{
p = p->next;
}
delete(p->next);
p->next = NULL;
}
template<class T> void Node<T>::clear(){//清空
Node *p = head;
Node *q = 0;
head = 0;
while (p)
{
q = p;
p = p->next;
delete q;
}
}
class Student//創(chuàng)建一個(gè)自定義的學(xué)生類
{
public:
Student(string name, int age,char sex):name(name), age(age), sex(sex){}
void showInfo(){
cout<<"姓名:"<<name<<" 年齡:"<<age<<" 性別:"<<sex<<endl;
}
protected:
string name;
int age;
char sex;
private:
};
void Node<Student>::showAll(){//學(xué)生類節(jié)點(diǎn)和其他基本數(shù)據(jù)類型不同,不能直接用<<輸出,所以重載showAll()
Node *p = head;
while (p)
{
p->val.showInfo();
p = p->next;
}
}
void main(){
for (int i = 1; i < 10; i++)
{
Node<int>::insertTail(i);//這時(shí)Node<int>稱為一個(gè)用類模板生成的模板類
Node<float>::insertTail(i / 10.0f);
Node<double>::insertTail(i / 10.00);
Node<Student>::insertTail(Student("stu", i, 'F'));
}
Node<int>::showAll();
Node<float>::showAll();
Node<double>::showAll();
Node<Student>::showAll();
}

相關(guān)文章
c++遞歸實(shí)現(xiàn)n皇后問(wèn)題代碼(八皇后問(wèn)題)
c++遞歸實(shí)現(xiàn)n皇后問(wèn)題代碼分享,大家參考使用吧2013-12-12
C++基于Directx MMX實(shí)現(xiàn)的圖像灰度轉(zhuǎn)換代碼
這篇文章主要介紹了C++基于Directx MMX實(shí)現(xiàn)的圖像灰度轉(zhuǎn)換代碼,需要的朋友可以參考下2014-08-08
VS2022連接sqlserver數(shù)據(jù)庫(kù)教程
本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫(kù)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法
這篇文章主要介紹了C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄(2)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄的第二部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

