C++链表和类的综合应用

老师给我们留的一个作业,要求把链表封装成一个类。花了几个小时完成后,现在贴出来。。。

list.h

 

// list.h

#include 
" iostream "
using   namespace  std;

struct  NODE 
{
    unsigned 
long uID;
    
char strName[16];
    NODE 
*next;
}
;

class  cList
{
public:
    cList(
int n);
    
~cList() {}
    
bool iscreated(); //链表是否创建成功
    int showNodeCount() const//返回链表的节点数
    void printList() const//遍历链表并输出每一节点的数据
    void addNodeBefore(unsigned long uID); //在指定节点前插入一个新的节点
    void addNodeAfter(unsigned long uID); //在指定节点后添加一个新的节点
    void deleteNode(unsigned long uID); //删除指定的节点
    void sortList(); //根据ID大小对链表进行升序排序
protected:
private:
    
int nCount; //链表节点数
    NODE *pHead; //链表首节点指针
    NODE *pDest, *pFront;

    NODE 
*createNode(int n); //创建链表
    void initList(NODE *pDest); //初始化节点数据
    void searchNode(unsigned long uID); //搜索ID与给定ID相等的第一个节点
}
;

 

list.cpp

 

// list.cpp

#include 
" list.h "
#include 
" stdlib.h "
#include 
" assert.h "

cList::cList(
int  n)
{
    nCount 
= n;
    pHead 
= createNode(nCount);
}


// 创建链表
NODE  * cList::createNode( int  n)
{
    NODE 
*pHead, *pRear, *pNewNode;
    
int i;
    
for (i=0; i<n; i++)
    
{
        pNewNode 
= new NODE;
        initList(pNewNode);
        
if (0==i)
        
{
            pRear 
= pHead = pNewNode;
        }
 
        
else
        
{
            pRear
->next = pNewNode;
        }

        pNewNode
->next = NULL;
        pRear 
= pNewNode;
    }

    
return pHead;
}


// 初始化节点数据
void  cList::initList(NODE  * pDest)
{
    assert(pDest 
!= NULL);
    cout
<<"请输入新建节点的 ID 和 名称:"<<endl;
    cin
>>pDest->uID>>pDest->strName;
}


// 链表是否创建成功
bool  cList::iscreated()
{
    
if (pHead != NULL)
    
{
        
return true;
    }

    
return false;
}


// 返回链表的节点数
int  cList::showNodeCount()  const
{
    
return nCount;
}


// 遍历链表并输出每一节点的数据
void  cList::printList()  const
{
    NODE 
*pTemp = pHead;
    
while (pTemp != NULL)
    
{
        cout
<<pTemp->uID<<" "<<pTemp->strName<<endl;
        pTemp 
= pTemp->next;
    }

}


// 搜索ID与给定ID相等的第一个节点
void  cList::searchNode(unsigned  long  uID)
{
    pDest 
= pHead;
    
while ((pDest != NULL) && (pDest->uID != uID))
    
{
        pFront 
= pDest;
        pDest 
= pDest->next;
    }

}


// 在指定节点前插入一个新的节点
void  cList::addNodeBefore(unsigned  long  uID)
{
    NODE 
*pNewNode;
    searchNode(uID);
    
if (pDest == NULL)
    
{
        cout
<<"未找到指定节点!"<<endl;
        
return;
    }

    pNewNode 
= new NODE;
    initList(pNewNode);
    
if (pDest == pHead)
    
{
        pNewNode
->next = pHead;
        pHead 
= pNewNode;
    }

    
else
    
{
        pNewNode
->next = pDest;
        pFront
->next = pNewNode;
    }

    pDest 
= NULL;
    pFront 
= NULL;
    nCount
++;
}


// 在指定节点后添加一个新的节点
void  cList::addNodeAfter(unsigned  long  uID)
{
    NODE 
*pNewNode;
    searchNode(uID);
    
if (pDest == NULL)
    
{
        cout
<<"未找到指定节点!"<<endl;
        
return;
    }

    pNewNode 
= new NODE;
    initList(pNewNode);
    pNewNode
->next = pDest->next;
    pDest
->next = pNewNode;
    pDest 
= NULL;
    nCount
++;
}


// 删除指定的节点
void  cList::deleteNode(unsigned  long  uID)
{
    searchNode(uID);
    
if (pDest == NULL)
    
{
        cout
<<"未找到指定节点!"<<endl;
        
return;
    }

    
if (pDest == pHead)
    
{
        pHead 
= pHead->next;
    }
 
    
else
    
{
        pFront
->next = pDest->next;
    }

    pDest 
= NULL;
    pFront 
= NULL;
    delete pDest;
    nCount
--;
}


// 根据ID大小对链表进行升序排序(冒泡排序法)
void  cList::sortList()
{
    
int i;
    
for (i=0; i<nCount-1; i++)
    
{
        pDest 
= pHead;
        
while (pDest->next != NULL)
        
{
            
if (pDest == pHead)
            
{
                
if (pDest->uID > pDest->next->uID)
                
{
                    pHead 
= pDest->next;
                    pDest
->next = pHead->next;
                    pHead
->next = pDest;
                    pFront 
= pHead;
                }
 
                
else
                
{
                    pFront 
= pDest;
                    pDest 
= pDest->next;
                }

            }
 
            
else
            
{
                
if (pDest->uID > pDest->next->uID)
                
{
                    pFront
->next = pDest->next;
                    pDest
->next = pDest->next->next;
                    pFront
->next->next = pDest;
                    pFront 
= pFront->next;
                }
 
                
else
                
{
                    pFront 
= pDest;
                    pDest 
= pDest->next;
                }

            }

        }

    }

    pFront 
= NULL;
    pDest 
= NULL;
}

 

 main.cpp

 

#include  " list.h "

void  main()
{
    
int n;
    
bool isQuit = false;
    
int nSelected;
    unsigned 
long uID;
    cout
<<"请输入要创建的链表的节点数:"<<endl;
    cin
>>n;
    
if (n<=0)
    
{
        cout
<<"输入数据错误!"<<endl;
        
return;
    }

    cList list(n);
    
if (!list.iscreated())
    
{
        cout
<<"链表创建失败!"<<endl;
        
return;
    }

    cout
<<"链表创建成功!"<<endl;
    
while (!isQuit)
    
{
        cout
<<"请选择要进行的操作:"<<endl;
        cout
<<"1.打印链表节点数"<<endl;
        cout
<<"2.打印链表所有节点数据"<<endl;
        cout
<<"3.在指定ID的节点前插入一个新节点"<<endl;
        cout
<<"4.在指定ID的节点后添加一个新节点"<<endl;
        cout
<<"5.删除指定ID的节点"<<endl;
        cout
<<"6.根据ID大小对链表进行排序"<<endl;
        cout
<<"7.退出"<<endl;

        cin
>>nSelected;
        
switch(nSelected)
        
{
        
case 1:
            cout
<<list.showNodeCount()<<endl;
            
break;
        
case 2:
            list.printList();
            
break;
        
case 3:
            cout
<<"要在ID为多少的节点前插入新节点?"<<endl;
            cin
>>uID;
            list.addNodeBefore(uID);
            
break;
        
case 4:
            cout
<<"要在ID为多少的节点后添加新节点?"<<endl;
            cin
>>uID;
            list.addNodeAfter(uID);
            
break;
        
case 5:
            cout
<<"要删除ID为多少的节点?"<<endl;
            cin
>>uID;
            list.deleteNode(uID);
            
break;
        
case 6:
            list.sortList();
            
break;
        
case 7:
            isQuit 
= true;
            
break;
        
default:
            cout
<<"无此项操作,请重新选择!"<<endl;
            
break;
        }

    }

    
return;
}

你可能感兴趣的:(C++链表和类的综合应用)