惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Troy Hunt's Blog
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
S
Schneier on Security
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
Cisco Talos Blog
Cisco Talos Blog
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
量子位
L
Lohrmann on Cybersecurity
酷 壳 – CoolShell
酷 壳 – CoolShell
Attack and Defense Labs
Attack and Defense Labs
Y
Y Combinator Blog
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
博客园 - 聂微东
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Securelist
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
B
Blog RSS Feed
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
Recent Announcements
Recent Announcements
V2EX - 技术
V2EX - 技术
Schneier on Security
Schneier on Security
F
Full Disclosure
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Proofpoint News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
月光博客
月光博客
L
LINUX DO - 最新话题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Heimdal Security Blog
F
Fortinet All Blogs
博客园_首页
N
News | PayPal Newsroom
P
Proofpoint News Feed

博客园 - Andrew Yin

数据访问层组件设计以及选型意识流 第四次扩展的讨论 数据访问层组件设计以及选型意识流 第三次封装(极致、极简而不简单) 数据访问层组件设计以及选型意识流 第二次封装以及各种牢骚 数据访问层组件设计以及选型意识流 第一次封装 数据访问层组件设计以及选型意识流 开篇 UTF-8, Unicode, GB2312三种编码方式解析, 深入研究汉字编码 一步一步学Ruby系列(二):Ruby中的函数 一步一步学Ruby系列(一):Ruby基础知识 .NET下的AOP: PostSharp 原理分析 AST,DLR,Expression Tree-----------推荐一位牛人的博客! C# 交互式SHELL C#中的 eval System.Web.Routing命名空间代码解析(四) Route解析中用到的实体类,一些以"Segment”为名的类 System.Web.Routing命名空间代码解析(三) RouteCollection类 System.Web.Routing命名空间代码解析(二) Routing类(上) System.Web.Routing命名空间代码解析(一) RouteBase类,RouteData类,RouteValueDictionary类 ASP.NET MVC中的各种上下文对象 有关string和Cookie的几个有用的扩展方法 反射加异步,根据枚举值来异步执行方法 操作Enum的一些实用方法
C++中的模板实例:链表模板
Andrew Yin · 2008-12-23 · via 博客园 - Andrew Yin

今天看了看C++中模板的概念,按照教程写了一个简单的链表模板:

//*********************
//** listtmp.h **
//*********************
#ifndef LIST
#define LIST

#include 

<iostream>

template

<class T> class List{
public:
    List();
    
void Add(T&);
    
void Remove(T&);
    T
* Find(T&);
    T
* Current();
    
void Restart();
    
void Next();
    
void PrintList();
    
~List();
protected:
    
struct Node{
        Node
* pNext;
        T
* pT;
    };
    Node 
*pFirst;  //链首结点指针
    Node *pCurpos; //当前节点
};

template

<class T> List<T>::List()
{
    pFirst 
= 0;
    pCurpos 
= 0;
}

template

<class T> T* List<T>::Current()
{
    
if(pCurpos)
        
return pCurpos->pT;
    
return 0;
}

template

<class T> void List<T>::Restart()
{
    
if(pFirst)
        pCurpos 
= pFirst;
    
else
        pCurpos 
= 0;
}

template

<class T> void List<T>::Next()
{
    
if(pCurpos)
        pCurpos 
= pCurpos->pNext;
}

template

<class T> void List<T>::Add(T& t)
{
    Node
* temp = new Node;
    temp
->pT =&t;
    temp
->pNext = pFirst;
    pFirst 
= temp;
}

template

<class T> void List<T>::Remove(T& t)
{
    Node 
*= 0//待删结点
    if(*(pFirst->pT)==t) //T类中==须有定义
    {
        q 
= pFirst;
        pFirst 
= pFirst->pNext; //待删结点在链首时的脱链
    }
    
else
    {
        
for(Node* p=pFirst; p->pNext; p=p->pNext)
        { 
//顺链查找
            if(*(p->pNext->pT)==t)
            {
                q 
= p->pNext;
                p
->pNext = q->pNext;
                
break;
            }
        }
    }
    
if(q)
    {
        delete q
->pT;
        delete q;
    }
}

template

<class T> T* List<T>::Find(T& t)
{
    
for(Node* p=pFirst; p; p=p->pNext)
        
if(*(p->pT)==t)
            
return p->pT;return 0;
}

template

<class T> void List<T>::PrintList()
{
    
for(Node* p=pFirst; p; p=p->pNext)
        cout 
<<*(p->pT)<<" "//须有T的友元处理T对象输出

    cout 
<<endl;
}

template

<class T> List<T>::~List()
{
    Node
* p;
    
while(p = pFirst){
        pFirst 
= pFirst->pNext;
        delete p
->pT;
        delete p;
    }
    pFirst 
= 0;
}
#endif

并且创建了一个josephus问题的解决方案:

//******************************
//**    Josephus问题解法六    **
//**    jose6.cpp             **
//******************************

#include 
<iostream>
#include 
"listtmp.h"
#include 
<iomanip>
using namespace std;void Display(int);
void Step(int m);
void Init(int);

List

<int> josephus;                  //创建单向链表模板类的全局对象

void main()
{
  
int n=9999, s=274, m=291;                 //随取三个合理的整数
  
//int* ap=
  Init(n);
  Step(s);
  
for(int i=1; i<n; i++){
    Step(m);
    
int* tmp = josephus.Current();
    Display(
*tmp);
    Step(
1);//josephus.Next();
    josephus.Remove(*tmp);
  }
  cout 
<<"\nThe winner is "<<*josephus.Current() << endl;
  
//delete[]ap;
}//以下是构造链表,初始化结点编号的函数
void Init(int n)
{
  
//int* a = new int[n];
  for(int i=0; i<n; i++)
  {
    
//a[i] = n - i;
    Display(i+1);
    josephus.Add(
*new int(n - i));
  }
  Display ( 
-1 );
  josephus.Restart();           
//初始化迭代算子
  
//return a;
}//以下是显示一个结点编号的函数
void Display(int n)
{
  
static int k;
  
if(n<0){
    k 
= 0;
    cout 
<<endl;
    
return;
  }
  cout 
<<setw(5<<n;
  
if (!(++k%10))
    cout 
<<endl;
}
//以下是要将指针从当前位置挪到往下数第m个结点的位置
void Step(int m)
{
  
for(int i=0; i<m; i++){
    josephus.Next();
    
if(!josephus.Current())    //模拟环链表操作
      josephus.Restart();
  }
}

深入学习C++基础知识。。。。