我是靠谱客的博主 成就电脑,最近开发中收集的这篇文章主要介绍自己封装的链表操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

 链表节点定义

 

  struct CRectTracker_Node 
	{
		CRectTracker_Node() {
			radio_distance_x=0;
			radio_distance_y=0;
			radio_width=0;
			radio_height=0;
			next=NULL;
			bSelected=FALSE;
		};

		CRectTracker  rectLock;
		double radio_distance_x;
		double radio_distance_y;
		double radio_width;
		double radio_height;
		BOOL  bSelected;

		CRectTracker_Node * next;

		
	} ;


头结点定义:

    CRectTracker_Node * headRectTraker;

 


1 新建节点

 

1) 新建节点作为头结点

 

// 新建节点作为头节点
void CHandleImage::NewNode() 
{
	// 新建一个节点
	CRectTracker_Node *q=new CRectTracker_Node;

	//此变量用于对新建节点赋值
	CRect  rect(0,0,30,30);
	CRectTracker rectTracker(&rect,CRectTracker::dottedLine);


	if (headRectTraker==NULL)
	{	
		// 为新建的节点赋值
		q->rectLock=rectTracker;
		q->next=NULL;

		//将新建的节点作为头结点
		headRectTraker=q;
	}else{

                           // 为新建的节点赋值
			q->rectLock=rectTracker;

			//将原先的链表挂接在新建节点后面
			q->next=headRectTraker;

			//将新建节点作为头节点
			headRectTraker=q;    		
	}
}


 

// 新节点作为头结点  用传入的变量值对新建节点赋值
void CHandleImage::NewNode(double radio_distance_x,double radio_distance_y,double radio_width,double radio_height)  
{

	CRectTracker_Node *q=new CRectTracker_Node;

	q->radio_distance_x=radio_distance_x;
	q->radio_distance_y=radio_distance_y;
	q->radio_width=radio_width;
	q->radio_height=radio_height;

	if (headRectTraker==NULL)
	{			
		q->next=NULL;
		headRectTraker=q;
	}else{
		    q->next=headRectTraker;

			//将新节点作为头节点
			headRectTraker=q;    
	}
}


 

2)新建节点作为尾节点

 

// 新建节点添加到链表的末尾
void CHandleImage::NewNodeTail(double radio_distance_x,double radio_distance_y,double radio_width,double radio_height)
{
	CRectTracker_Node *q=new CRectTracker_Node;

	//为新建节点赋值
	q->radio_distance_x=radio_distance_x;
	q->radio_distance_y=radio_distance_y;
	q->radio_width=radio_width;
	q->radio_height=radio_height;

	q->next=NULL;  // 因为q被添加到末尾 所以 q->next被赋值为空

	if (headRectTraker==NULL)
	{			
		headRectTraker=q;
	}else{
			CRectTracker_Node *p=headRectTraker;

			// 寻找最后一个节点p
			while(p->next!=NULL)
				p=p->next;

			//新加结点作为尾结点
			p->next=q; 
	}
}


 

2 删除节点

 

1) 删除指定节点

// 删除指定节点p
void CHandleImage::Erase(CRectTracker_Node* p)
{
	CRectTracker_Node *pre=NULL;


	if (headRectTraker==NULL)
	{
		MessageBox(NULL,_T("所有节点均被删除"),_T("删除信息"),MB_OK);
	}else{

		if (p==headRectTraker)
		{
			//将头结点的下一个节点作为头结点
			headRectTraker=p->next;
			delete p;
		}else{

			pre=headRectTraker;
			
			//寻找节点p的前一个节点
			while(pre->next!=p&&pre!=NULL)
				pre=pre->next;

			if (pre!=NULL)
			{
				//将p之后的链表挂接在p之前一个节点的后面
				pre->next=p->next;
				delete p;

			}else{

				AfxMessageBox(_T("找不到要被删除的节点p"));

			}
		}
	}
}


 

2) 删除符合条件的所有节点

 

//  删除满足条件的所有节点
//  比如 此函数删除 所有包含点point的节点
void CHandleImage::Erase(CPoint point)
{
	CRectTracker_Node* p=headRectTraker,*pre=NULL;

	if (p==NULL)
	{
		MessageBox(NULL,_T("所有节点均被删除"),_T("删除信息"),MB_OK);
	}else{
		while (p!=NULL)
		{
			//判断点point是否在节点p中
			if (p->rectLock.HitTest(point)>=0)
			{
				if (p==headRectTraker)
				{
					headRectTraker=p->next;
					delete p;

					//  为下一次循环判断 设置初始值
					p=headRectTraker;
					pre=NULL;

				}else{

                    // pre保持不变, 删除p节点后,p被赋新值
					pre->next=p->next;
					delete p;
					p=pre->next;

				}
			}else{// 点point未在节点p中

				if (p==headRectTraker)
				{
					// 为pre赋初始值值为头节点
					// p为头结点的下一个节点
					pre=headRectTraker;
					p=p->next;
				}else{
					// p往后遍历一位,pre相应的也往后遍历一位
					p=p->next;  
					pre=pre->next;
				}

			}
		}
	}
}


 

3) 删除所有节点

 

// 删除所有节点
void CHandleImage::EraseAll()
{
	CRectTracker_Node *p=headRectTraker;
	while(p!=NULL){
		headRectTraker=p->next;
		delete p;
		p=headRectTraker;
	}
	headRectTraker=NULL;
}


 

3 查看符合条件的节点

比如:查看鼠标击中了哪个节点,若本次鼠标一个节点也没有击中,则保留上一次被击中的节点

 

1)为鼠标击中的节点做标记bSelected=True

 

//查看鼠标击中了哪个节点
//若本次鼠标一个节点也未击中,则保留上一次击中的节点
void CHandleImage::Look(CPoint point)
{
	CRectTracker_Node* p=headRectTraker,*pre=NULL;

    // 记录点击之前第一个bSelected位置,否则 若是点击在所有区域之外,则所有区域的bSelected均为False了
	CRectTracker_Node* pFirst=NULL; 

	if (p==NULL)
	{
		MessageBox(NULL,_T("无可供查看的节点"),_T("查看节点"),MB_OK);
	}else{

		BOOL bHit=FALSE;// 是否击中区域
		while (p!=NULL)
		{
			//point在节点p中
			if (p->rectLock.HitTest(point)>=0)
			{
				    bHit=TRUE;

					p->bSelected=TRUE;
					break;

			}else{// 未在P的区域

				if (p==headRectTraker)
				{
					if(p->bSelected)
						pFirst=p;

					p->bSelected=FALSE;

					pre=headRectTraker;
					p=p->next;
				}else{
					if(pFirst==NULL)
					if(p->bSelected)
						pFirst=p;
					p->bSelected=FALSE;
					p=p->next;  
					pre=pre->next;
				}

			}
		}

		if(!bHit){
			if(pFirst!=NULL)
				pFirst->bSelected=TRUE;
			else

				if(headRectTraker!=NULL)
					headRectTraker->bSelected=TRUE;
		}
	}
}


 

2) 寻找第一个被标记的节点

 

	CRectTracker_Node * FindFirstToLook()
	{
		CRectTracker_Node * p=headRectTraker;

		while(p!=NULL)
		{
			if (p->bSelected)
				return p;
			p=p->next;
		}
		return NULL;

	};


3)查看当前节点的左侧节点

	void LookLeft() //查看当前位置左边的区域
	{

		CRectTracker_Node * p=headRectTraker;
		CRectTracker_Node * pre=NULL;

		while(p!=NULL)
		{
			if (p->bSelected) // 指定的节点
				break;
			pre=p;
			p=p->next;
		}

		if (pre!=NULL) //找到指定节点的前一个节点了
			pre->bSelected=TRUE;
	}


 

4)查看当前节点的右侧节点

 

	void LookRight()
	{
        CRectTracker_Node * pF=FindFirstToLook();

		if(headRectTraker!=NULL&&pF==NULL)
			headRectTraker->bSelected=TRUE;
		else{		
			if (pF->next!=NULL)
			{
				pF->bSelected=FALSE;
				pF->next->bSelected=TRUE;
			}
		}
	}


 

最后

以上就是成就电脑为你收集整理的自己封装的链表操作的全部内容,希望文章能够帮你解决自己封装的链表操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部