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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

链表结构及操作

發(fā)布時(shí)間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表结构及操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是鏈表結(jié)構(gòu):

? 鏈表結(jié)構(gòu)是由許多節(jié)點(diǎn)構(gòu)成的,每個(gè)節(jié)點(diǎn)都包含兩部分:

  • ? 數(shù)據(jù)部分:保存該節(jié)點(diǎn)的實(shí)際數(shù)據(jù)。
  • ? 地址部分:保存的是下一個(gè)節(jié)點(diǎn)的地址。
  • 鏈表的特點(diǎn):

  • 結(jié)點(diǎn)在存儲(chǔ)器中的位置是任意的,即邏輯上相鄰的數(shù) 據(jù)元素在物理上不一定相鄰
  • 訪問(wèn)時(shí)只能通過(guò)頭指針進(jìn)入鏈表,并通過(guò)每個(gè)結(jié)點(diǎn)的 指針域向后掃描其余結(jié)點(diǎn),所以尋找第一個(gè)結(jié)點(diǎn)和最后一 個(gè)結(jié)點(diǎn)所花費(fèi)的時(shí)間不等
  • 鏈表的優(yōu)點(diǎn):

  • 數(shù)據(jù)元素的個(gè)數(shù)可以自由擴(kuò)充 、插入、刪除等操作不必移動(dòng)數(shù)據(jù),只需 修改鏈接指針,修改效率較
  • ?

    鏈表的缺點(diǎn):

  • 存儲(chǔ)密度小 、存取效率不高,必須采用順序存取,即存 取數(shù)據(jù)元素時(shí),只能按鏈表的順序進(jìn)行訪問(wèn)?
  • ?

    ?

    在進(jìn)行鏈表操作時(shí),首先需要定義一個(gè)頭指針變量(head表示),該指針變量指向鏈表的第一個(gè)節(jié)點(diǎn)。

    最后一個(gè)節(jié)點(diǎn)不再指向其他節(jié)點(diǎn)(單鏈表),稱為表尾。

    ?

    單鏈表:

  • 像上面的鏈?zhǔn)浇Y(jié)構(gòu)一樣,每個(gè)節(jié)點(diǎn)包含一個(gè)指針指向下一個(gè)節(jié)點(diǎn)。
  • 鏈表數(shù)據(jù)表示:

    typedef struct {char key[10]; //關(guān)鍵字char name[20];int age; }Data; //數(shù)據(jù)節(jié)點(diǎn)類型typedef struct Node {Data nodeData; //數(shù)據(jù)域struct Node *nextNode; //指針域 }CLType;

    ?

    添加節(jié)點(diǎn)步驟:

  • 單鏈表節(jié)點(diǎn)添加可以在任意位置插入,且不需要移動(dòng)數(shù)據(jù)元素,只需修改鏈表的指針域即可。插入時(shí)間復(fù)雜度為O(1)。
  • 首先分配內(nèi)存空間,保存新增節(jié)點(diǎn)。
  • 從頭指針 head 開(kāi)始逐個(gè)檢查,直到找到要插入的位置。
  • 將插入節(jié)點(diǎn)前一個(gè)節(jié)點(diǎn)指針指向要插入的節(jié)點(diǎn)地址,在修改當(dāng)前節(jié)點(diǎn)指針域指向下一個(gè)節(jié)點(diǎn)地址,把鏈表連接起來(lái)。
  • 若插入位置為表尾,則把節(jié)點(diǎn)指針域置為空(NULL)。
  • ? ?添加鏈表實(shí)現(xiàn)代碼:

    //在鏈表尾添加節(jié)點(diǎn) CLType *CLAddEnd(CLType *head, Data nodeData) {CLType *node, *htemp;node = new CLType;if (!node){std::cout << "內(nèi)存申請(qǐng)失敗." << std::endl;return NULL;}else{node->nodeData = nodeData; //保存數(shù)據(jù)node->nextNode = nullptr; //將節(jié)點(diǎn)置為NULL,當(dāng)前插入位置為表尾if (head == nullptr){head = node; return head;}htemp = head;while (htemp->nextNode != nullptr) //查找鏈表的末尾{htemp = htemp->nextNode;}htemp->nextNode = node; //修改指針域把鏈表連接起來(lái)return head;} }

    在鏈表頭插入頭節(jié)點(diǎn)步驟:

    ? 1 .首先分配內(nèi)存空間,保存新增節(jié)點(diǎn)。

    ? 2 .使新增節(jié)點(diǎn)指向頭指針 head所指向的節(jié)點(diǎn)。

    ? 3 .然后使頭指針 head指向新增節(jié)點(diǎn)。

    //在鏈表頭插入節(jié)點(diǎn) CLType *CLAddFirst(CLType *head, Data nodedata) {CLType *node = new CLType;if (!node) //內(nèi)存分配失敗{std::cout << "內(nèi)存申請(qǐng)失敗!" << std::endl;return nullptr;}else{node->nodeData = nodedata; //保存數(shù)據(jù)node->nextNode = head; //指向頭指針?biāo)腹?jié)點(diǎn)head = node; //頭指針指向新增節(jié)點(diǎn)return head;} }

    ?

    查找節(jié)點(diǎn):

    ??

    ?

    //查找節(jié)點(diǎn) CLType *CLFindNode(CLType *head, char *key) {CLType *htemp;htemp = head; //保存鏈表頭指針while (htemp) //若節(jié)點(diǎn)有效,則進(jìn)行循環(huán)查找{if (strcmp(htemp->nodeData.key, key) == 0) //若節(jié)點(diǎn)關(guān)鍵字與傳入關(guān)鍵字相同{return htemp; //return 該節(jié)點(diǎn)指針}htemp = htemp->nextNode; //進(jìn)行迭代查找}return nullptr; //不存在,返回空指針 }

    ?

    隨機(jī)插入節(jié)點(diǎn)步驟:

    ?1 .首先分配內(nèi)存,保存新增節(jié)點(diǎn)。

    ?2 .找到要插入的邏輯位置,也就是要插入某兩個(gè)節(jié)點(diǎn)之間。

    ?3 .修改插入位置的節(jié)點(diǎn)指針,使其指向新增節(jié)點(diǎn),而使新增節(jié)點(diǎn)指向原插入位置所指向的節(jié)點(diǎn)

    ?

    //隨機(jī)插入節(jié)點(diǎn) CLType *CLinsertNode(CLType *head, char *findkey, Data nodedata) {CLType *node, *nodetemp; node = new CLType; //分配保存的節(jié)點(diǎn)內(nèi)存if (!node) //內(nèi)存分配失敗{std::cout << "內(nèi)存申請(qǐng)失敗." << std::endl; return nullptr;}node->nodeData = nodedata; //保存節(jié)點(diǎn)中的數(shù)據(jù)nodetemp = CLFindNode(head, findkey); if (nodetemp) //若找到要插入的節(jié)點(diǎn){node->nextNode = nodetemp->nextNode; //新插入節(jié)點(diǎn)指向關(guān)鍵節(jié)點(diǎn)的下一節(jié)點(diǎn)nodetemp->nextNode = node; //設(shè)置關(guān)鍵節(jié)點(diǎn)指向新插入節(jié)點(diǎn)}else{std::cout << "未找到正確的插入位置." << std::endl;delete node; //釋放內(nèi)存}return head; //返回頭指針 }

    ?刪除節(jié)點(diǎn)步驟:

    ?1 .查找要?jiǎng)h除的節(jié)點(diǎn)

    ?2 .使前一節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)下一節(jié)點(diǎn)

    ?3 .刪除節(jié)點(diǎn)

    //刪除節(jié)點(diǎn) int CLDeleteNode(CLType *head, char *key) {CLType *node, *htemp; //node保存刪除節(jié)點(diǎn)的前一節(jié)點(diǎn)htemp = head;node = head;while (htemp){if (strcmp(htemp->nodeData.key, key) == 0) //找到關(guān)鍵字,執(zhí)行刪除操作{node->nextNode = htemp->nextNode; //使前一節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)的下一節(jié)點(diǎn)delete htemp; //釋放內(nèi)存return 1;}else{node = htemp; //指向當(dāng)前節(jié)點(diǎn)htemp = htemp->nextNode; //指向下一節(jié)點(diǎn)}}return 0; //刪除失敗 }

    ?

    計(jì)算鏈表長(zhǎng)度

    //計(jì)算鏈表長(zhǎng)度 int CLLength(CLType *head) {CLType *htemp;int len = 0;htemp = head;while (htemp) //遍歷鏈表{len++; //累計(jì)節(jié)點(diǎn)數(shù)htemp = htemp->nextNode; //處理下一節(jié)點(diǎn)}return len; //return 節(jié)點(diǎn)數(shù) }

    ?

    顯示所有節(jié)點(diǎn):

    //顯示所有節(jié)點(diǎn) void CLAllNode(CLType *head) {CLType *htemp;Data nodeData;htemp = head;std::cout << "當(dāng)前鏈表共有: " << CLLength(head) << "個(gè)節(jié)點(diǎn),鏈表數(shù)據(jù)如下: "<<std::endl;while (htemp){nodeData = htemp->nodeData;std::cout << "節(jié)點(diǎn): " << nodeData.key << " " << nodeData.name << " " << nodeData.age << std::endl;htemp = htemp->nextNode;} }

    ?

    main 函數(shù):

    int main() {CLType *node, *head = nullptr;Data nodeData;char key[10], findkey[10];cout << "請(qǐng)輸入鏈表中的數(shù)據(jù),格式為: 關(guān)鍵字 姓名 年齡 " << endl;do {cin >> nodeData.key;if (strcmp(nodeData.key, "0") == 0)break; //若輸入為0,則退出else{cin >> nodeData.name>>nodeData.age;head = CLAddEnd(head, nodeData);}} while (1);CLAllNode(head);cout << " 輸入插入位置的關(guān)鍵字: ";cin >> findkey;cout << "輸入插入節(jié)點(diǎn)的數(shù)據(jù)(關(guān)鍵字 姓名 年齡 ): \n";cin >> nodeData.key >> nodeData.name >> nodeData.age;head = CLinsertNode(head, findkey, nodeData);CLAllNode(head);cout << "刪除節(jié)點(diǎn),輸入要?jiǎng)h除的關(guān)鍵字: " << endl;cin >> key;CLDeleteNode(head, key);CLAllNode(head);cout << "查找關(guān)鍵字,輸入要查找的關(guān)鍵字: " << endl;cin >> key;node = CLFindNode(head, key);if (node){nodeData = node->nodeData;cout << "關(guān)鍵字" << key << " 對(duì)應(yīng)的節(jié)點(diǎn)為" << key << nodeData.key << nodeData.name << nodeData.age;}else{cout << "未找到關(guān)鍵字";}cout << endl;system("pause");return 0; }

    ?

    測(cè)試結(jié)果:

    ?

    總結(jié)

    以上是生活随笔為你收集整理的链表结构及操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。