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();
}

(0)

相关推荐

  • 用C++实现单向循环链表的解决方法

    用C++实现一个单向循环链表,从控制台输入整型数字,存储在单项循环链表中,实现了求链表大小.不足之处,还望指正! 复制代码 代码如下: // TestSound.cpp : 定义控制台应用程序的入口点.//实现单向循环链表#include "stdafx.h"#include <iostream>#include <string>using namespace std;//定义链表一个节点的结构体template <class T>struct NO

  • C++删除链表中间节点的方法

    本文实例讲述了C++删除链表中间节点的方法.分享给大家供大家参考,具体如下: 题目: 给定链表头结点head,实现删除链表的中间节点函数. 解题思路及代码: 快慢指针,快指针走两步,慢指针一步. 当快指针走到终点时,慢指针正好是链表中间节点,删除此节点即可. 链表结构定义: typedef struct Node { int data; struct Node* next; }node, *pLinkedList; 算法C++代码: Node* removeMidNode(pLinkedList

  • C++ 双链表的基本操作(详解)

    1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>

  • 浅析C++中单链表的增、删、改、减

    首先是是一个简单的例子,单链表的建立和输出.程序1.1 复制代码 代码如下: #include<iostream>#include<string>using namespace std;struct Student{ string name; string score; Student *next;//定义了指向Candidate类型变量的指针};int main(){ int n;// cout<<"请输入学生的总数:"; cin>>n

  • C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.如下图: 2.链表的基本操作 SingleList.cpp: #include "stdafx.h" #include "SingleList.h&

  • C++ 构造双向链表的实现代码

    构造双向链表,不足之处,还望指正!  复制代码 代码如下: // DoubleLinkedList.cpp : 定义控制台应用程序的入口点.//构造双向链表,实现从控制台输入,插入,删除,求大小size等操作#include "stdafx.h"#include <iostream>using namespace std;//定义双向链表的节点template<class T>struct NODE{ NODE<T>* pre; T data; NO

  • C++将二叉树转为双向链表及判断两个链表是否相交

    把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 4=6=8=10=12=14=16 struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 首先阐述下二叉排序树: 它首先要是一棵二元树,在这基础上它或者是一棵空树:或者是具有下列性质的二元树: (1)若左子树不空

  • C++循环链表之约瑟夫环的实现方法

    本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: #include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do

  • C++链表倒序实现方法

    本文通过一个实例展示了C++实现链表倒序的方法,对于C++数据结构的学习有很好的参考借鉴价值.具体方法如下: 首先,C++链表倒序的难点在于如何一个个地修改.虽然不是数组,但是大概思想是一样的,所以可以用一个for循序,一个游标对应for循环里面的 i,只不过要记得前一个节点和后一个节点,尤其是后一个,因为修改之后就访问不到后面的,所以要记录.for每一个循环只改变所指向的那个节点的指针,这样既不会乱套了. 用一个for循环就非常好理解了,实例代码如下所示: #include <iostream

  • C++语言实现线性表之链表实例

    本文实例讲述了C++语言实现线性表之链表实现方法.分享给大家供大家参考.具体分析如下: 插入.删除结点的代码有点多,但这样提高了代码的可读性,且不增加时间复杂度,不会影响程序性能 #include <iostream> using namespace std; template<typename T> class CList; template<class T> class Node { friend CList<T>; private: T m_data;

  • C++中单链表的建立与基本操作

    准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: 复制代码 代码如下: struct Data   //数据结点类型 { string key;  //关键字  string name; int age;};struct CLType  //定义链表结构 { Data nodeData; Data *nextNode;}; 定义了链表数据元素的类型Data以及链表的数据结构CLType.结点的具体数据保存在一个结构Data中,而指针nextNode用来指向下一个结点. 我们可以

  • c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. (1)定义双向链表的基本结构 复制代码 代码如下: typedef struct _DOUBLE_LINK_NODE  {      int data;      struct _DOUBLE_LINK_NODE* prev;      struct _DOUBLE_LINK_NODE* nex

  • C++实现的链表类实例

    本文实例讲述了C++实现的链表类.分享给大家供大家参考.具体如下: #include <iostream> using namespace std; class linklist { private: struct node { int data; node *link; }*p; public: linklist(); void append( int num ); void add_as_first( int num ); void addafter( int c, int num );

随机推荐