日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

1.使用C++封装一个链表类LinkList

發布時間:2024/9/27 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。