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

转载 2013年12月04日 19:20:06

新建一个基于对话框的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; 
}

相关文章推荐

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

新建一个基于对话框的MFC应用程序,界面如下(属性等全采用默认):首先,添加一个简单的结构体定义(可选择在对话框类定义的前面):typedefstruct_tagNode {     CString ...
  • wl_fln
  • wl_fln
  • 2011年03月23日 17:46
  • 1711

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

CPtrList操作--插入,删除特定元素,删除全部 转载地址:http://www.cnblogs.com/joeblackzqq/archive/2010/11/17/1879945.html ...

程序员面试宝典_链表基本操作,建立,求长,删除和插入特定值的结点

删除data1值的结点,插入data2值的结点 /*程序参见《程序员面试宝典》179页,链表长度不包含头结点,终止条件:输入0 ***********************************...

数组顺序表初始化、特定位置插入元素、删除特定值等操作

第二篇博客

基于线性表:编写26个字母按特定字母值插入或删除的完整程序

题目:编写26个字母按特定字母值插入或删除的完整程序 源码如下: #define TRUE    1 #define FALSE    0 #define OK        1 #define...
  • liboyo
  • liboyo
  • 2012年03月19日 16:10
  • 1689

Effective STL--不同容器删除特定元素的方法

输入迭代器是每个迭代位置智能被读一次的只读迭代器。输出迭代器是每个迭代位置只能被写一次的只写迭代器。输入和输出迭代器被塑造为读和写输入和输出流。前向迭代器有输入和输出迭代器的能力,但是他们可以反复读或...

删除特定文件夹 qt写的

  • 2013年01月16日 11:04
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CPtrList操作(插入,删除特定元素,删除全部)
举报原因:
原因补充:

(最多只允许输入30个字)