C++利用静态成员或类模板构建链表的方法讲解

 更新时间:2016年04月09日 12:05:17   作者:hzy3774  
这篇文章主要介绍了C++利用静态成员或类模板构建链表的方法讲解,链表是基础的数据结构,而在C++中构件单链表还是稍显复杂,需要的朋友可以参考下

直接上代码了,说明看注释就可以:

利用静态成员构建链表

#include <IOSTREAM.H> 
 
class Node 
{ 
public: 
  Node(int val, Node* next):val(val),next(next){} 
  //~Node(){cout<<"del "<<val<<endl;} 
  static void showAll();//打印全部节点的值 
  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(){//打印全部节点的值 
  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(); 
} 

利用类模板构建链表
这有点类似于list<>:

#include <iostream> 
#include <string> 
using namespace std; 
 
template<class T> class Node//创建一个类模板,一个可以放入任何类型节点的链表 
{ 
public: 
  Node(T val, Node* next):val(val),next(next){} 
  static void showAll();//打印全部节点的值 
  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(){//打印全部节点的值 
  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//创建一个自定义的学生类 
{ 
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(){//学生类节点和其他基本数据类型不同,不能直接用<<输出,所以重载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);//这时Node<int>称为一个用类模板生成的模板类 
    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(); 
} 

201649120129152.jpg (387×247)

相关文章

  • C语言推箱子游戏实现代码

    C语言推箱子游戏实现代码

    这篇文章主要为大家详细介绍了C语言推箱子游戏实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • c++递归实现n皇后问题代码(八皇后问题)

    c++递归实现n皇后问题代码(八皇后问题)

    c++递归实现n皇后问题代码分享,大家参考使用吧
    2013-12-12
  • 用贪心法求解背包问题的解决方法

    用贪心法求解背包问题的解决方法

    本篇文章是对用贪心法求解背包问题的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++基于Directx MMX实现的图像灰度转换代码

    C++基于Directx MMX实现的图像灰度转换代码

    这篇文章主要介绍了C++基于Directx MMX实现的图像灰度转换代码,需要的朋友可以参考下
    2014-08-08
  • VS2022连接sqlserver数据库教程

    VS2022连接sqlserver数据库教程

    本文主要介绍了VS2022连接sqlserver数据库教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++直接cout指针名的含义?

    C++直接cout指针名的含义?

    今天小编就为大家分享一篇关于C++直接cout指针名的含义?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • Arduino控制舵机详解 附代码

    Arduino控制舵机详解 附代码

    rduino是一款便捷灵活、方便上手的开源电子原型平台,它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境,这篇文章主要介绍了Arduino控制舵机详解(含代码),需要的朋友可以参考下
    2023-05-05
  • C++实现数字转换为十六进制字符串的方法

    C++实现数字转换为十六进制字符串的方法

    这篇文章主要介绍了C++实现数字转换为十六进制字符串的方法,涉及C++操作数字与字符串转换的相关技巧,需要的朋友可以参考下
    2015-06-06
  • c++中的bind使用方法

    c++中的bind使用方法

    bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。接下来通过本文给大家介绍c++中的bind使用方法,感兴趣的朋友一起看看吧
    2022-01-01
  • C语言实现简单电子通讯录(2)

    C语言实现简单电子通讯录(2)

    这篇文章主要为大家详细介绍了C语言实现简单电子通讯录的第二部分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06

最新评论