C++综合系列之模拟单链表模版
2017-06-06 16:49
288 查看
该篇有问题,正在修改中。。。
list.h
main.cpp
list.h
#ifndef _LIST_H_ #define _LIST_H_ #include<iostream> using namespace std; /**********************************************************************************/ /* 定义单链表结构的四种方式 */ /**********************************************************************************/ /**********************************************************************************/ /* 1. 友元类:在Node类中定义友元的方式,使List类可以访问结点的私有成员。 */ /**********************************************************************************/ //class Node //{ // friend class List; //private: // int value; // Node *next; //} //class List //{ //public: // //单链表具体操作 //private: // Node *head; //} /******************************************************************************************************/ /* 2. 内部类:在List内部定义Node类,但是Node的数据成员放在public部分,使List和Node均可以直接访问Node的成员。*/ /******************************************************************************************************/ //class List //{ //public: // //单链表具体操作 //private: // class Node // { // public: // int value; // Node *next; // } // Node *head; //} /******************************************************************************************/ /* 3. 继承:在Node类中把成员定义为protected,然后让List继承Node类,这样就可以访问Node类的成员。*/ /******************************************************************************************/ //class Node //{ //protected: // int value; // Node *next; //}; //class List : public Node //{ //public: // //单链表具体操作 //private: // Node *head; //} /***************************************************************************************************************/ /* 4. struct: 直接用struct定义Node类,因为struct的成员默认为公有数据成员,所以可直接访问(struct也可以指定保护类型)。*/ /***************************************************************************************************************/ //struct Node //{ // int data; // Node *next; //}; //class List //{ //public: // //单链表具体操作 //private: // Node *head; //} /**********************************************************************************/ /* 本文采用的是第一种友元类的方式 */ /**********************************************************************************/ //声明友元模版类(方法2.1) //template<class T> //class List; template<class T> class Node { public: Node() { // T v; // value = v; next = NULL; } Node(T v, Node<T> *ptr = NULL) { value = v; next = ptr; } //声明友元模版类(方法1) template<class E> friend class List; //声明友元模版类(方法2.2) //friend class List<T>; friend ostream &operator<<(ostream &out, Node &n) { out << n.value; return out; } private: T value; Node<T> *next; }; template<class T> class List { public: List() { head = new Node<T>; m_count = 0; } ~List() { clear(); } //获得链表的长度 int size() { m_count = 0; Node<T> *p = head; while ((p = p->next) != NULL) { m_count ++; } return m_count; } //从头部添加一个节点 void insert_front(T value) { Node<T> *pTemp = head->next; head->next = new Node<T>(value); head->next->next = pTemp; } //从尾部添加一个节点 void insert_end(T value) { Node<T> *p = head; while(p->next != NULL) p = p->next; p->next = new Node<T>(value); } //添加节点到指定位置 void insert_index(int index, T value) { if(index > size()) { cout << "index cause stack overflow." << endl; return; } Node<T> *p = head; for(int i = 1; i <= index - 1; i++)//index以第一个元素为参照计算偏移次数,并且从1开始计算索引 { p = p->next; } Node<T> *pTemp = p->next; p->next = new Node<T>(value); p->next->next = pTemp; } //反转倒置(递归) void reverse_recursive() { } //反转倒置(非递归) void reverse_nonrecursive() { } //清空链表(保留head节点) void clear() { Node<T> *pTemp = NULL; while(head->next != NULL)//head->next是关键 { pTemp = head->next;//临时变量保存头节点后面的节点,做删除用,如果直接删除将会丢失next节点指针,寻不到next节点 // head->next = pTemp->next;//将head的next指针指向head的next的next节点,不断丢弃头节点后面的节点,此处pTemp->next <=> head->next->next head->next = head->next->next; delete pTemp; } } //显示链表中所有数据 void display() { Node<T> *p = head; int count = 0; while((p = p->next) != NULL) { cout << "第" << ++count << "个节点为: " << *p << endl; } } private: Node<T> *head; //表头 int m_count; }; #endif
main.cpp
#include <iostream> #include "list.h" using namespace std; int main() { List< afee int> *list = new List<int>; list->insert_end(3); list->insert_end(4); list->display(); cout << "size: " << list->size() << endl; list->insert_front(1); list->display(); cout << "size: " << list->size() << endl; list->insert_index(4,2); list->display(); cout << "size: " << list->size() << endl; list->clear(); cout << "size: " << list->size() << endl; return 0; }
相关文章推荐
- C++综合系列之模拟栈模版(数组版及单链表版)
- C++综合系列之模拟事件机制
- [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- C++模版编程——单链表的实现
- 9秒学院C++模版类实现单链表
- C++综合系列之构造函数执行于main函数之前
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- 【C++模版之旅】静态多态(模版模拟多态)的讨论
- [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化
- c++学习笔记(十四):多态的综合运用——模拟发动报文
- C++静态多态(模版模拟多态)的讨论
- 微软软件实现技术授课系列内容之二:C++ Best Coding Practice
- Intel系列开发工具- C++ Compiler,Fortran Compiler,IPP,MKL,VTune,Thread Checker
- 一个IQ问题的C++模拟
- C++中的const--C++系列文章(1)
- 如何在C#中模拟C++的联合(Union)?[C#, C++]
- (c++的对话)Solmyr 的小品文系列之三:对象计数(上)
- C++ GUI Programming with Qt3(系列一 试翻)
- C++深度探索系列:智能指针(Smart Pointer) /1