1.使用C++封装一个链表类LinkList
使用C++封裝一個鏈表類LinkList。寫出相應一個測試用例
鏈表需要提供 添加 修改刪除 除重 合并 排序創建 銷毀等接口。
不能調用庫函數或者使用STL等類庫
題目延伸***********逆置鏈表**********
| LinkNode.h |
| #ifndef LINKNODE_H #define LINKNODE_H #include <iostream> ? class LinkNode { public: ??? int m_idata; ??? LinkNode* m_pnext; }; ? #endif // LINKNODE_H |
| LinkList.h |
| #ifndef LINKLIST_H #define LINKLIST_H #include <iostream> #include "LinkNode.h" ? using namespace std; ? class LinkList { public: ??? //作為頭節點 ??? LinkNode *m_head; ??? //作為尾節點 ??? LinkNode *m_tail; public: ??? LinkList(); ??? ~LinkList(); ??? void ListInsertIndex(int index,int value); ??? //前插 ??? void ListInsertHead(int value); ??? //尾插 ??? void ListInsertTail(int value); //??? int ListMerge(LinkList &srclist); ??? //對鏈表進行排序 ??? void ListSort(bool flag); ??? void ListRemove(int index); ??? //顯示所有 ??? void ListShow(); ??? LinkNode * ListFindIndex(int index); ??? //查找第一個出現指定值的節點的地址 ??? LinkNode * ListFindValue(int value); ??? void ListUpdate(int index,int value); ??? //void ListRemoveSame(); }; ? #endif // LINKLIST_H |
| LinkList.cpp |
| #include "LinkList.h" ? /** ?* @brief LinkList::LinkList ?*/ LinkList::LinkList() { ??? //init m_head and m_tail ??? this->m_head = NULL; ??? this->m_tail = NULL; ??? std::cout << "LinkNode constructor" << std::endl; } ? /** ?* @brief LinkList::~LinkList ?*/ LinkList::~LinkList() { ??? std::cout << "~LinkNode" << std::endl; } ? /** ?* @brief LinkList::ListInsertIndex,這里方法默認是在節點的后面插入參數 ?* @param value 要插入的值 ?* @return 返回開始節點 ?*/ void LinkList::ListInsertIndex(int index,int value) { ??? //先查找到第一次出現value的位置 ??? LinkNode *pNode = this->ListFindIndex(index); ??? LinkNode* pNewNode = new LinkNode; ??? pNewNode->m_idata = value; ??? pNewNode->m_pnext = NULL; ? ??? if(pNode == this->m_head) ??? { ??????? this->m_head->m_pnext = pNewNode; ??????? this->m_tail = pNewNode; ??? } ??? else ??? { ??????? //新建一個節點 ??????? pNewNode->m_pnext = pNode->m_pnext; ??????? pNode->m_pnext = pNewNode; ??? } } ? /** ?* @brief LinkList::ListInsertHead 前插數據 ?* @param value插入的值 ?*/ void LinkList::ListInsertHead(int value) { ??? //1.創建一個新的LinkNode節點 ??? LinkNode *pNode = new LinkNode(); ??? pNode->m_idata = value; ??? pNode->m_pnext = NULL; ? ??? //判斷鏈表是否為空 ??? if(this->m_head == NULL && this->m_tail == NULL) ??? { ??????? this->m_head = pNode; ??????? this->m_tail = pNode; ??? } ??? else ??? { ??????? pNode->m_pnext = this->m_head; ????? ??this->m_head = pNode; ??? } } ? /** ?* @brief LinkList::ListInsertTail 尾部插入值 ?* @param value 要插入的值 ?*/ void LinkList::ListInsertTail(int value) { ??? //1.創建一個新的LinkNode節點pNode ??? LinkNode *pNode = new LinkNode(); ??? pNode->m_idata = value; ??? pNode->m_pnext = NULL; ? ??? //2.判斷鏈表是否為空 ??? if(this->m_head == NULL && this->m_tail == NULL) ??? { ??????? this->m_head = pNode; ??????? //m_tail表示最后一個節點 ??????? this->m_tail = pNode; ??? } ??? else ??? { ??????? //尾部節點的下一個節點是新創建的這個節點 ??????? this->m_tail->m_pnext = pNode; ??????? this->m_tail = this->m_tail->m_pnext; ??? } } ? /** ?* @brief LinkList::ListSort 對鏈表進行排序 ?* @param flag 當表示true的時候降序,當false的時候升序 ?* @return ?*/ void LinkList::ListSort(bool flag) { ??? if(!flag) ??? { ??????? //升序 ??????? for(LinkNode* p1 = this->m_head;p1!=NULL;p1=p1->m_pnext) ??????? { ??????????? for(LinkNode *p2 = this->m_head;p2!=NULL;p2=p2->m_pnext) ??????????? { ??????????????? if(p1->m_idata > p2->m_idata) ??????????????? { ??????????????????? LinkNode pNode; ????????? ??????????pNode.m_idata = p1->m_idata; ??????????????????? p1->m_idata = p2->m_idata; ??????????????????? //交換數據 ??????????????????? p2->m_idata = pNode.m_idata; ??????????????? } ??????????? } ??????? } ??? } ??? else ??? { ??????? //降序 ??????? for(LinkNode *p1 = this->m_head;p1!=NULL;p1=p1->m_pnext) ??????? { ??????????? for(LinkNode *p2 =this->m_head;p2!=NULL;p2=p2->m_pnext) ??????????? { ??????????????? if(p1->m_idata < p2->m_idata) ??????????????? { ??????????????????? LinkNode pNode; ???????????????? ???pNode.m_idata = p1->m_idata; ??????????????????? p1->m_idata = p2->m_idata; ??????????????????? p2->m_idata = pNode.m_idata; ??????????????? } ??????????? } ??????? } ??? } } ? /** ?* @brief LinkList::ListRemove 刪除指定的元素 ?* @param index 要刪除的節點 ?*/ void LinkList::ListRemove(int index) { ??? //找到要刪除的節點 ??? LinkNode* pNode = this->ListFindIndex(index); ? ??? //如果沒有找到要刪除節點,則直接返回 ??? if(pNode == NULL) ??? { ??????? return; ??? } ??? else ??? { ??????? if(pNode == this->m_head) ??????? { ??????????? this->m_head = this->m_head->m_pnext; ??????????? delete pNode; ??????????? pNode = NULL; ??????????? return ; ??????? } ??????? //遍歷鏈表 ??????? LinkNode* pTemp = this->m_head; ??????? while(pTemp->m_pnext != NULL) ??????? { ??????????? //如果這個節點的下一個節點恰好是要刪除的節點 ? ??????????if(pTemp->m_pnext == pNode) ??????????? { ??????????????? pTemp->m_pnext = pNode->m_pnext; ??????????????? //刪除節點 ??????????????? delete pNode; ??????????????? pNode = NULL; ??????????????? break; ??????????? } ??????????? //這個臨時的節點向下移動 ???????? ???pTemp = pTemp->m_pnext; ??????? } ? ??????? //如果是最后一個節點 ??????? if(pTemp == pNode) ??????? { ???????????? pTemp->m_pnext = pNode->m_pnext; ???????????? delete pNode; ???????????? pNode = NULL; ???????????? return ; ??????? } ??? } } ? /** ?* @brief LinkList::ListShow 遍歷鏈表 ?*/ void LinkList::ListShow() { ??? //判斷頭節點是否也是空,如果也是空,則返回 ??? if(this->m_head == NULL) ??? { ??????? return; ??? } ??? else ??? { ??????? //1.定義一個臨時的節點 ??????? LinkNode *pTemp = this->m_head; ? ??????? //2.循環,直到最后一個節點 ??????? while(pTemp->m_pnext != NULL) ??????? { ??????????? //輸出參數值 ??????????? std::cout << pTemp->m_idata << "? "; ??????????? //將臨時節點指針向后移 ??????????? pTemp = pTemp->m_pnext; ??????? } ??????? std::cout << pTemp->m_idata << std::endl; ??? } } ? /** ?* @brief ListFindIndex 查找第index個元素的值 ?* @param index 這里的index表示第index這個元素 ?* @return 返回第index個元素的地址 ?*/ LinkNode * LinkList::ListFindIndex(int index) { ??? //1.判斷index是否是小于0的,如果是則肯定沒有,直接返回NULL ??? if(index <= 0) ??? { ??????? std::cout << "index is out of range" << std::endl; ??????? return NULL; ??? } ??? else ??? { ??????? //判斷鏈表是否是空的,如果是空的,輸出結果提示結果然后返回 ??????? if(this->m_head == NULL) ??????? { ??????????? std::cout << "The lenght of LinkList is zero!!" << std::cout << std::endl; ??????????? return NULL; ??????? } ??? ????else ??????? { ??????????? LinkNode *pTemp = this->m_head; ??????????? int _tempIndex = 1; ??????????? while (pTemp->m_pnext != NULL) ??????????? { ??????????????? //當進來了之后先判斷,如果查的標記剛好是這個,則直接返回 ??????????????? if(index == _tempIndex) ??????????????? { ??????????????????? return pTemp; ??????????????? } ??????????????? pTemp = pTemp->m_pnext; ??????????????? //臨時計數加1 ??????????????? _tempIndex++; ??????????? } ??????????? //這里表示恰好這個是最后一個節點 ??????????? if(index == _tempIndex) ??????????? { ?????????????? ?return pTemp; ??????????? } ??????????? else ??????????? { ?????????????? std::cout << "index is out of range!!" << endl; ?????????????? return NULL; ??????????? } ??????? } ??? } } ? /** ?* @brief LinkList::ListFindValue ?* @param value 要查找的值 ?* @return 要查找的值地址 ?*/ LinkNode* LinkList::ListFindValue(int value) { ??? //判斷頭節點是否為空,如果為空,則直接返回 ??? if(this->m_head == NULL) ??? { ??????? return NULL; ??? } ??? else ??? { ??????? //定義一個臨時的節點 ??????? LinkNode *pTemp = this->m_head; ? ??????? //循環遍歷鏈表,直到最后一個節點 ???? ???while(pTemp->m_pnext != NULL) ??????? { ??????????? // 判斷要查找的值和當前值是否相等,如果相等直接返回 ??????????? if(pTemp->m_idata == value) ??????????? { ??????????????? return pTemp; ??????????? } ??????????? else ??????????? { ??????????????? //指針向后移動 ??????????????? pTemp = pTemp->m_pnext; ??????????? } ??????? } ? ??????? //判斷最后一個節點的值是否和要查找的值相等 ??????? if(pTemp->m_idata == value) ??????? { ??????????? return pTemp; ??????? } ??? } } ? /** ?* @brief LinkList::ListUpdate ?* @param index 要更改的值 ?* @param value ?*/ void LinkList::ListUpdate(int index, int value) { ??? LinkNode *pNode = this->ListFindIndex(index); ??? //如果是空,表示沒有找到要修改的值 ??? if(pNode == NULL) ??? { ??????? return; ??? } ??? else ??? { ??????? pNode->m_idata = value; ??? } } |
| #include <iostream> #include "LinkList.h" ? using namespace std; ? int main() { ??? LinkList* linkList = new LinkList(); ? ??? //向鏈表的尾部插入值 ??? linkList->ListInsertTail(1); ??? linkList->ListInsertTail(2); ??? linkList->ListInsertTail(3); ??? //向鏈表的頭部插入值 ??? linkList->ListInsertHead(34); ??? linkList->ListInsertHead(105); ??? linkList->ListInsertIndex(5,125); ? ??? linkList->ListShow(); ? ??? //顯示鏈表中的值 ??? linkList->ListShow(); ??? std::cout << endl; ? ??? //查找節點值為34的節點的地址 ??? LinkNode* pTargetNode = linkList->ListFindValue(3); ??? //顯示出地址 ??? printf("address = %p,data = %d \n",pTargetNode,*pTargetNode); ??? linkList->ListShow(); ? ??? LinkNode* pTargetNode2 = linkList->ListFindIndex(4); ??? printf("pTargetNode2 address = %p,data = %d \n",pTargetNode2,*pTargetNode2); ? ??? linkList->ListUpdate(1,30); ??? linkList->ListShow(); ??? linkList->ListUpdate(3,30); ??? linkList->ListShow(); ? ??? linkList->ListRemove(5); ??? linkList->ListShow(); ? ??? linkList->ListSort(false); ??? linkList->ListShow(); ??? return 0; } |
| 運行結果: |
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的1.使用C++封装一个链表类LinkList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生活常识:如何正确使用电烤鸡架?
- 下一篇: 2.QLabel,QPushButton