CPtrList操作--插入,删除特定元素,删除全部

CPtrList操作--插入,删除特定元素,删除全部

转载地址:http://www.cnblogs.com/joeblackzqq/archive/2010/11/17/1879945.html


新建一个基于对话框的MFC应用程序,界面如下(属性等全采用默认):

首先,添加一个简单的结构体定义(可选择在对话框类定义的前面):

typedef struct _tagNode
{
    CString name;
    int age;
}Node;


 
 

再为对话框类添加一个成员变量:

private:
         CPtrList m_list;

接着为对话框类添加几个成员函数:

void CDxDlg::InsertNode(UINT n)     // 插入n个元素   
{
    for(UINT i = 0; i < n; i++)
    {
        Node * pNode = new Node;
        pNode->name.Format("name%d", i+1);
        pNode->age = 10 * (i+1);
 
        m_list.AddTail(pNode);
    }
}
 
void CDxDlg::Display()              // 显示列表中的元素
{
    POSITION pos;
    CString info;
    for(pos = m_list.GetHeadPosition(); pos != NULL;)
    {
        Node *pNode = (Node*)m_list.GetNext(pos);
        if(pNode != NULL)
        {
            info.Format("name = %s, age = %d", pNode->name, pNode->age);
            MessageBox(info);
        }
    }
}
 
BOOL CDxDlg::RemoveNode(Node *pNode)        // 根据特定结点
{
    if(pNode)
    {
        POSITION pos, temp;
        for(pos = m_list.GetHeadPosition(); pos != NULL; )
        {
            temp = pos;
            Node *node = (Node *) m_list.GetNext(pos);
            if(node && node->name == pNode->name) // 删除第一个姓名相同的元素
            {
                delete node;                // 删除前应该释放分配的空间
                m_list.RemoveAt(temp);      // 删除元素
                return TRUE;
            }
        }
    }
    return FALSE;                           // 删除失败(找不到符合删除条件的元素)
}

在对话框的OnInitDialog()中调用插入结点函数,如 InsertNode(5);

为按钮1添加点击事件:

void CDxDlg::OnButton1()            // 从列表中删除与编辑框中输入姓名相同的结点
{
    CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
    CString delName;                // 将要被删除结点的姓名(name)
    pEdit->GetWindowText(delName);
 
    Node node;
    node.name = delName;
    node.age = 0;
 
    if(RemoveNode(&node))           // 删除结点
    {
        MessageBox("Remove node succ");
    }
    else
    {
        MessageBox("Remove node failed");
    }
    Display();                      // 不管删除成功与否,显示操作后列表中的元素
}

另外要注意的就是在关闭对话框的时候,要释放所分配的空间,所以添加了对话框的DestroyWindow(),代码如下:

BOOL CDxDlg::DestroyWindow()
{
    POSITION pos, temp;
    for(pos = m_list.GetHeadPosition(); pos; )
    {
        temp = pos;
        Node * node = (Node*) m_list.GetNext(pos);
        if(node)
        {
            delete node;                    // 释放空间
            m_list.RemoveAt(temp);          // 删除元素
        }
    }
    return CDialog::DestroyWindow();
}

 释放CPtrList队列中的元素可以使用下面的函数:

/*
    功能: 释放指定队列中的元素及队列本身(要求pList中的元素类型为: CMessBuf)
    @pList: 要释放的CMessBuf类队列
    @bDeleteObject: 是否释放pList指向的空间(默认值为TRUE,如果pList指向的空间不是用new分配的,在调用时可将此值设为FALSE)
*/
void CGateView::FreeList(CPtrList *pList, BOOL bDeleteObject)
{
    while(pList->GetCount() > 0)
    {
        Node *p = (Node*) pList->RemoveHead();
        if(p)
            delete p;
    }
    if(bDeleteObject && pList)
        delete pList;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值