指针的指针的实际使用例子

头文件1.h

#pragma once
#include <windows.h>
class CSimpleList
{
public:
	CSimpleList(int nNextOffset = 0);
	void Construct(int nNextOffset);
	
	// 提供给用户的接口函数(Operations),用于添加、删除和遍历节点
	BOOL IsEmpty() const;
	void AddHead(void* p);
	void RemoveAll();
	void* GetHead() const;
	void* GetNext(void* p) const;
	BOOL Remove(void* p);
	
	// 为实现接口函数所需的成员(Implementation)
	void* m_pHead;			// 链表中第一个元素的地址
	size_t m_nNextOffset;	// 数据结构中pNext成员的偏移量
	void** GetNextPtr(void* p) const;
};

// 类的内联函数
inline      CSimpleList::CSimpleList(int nNextOffset){ m_pHead = NULL; m_nNextOffset = nNextOffset; }
inline void CSimpleList::Construct(int nNextOffset){ m_nNextOffset = nNextOffset; }
inline BOOL CSimpleList::IsEmpty() const{ return m_pHead == NULL; }
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 void** CSimpleList::GetNextPtr(void* p) const{ return (void**)((BYTE*)p + m_nNextOffset); }

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

BOOL CSimpleList::Remove(void* p)
{
	if(p == NULL)	// 检查参数
		return FALSE;
	
	BOOL bResult = FALSE; // 假设移除失败
	if(p == m_pHead)
	{
		// 要移除头元素
		m_pHead = *GetNextPtr(p);
		bResult = TRUE;
	}
	else
	{
		// 试图在表中查找要移除的元素
		void* pTest = m_pHead;
		while(pTest != NULL && *GetNextPtr(pTest) != p)
			pTest = *GetNextPtr(pTest);
		
		// 如果找到,就将元素移除
		if(pTest != NULL)
		{
			*GetNextPtr(pTest) = *GetNextPtr(p);
			bResult = TRUE;
		}
	}
	return bResult;
}

template<class TYPE>
class CTypedSimpleList : public CSimpleList
{
public:
	CTypedSimpleList(int nNextOffset = 0) : CSimpleList(nNextOffset){}
	void AddHead(TYPE p)	{ CSimpleList::AddHead((void*)p);		}
	TYPE GetHead()			{ return (TYPE)CSimpleList::GetHead();	}
	TYPE GetNext(TYPE p)	{ return (TYPE)CSimpleList::GetNext(p); }
	BOOL Remove(TYPE p)		{ return	   CSimpleList::Remove(p);	}
	operator TYPE()			{ return (TYPE)CSimpleList::GetHead();	}
};

实现文件1.cpp

#include <stdio.h>
#include <STDDEF.H>
#include "Demo01.h"

struct CThreadData 
{
	CThreadData* pNext; // CSimpleList类要使用此成员
	int nCount;			// 数组元素的个数
	LPVOID* pData;      // 数组的首地址
	CThreadData(){}
};


void main()
{
	CTypedSimpleList<CThreadData*> m_list;	// CThreadData结构的列表
	m_list.Construct(offsetof(CThreadData, pNext));
	// 	int x=0x40001111;
	// 	int *y=&x;
	CThreadData* pData = NULL;
	
	for(int i=0;i<10;i++)		
	{
		pData=new CThreadData;
		// 		pData->pNext=NULL;
		// 		pData->nCount=15;
		// 		pData->pData=(void**)&y;
		m_list.AddHead(pData);
	}
	
	m_list.Remove(pData);
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值