C++中CSimpleList的实现与测试实例

本文实例讲述了C++简单列表类的实现方法。分享给大家供大家参考。具体方法如下:

_AFXTLS.CPP文件如下:

//#include "StdAfx.h
#include <stddef.h>
#include <stdio.h>
#include "_AFXTLS_.H" 

struct MyThreadData{
  MyThreadData* pNext;
  int nShortData;
}; 

void CSimpleList::AddHead(void *p)
{
  *GetNextPtr(p)=m_pHead;
  m_pHead = p;
} 

BOOL CSimpleList::Remove(void* p)
{
  BOOL bRet = FALSE;
  if (p == NULL)
  {
    bRet = FALSE;
  } 

  if (p == m_pHead)
  {
    m_pHead = GetNext(m_pHead);
    bRet = TRUE;
  }
  else
  {
    void*  pTest;
    pTest = m_pHead;
    while (pTest && (GetNext(pTest) != p))
    {
      pTest = GetNext(pTest);
    }
    if (pTest != NULL)
    {
      *GetNextPtr(pTest) = GetNext(p);
      bRet = TRUE;
    }
  }
  return bRet; 

} 

void main()
{
  MyThreadData* pData;
  CSimpleList list;
  list.Construct(offsetof(MyThreadData, pNext));
  for (int i=0;i<10;i++)
  {
    pData = new MyThreadData;
    pData->nShortData = i;
    list.AddHead(pData);
  } 

  //遍历链表,释放MyThreadData对象占用的空间
  pData = (MyThreadData*)list.GetHead();
  while(pData != NULL)
  {
    MyThreadData* pNextData = pData->pNext;
    printf("The value is %d\n",pData->nShortData);
    delete pData;
    pData = pNextData;
  }
} 

_AFXTLS_.H文件如下:

//#include "StdAfx.h
#ifndef __AFXTLS_H__
#define __AFXTLS_H__
#include <Windows.h>
class CSimpleList
{
public:
  CSimpleList(int nNextOffset=0);
  void Construct(int nNextOffset);
  //接口
  BOOL IsEmpty() const;
  void AddHead(void *p);
  void RemoveAll();
  void* GetHead() const;
  void* GetNext(void* preElement) const;
  BOOL Remove(void* p); 

  //为实现接口所需的成员
  void  *m_pHead;
  size_t m_nextOffset;
  void** GetNextPtr(void* preElement) const;
}; 

//类的内联函数
inline CSimpleList::CSimpleList(int nNextOffset)
  {m_pHead = NULL; m_nextOffset = nNextOffset;  } 

inline void CSimpleList::Construct(int nNextOffset)
  {m_nextOffset = nNextOffset;  } 

inline BOOL CSimpleList::IsEmpty() const
{
  return m_pHead==NULL;
}
//inline void AddHead(void *p)
//{
//
//}
inline void CSimpleList::RemoveAll()
{
  m_pHead = NULL;
}
inline void* CSimpleList::GetHead() const
{
  return m_pHead;
}
inline void* CSimpleList::GetNext(void* preElement) const
{
  return *GetNextPtr(preElement);
}
//inline BOOL CSimpleList::Remove(void* p)
//{
//
//}
inline void**  CSimpleList::GetNextPtr(void* preElement) const
{
  return (void**)((BYTE*)preElement+m_nextOffset);
} 

#endif

希望本文所述对大家的C++程序设计有所帮助。

(0)

相关推荐

  • C++语言 STL容器list总结

    在使用std::list<>链表时,难免会对数据进行添加删除操作.而遍历链表则有两种方式:通过索引访问,象数组一样处理:通过std::list<>::iterator链表遍历器进行访问 STL 中的list 就是一 双向链表,可高效地进行插入删除元素. list不支持随机访问.所以没有 at(pos)和operator[]. list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) .list< int>::iterator

  • C++中list的使用方法及常用list操作总结

    C++中list的使用方法及常用list操作总结 一.List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.使用时需要添加头文件 #include <list> 二.List定义和初始化: list<int>lst1;          //创建空list     list<int> lst2(5);       //创建含有5个元素的list     list<int>lst3(3,2

  • C++中 STL list详解及简单实例

    C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo

  • C++ 中CListCtrl的每个项都显示不同的提示信息

    C++ 中CListCtrl的每个项都显示不同的提示信息 添加CToolTipCtrl成员变量m_toolTipCtrl,CListCtrl成员变量m_ListUser,CImageList成员变量m_imageList(这个可以不要) 在OnInitDialog()函数里加下面代码 m_BoradcastEnd.EnableWindow(FALSE); m_imageList.Create(32, 32, ILC_COLOR8, 2, 2); DWORD dwStyle = m_ListUse

  • C++ list的实例详解

     C++ list的实例详解 Source: #include <iostream> #include <list> #include <numeric> #include <algorithm> using namespace std; typedef list<int> LISTINT; //创建一个list容器的实例LISTINT typedef list<int> LISTCHAR; //创建一个list容器的实例LISTCH

  • C++ 模拟实现list(迭代器)实现代码

    C++ 模拟实现list(迭代器) 实现代码: #pragma once; #include <assert.h> #include<iostream> #include <assert.h> using namespace std; template<class T> struct __ListNode { T _data; __ListNode<T>* _next; __ListNode<T>* _prev; __ListNode

  • C++ STL入门教程(2) list双向链表使用方法(附程序代码)

    一.简介 "Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence." Lists将元素按顺序储存在链表中.与向量(vector)相比, 它允许快速

  • C++ 使用模板实现一个List的实例

    C ++使用模板写的一个List template<class T> class List { private: struct Node { T data; Node *next; }; //head Node *head; //size int length; //process Node *p; //temp Node *q; public: List() { head = NULL; length = 0; p = NULL; } void add(T t) { if(head == N

  • C++中CSimpleList的实现与测试实例

    本文实例讲述了C++简单列表类的实现方法.分享给大家供大家参考.具体方法如下: _AFXTLS.CPP文件如下: //#include "StdAfx.h #include <stddef.h> #include <stdio.h> #include "_AFXTLS_.H" struct MyThreadData{ MyThreadData* pNext; int nShortData; }; void CSimpleList::AddHead(vo

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • JS中的hasOwnProperty()和isPrototypeOf()属性实例详解

    这两个属性都是Object.prototype所提供:Object.prototype.hasOwnProperty()和Object.prototype.isPropertyOf() 先讲解hasOwnProperty()方法和使用.在讲解isPropertyOf()方法和使用 看懂这些至少要懂原型链 一.Object.prototype.hasOwnProperty() 概述 hasOwnProperty()方法用来判断某个对象是否含有指定的自身属性 语法 obj.hasOwnPropert

  • JAVA 中解密RSA算法JS加密实例详解

    JAVA 中解密RSA算法JS加密实例详解 有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.Java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.

  • centos7安装mysql并jdbc测试实例详解

    centos7安装mysql并jdbc测试实例详解 前言: 之前用rpm安装方式安装不成功,换成yum安装之后安装ok了,在网上搜索到很多的rmp安装和tar包安装的方式,但是是centos7.x与centos6.x做了很大的改变,可能别人的6.x不适合7.x的安装,尤其是对于像博主一样的新人来说,照搬教程可能导致安装不成功,如果你rmp安装失败,那么尝试跟着本教程来吧. 先卸载已经存在的MySQL. [root@shizongger bin]# rpm -qa|grep mysql [root

  • java中对List分段操作的实例

    java中对List分段操作的实例 问题:假设A系统查询出来一个很大很大的List,现在B系统想要得到这个List来导出报表,但是B系统部署环境条件有限,内存容不下这么大一个List,这时候我们就需要把List切分,然后再一个一个导出了. 如果按照传统方式,可能会比较繁琐,我们可以运用List里面的subList方法来实现,代码如下: import java.util.ArrayList; import java.util.List; public class listTest { public

  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解 String: 是对象不是原始类型.            为不可变对象,一旦被创建,就不能修改它的值.            对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.            String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象            它只能通过构造函数来建立,  

  • javascript原生封装一个淡入淡出效果的函数测试实例代码

    说到js的渐变显示与消失,多数朋友会想到JQuery里面的fadeIn().fadeOut()或fadeToggle().但如果仅仅是为了引入这样的一个效果,而去调用了庞大JQuery库?或者说我通过用原生js实现一些函数来提高自己~ 所以,我简单的研究了一下纯js代码写淡入淡出的效果. 如果出现错误,请在评论中指出,我也好自己纠正自己的错误 (一)FadeIn淡入函数 淡入淡出的效果,其实就是一个setInterval(),加上循环的DOM操作,通过改变element对象节点的透明度,即可实现

  • 对python中if语句的真假判断实例详解

    说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发现以下条件均为假,相当于False In [2]: if '': ...: print('ok') ...: In [3]: if 0: ...: print('ok') ...: In [4]: if None: ...: print('ok') ...: In [5]: if []: ...:

  • Vue中通过Vue.extend动态创建实例的方法

    在Vue中,如果我们想要动态地来控制一个组件的显示和隐藏,比如通过点击按钮显示一个对话框或者弹出一条信息.我们通常会提前写好这个组件,然后通过v-if = "show"来控制它的显示隐藏.如下所示: <div> <button @click = "show = !show">弹出</button> <span v-if = "show">这是一条通过按钮控制显示隐藏的信息</span>

随机推荐