概述
链表节点定义
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;
}
}
}
最后
以上就是成就电脑为你收集整理的自己封装的链表操作的全部内容,希望文章能够帮你解决自己封装的链表操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复