<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
(❁´◡`❁) 單連結串列
上篇順序表結尾瞭解了順序表的諸多缺點,連結串列的特性很好的解決了這些問題,本期我們來認識單連結串列。
連結串列是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結依次實現的。
連結串列也可以分為很多種
1. 單向或者雙向
2. 帶頭或者不帶頭
3. 迴圈或非迴圈
我們最常用的還是無頭單向非迴圈連結串列和帶頭雙向迴圈連結串列 本篇我們實現無頭單向非迴圈連結串列增刪查改
基本結點結構
typedef int SLTDateType; typedef struct SListNode { SLTDateType data; struct SListNode* next; }SListNode;
標頭檔案
//llist.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> typedef int SLTDateType; typedef struct SListNode { SLTDateType data; struct SListNode* next; }SListNode; // 動態申請一個節點 SListNode* BuySListNode(SLTDateType x); // 單連結串列列印 void SListPrint(SListNode* plist); // 單連結串列尾插 void SListPushBack(SListNode** pplist, SLTDateType x); // 單連結串列的頭插 void SListPushFront(SListNode** pplist, SLTDateType x); // 單連結串列的尾刪 void SListPopBack(SListNode** pplist); // 單連結串列頭刪 void SListPopFront(SListNode** pplist); // 單連結串列查詢 SListNode* SListFind(SListNode* plist, SLTDateType x); // 單連結串列在pos位置之後插入x // 分析思考為什麼不在pos位置之前插入? void SListInsertAfter(SListNode* pos, SLTDateType x); // 單連結串列刪除pos位置之後的值 // 分析思考為什麼不刪除pos位置? void SListEraseAfter(SListNode* pos); // 單連結串列的銷燬 void SListDestory(SListNode* plist);
動態申請一個節點
// 動態申請一個節點 SListNode* BuySListNode(SLTDateType x) { SListNode* newnode = (SListNode*)malloc(sizeof(SListNode)); if (newnode == NULL)//申請失敗 { printf("malloc failn"); exit(-1); } else { newnode->data = x; newnode->next = NULL; } return newnode; }
單連結串列列印
連結串列單個結點中,data儲存資料,next儲存下一個結點的地址,可以通過next存取下一個結點
// 單連結串列列印 void SListPrint(SListNode* plist) { SListNode* cur = plist; while (cur != NULL) { printf("%d->", cur->data); cur = cur->next;//存取下一個結點 } printf("NULLn"); }
單連結串列尾插
這裡傳入了頭結點的地址的指標,是因為有可能要改變頭結點的情況,傳址呼叫幻術,如果只傳入*plist,相當於只改變形參,實參不會有實際改變,通過pplist可以解決這個問題
// 單連結串列尾插 void SListPushBack(SListNode** pplist, SLTDateType x) { SListNode* newnode = BuySListNode(x); if (*pplist == NULL)//空連結串列 { *pplist = newnode; } else { SListNode* tail = *pplist;//遍歷至最後插入 while (tail->next != NULL) { tail = tail->next; } tail->next = newnode; } }
單連結串列的尾刪
一前一後遍歷,找到空後直接free(tail),將prev->next置空即可
// 單連結串列的尾刪 void SListPopBack(SListNode** pplist) { assert(pplist); if (*pplist == NULL)//空連結串列,無需刪除 { return; } else { SListNode* prev = NULL; SListNode* tail = *pplist; { while (tail->next != NULL) { prev = tail; tail = tail->next; } free(tail); tail = NULL; prev->next = NULL; } } }
單連結串列的頭插
有點繞,要多想想
// 單連結串列的頭插 void SListPushFront(SListNode** pplist, SLTDateType x) { assert(pplist); SListNode* newnode = BuySListNode(x); newnode->next = *pplist; *pplist = newnode; }
單連結串列頭刪
比較簡單
// 單連結串列頭刪 void SListPopFront(SListNode** pplist) { assert(pplist); if (*pplist == NULL)//連結串列為空 { return; } else { SListNode* next = (*pplist)->next; free(*pplist); *pplist = next; } }
// 單連結串列查詢 遍歷即可 SListNode* SListFind(SListNode* plist, SLTDateType x) { SListNode* cur = plist; while (cur != NULL) { if (cur->data = x) { return cur; } cur = cur->next; } retuen NULL; }
*單連結串列在pos位置之後插入x
為什麼不在pos之前插入,由於我們是單向連結串列,需要從頭遍歷查詢pos,如果在pos之前插入,找到pos還需找到pos之前的地址,對所傳引數不友好,所以我們一般在後插入
//單連結串列在pos位置之後插入x void SListInsertAfter(SListNode* pos, SLTDateType x) { assert(pos); SListNode* newnode = BuySListNode(x); newnode->next = pos->next; pos->next = newnode; }
單連結串列刪除pos位置之後的值 為什麼不刪除pos位置,同上,在邏輯上和傳參不友好.
// 單連結串列刪除pos位置之後的值 void SListEraseAfter(SListNode* pos) { assert(pos); SListNode* next = pos->next; if (next) { pos->next = next->next; free(next); next = NULL; } }
單連結串列的銷燬 連結串列不像順序表連續刪頭就可以,由於連結串列是一個一個分散的結點,需要逐一刪除
// 單連結串列的銷燬 void SListDestory(SListNode** pplist) { assert(*pplist); SListNode* cur = *pplist; while (cur) { SListNode* next = cur->next; free(cur); cur = next; } *pplist = NULL; }
連結串列相比但連結串列難度提升不少,對c的掌握也變大,不清晰的地方要多想多畫圖。還請斧正
到此這篇關於C++ 資料結構超詳細講解單連結串列的文章就介紹到這了,更多相關C++ 單連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45