<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
概念:連結串列是一種物理儲存結構上非連續、非順序的儲存結構
資料元素的邏輯順序是通過連結串列中的指標鏈 接次序實現的
圖示:
注意:
連結串列結構在邏輯上為連續的,但是物理上(記憶體中)不一定連續
連結串列節點都是在堆上申請出來的,申請空間按一定策略分配
結構種類
連結串列具有多種結構:單向雙向,帶頭不帶頭,迴圈非迴圈
實際上最常用的是:無頭單向非迴圈連結串列,帶頭雙向迴圈連結串列
注意:這裡實現的是無頭單向非迴圈連結串列
// 動態申請一個節點 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 void SListInsertAfter(SListNode* pos, SLTDateType x); // 單連結串列刪除pos位置之後的值 void SListEraseAfter(SListNode* pos);
typedef int SLTDateType; typedef struct SListNode { SLTDateType data; struct SListNode* next; }SListNode;
對於連結串列來說,每需要空間就需要進行開闢,這裡我們將之封裝成一個函數,便於後續呼叫直接使用(開闢的同時進行賦值)
參考程式碼:
//連結串列節點開闢 SLTNode* BuySListNode(SLTDateType x) { //動態分配一個節點 SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); if (newnode == NULL) { //分配失敗則列印錯誤資訊並結束程序 perror("newnode fail:"); exit(-1); } //成功則進行賦值 newnode->data = x; newnode->next = NULL; //返回節點地址,以便後續操作 return newnode; }
注意:
1.對於不帶頭的連結串列來說,列印資料不需要修改連結串列首節點地址(故只要傳連結串列指標)
2.用迴圈遍歷連結串列,每列印資料,需要指向下一個節點
3.依靠尾節點的址域為NULL來結束迴圈
程式碼:
//連結串列資料列印 void SListPrint(SLTNode* phead)//一級指標接收一級指標(列印不需改變指標本身內容) { //建立一個定址指標 SLTNode* cur = phead; while (cur!=NULL)//後續還有節點 { //列印資料並指向下一個節點 printf("%d->", cur->data); cur = cur->next; } //最後列印空指標 printf("NULLn"); return; }
程式碼:
//連結串列尾插資料 void SListPushBack(SLTNode** pphead, SLTDateType x)//二級指標接收一級指標(尾插存在需改變連結串列指標本身內容) { //避免傳入錯誤(直接報錯便於找到錯誤位置) assert(pphead); //接收新節點的地址 SLTNode* newnode=BuySListNode(x); //頭節點為空 if (*pphead == NULL) { *pphead = newnode; } else { //找尾節點 SLTNode* tail = *pphead;//建立定址節點 //兩個及以上節點的情況 while (tail->next != NULL) { //指向下一個節點 tail = tail->next; } //找到了 tail->next = newnode; } return; }
注意程式碼中的assert的作用:
注意:
程式碼:
//連結串列前刪資料 void SListPopFront(SLTNode** pphead) { //避免傳入錯誤(直接報錯便於找到錯誤位置) assert(pphead); //連結串列為空的情況 if (*pphead == NULL) { return; } //建立指標儲存第二個節點地址 SLTNode* next = (*pphead)->next; //釋放當前頭結點空間 free(*pphead); //更新頭結點資料 *pphead = next; return; }
注意:
程式碼:
//連結串列資料查詢 SLTNode* SListFind(SLTNode* phead, SLTDateType x) { //建立定址指標 SLTNode* cur = phead; while (cur!=NULL) { if (cur->data == x)//找到資料符合節點 { return cur;//返回節點地址(好處:以便後續再尋找或修改) } else { //找下一個節點 cur = cur->next; } } //未找到資料符合節點 return NULL; }
注意:
程式碼:
//連結串列pos位置往前插入(較難)(還有在pos位置之後插入,簡單點) void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x) { //避免傳入錯誤(直接報錯便於找到錯誤位置) assert(pphead); assert(pos); SLTNode* newnode = BuySListNode(x); //首結點符合的情況 if (*pphead == pos) { newnode->next = *pphead; *pphead = newnode; } else { //建立定址指標 SLTNode* cur = *pphead; while (cur !=NULL) { if (cur->next!= pos) { cur = cur->next;//找到下一節點 } else // 找到對應空間 { cur->next = newnode; newnode->next = pos; return;//結束尋找(否則會一直插入,造成死迴圈) } } } //未找到則什麼也不幹 return; }
注意:
ps:一定要注意修改連結節點址域的先後,避免地址的丟失
程式碼:
//連結串列pos位置往後插入 void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x) { SLTNode* newnode = BuySListNode(x); newnode->next = pos->next; pos->next = newnode; return; }
注意:
參考程式碼:
//連結串列pos位置刪除 void SListErase(SLTNode** pphead, SLTNode* pos) { //避免傳入錯誤(直接報錯便於找到錯誤位置) assert(pphead); assert(pos); //頭結點符合的情況 if (*pphead == pos) { *pphead = (*pphead)->next; free(pos); } else { //建立定址指標 SLTNode* cur = *pphead; while (cur != NULL) { if (cur->next != pos) { cur = cur->next;//找到下一節點 } else // 找到對應空間 { SLTNode* next = cur->next->next; free(cur->next); cur->next = next; return;//結束尋找 } } } //未找到則什麼也不幹 return; }
注意:
參考程式碼:
//連結串列節點釋放 void SListDestory(SLTNode** pphead) { //避免傳入錯誤(直接報錯便於找到錯誤位置) assert(pphead); //遍歷釋放 SLTNode* cur = *pphead; while (cur) { //儲存下一個地址 SLTNode* next = cur->next; free(cur); cur = next; } //置空 *pphead = NULL; return; }
優點
缺點
優點
缺點
到此這篇關於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