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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 链表
, 类模板
静态成员
链表类模板、用链表构建学生信息库、构建链表、块状链表 模板、c 模板 链表,以便于您获取更多的相关知识。

时间: 2024-10-31 07:54:44

C++利用静态成员或类模板构建链表的方法讲解_C 语言的相关文章

详解C++的模板中typename关键字的用法_C 语言

typename的使用场合 用处1, 用在模板定义里, 标明其后的模板参数是类型参数.例如 template<typename T, typename Y> T foo(const T& t, const Y& y){//....}; templace<typename T> class CTest { private: T t; public: //... } 其实,这里最常用的是使用关键字class,而且二者功能完全相同,这里的class和定义类时的class完

C语言单链表常见操作汇总_C 语言

C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下: #include<stdio.h> #include<stdlib.h> //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //创建单链表 void Build(LinkList L) { int n; LinkList p,q; p=L; pr

C++类的静态成员初始化详细讲解_C 语言

记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 复制代码 代码如下: #include <iostream>using namespace std;class test{public:static int num;};int test::num = 0;void main(){cout<<test::num <<endl;test::

C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言

队列类链式存储 代码: linkqueue.hpp  // 队列类 #pragma once #include "linklist.hpp" template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: int clear(); int append(T &t); int retieve(T &t); int header(T &t); int l

深入解析C++中的函数模板和函数的默认参数_C 语言

C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的参数自动确定数据类型.这就是数据类型参数化. 所谓函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替(实际上是用一个标识符来占位).这个通用函数就称为函数模板(Function Template).凡是函数

一般函数指针和类的成员函数指针深入解析_C 语言

函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样. 1.指向一般函数的指针函数指针的声明中就包括了函数的参数类型.顺序和返回值,只能把相匹配的函数地址赋值给函数指针.为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数.下面是一个指向函数的指针使用的例子. 复制代码

怎么实现类的成员函数作为回调函数_C 语言

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败.要解决这一问题的关键就

探究C++中string类的实现原理以及扩展使用_C 语言

C++程序员编码过程中经常会使用string(wstring)类,你是否思考过它的内部实现细节.比如这个类的迭代器是如何实现的?对象占多少字节的内存空间?内部有没有虚函数?内存是如何分配的?构造和析构的成本有多大?笔者综合这两天阅读的源代码及个人理解简要介绍之,错误的地方望读者指出. 首先看看string和wstring类的定义: typedef basic_string<char, char_traits<char>, allocator<char> > string

C++标准模板库函数sort的那些事儿_C 语言

STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n).sort()定义在在头文件<algorithm>中.sort函数是标准模板库的函数,已知开始和结束的地址即可进行排序,可以用于比较任何容器(必须满足随机迭代器),任何元素,任何条件,执行速度一般比qsort要快.另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件. 具体事例如下:char ch[20]="sdasdacsdasdas";cout<<ch<<