0723 單項鏈表

Part 1.完成單向鏈表,并完成下面功能

1.單鏈表節點創建

鏈表是物理空間上不連續的一個結構,需要創建一個next作為指向下一個節點的指針,所以需要建立一個結構體包含數據域,next指針域,記錄長度的數據域。因為長度只有頭節點可以儲存,所以需要建立一個聯合體,head訪問len,普通節點訪問data。

typedef struct Node
{//結構體嵌套共用體union{//普通節點數據域datatype data;//頭結點數據域:鏈表長度int len;};//指針域struct Node *next;
}*linklist;linklist create_node(int flag)
{linklist s = (linklist)malloc(sizeof(struct Node));if(NULL == s){return NULL;}if(flag == 1)//頭節點s->len = 0;else if(flag == 0)//普通節點s->data = 0;s->next = NULL;return s;
}

2.單鏈表的頭插

鏈表的插入需要檢查鏈表是否創建完成,因為每個節點空間不連續,所以得單獨創建。

頭插只需要將需要插入的數據的next指向原第一個節點,再將頭節點的next指向新節點即可。

int head_insert(linklist head,datatype element)
{if(NULL == head)//檢查鏈表是否創建完成return Faulse;linklist s = create_node(0);//創建普通數據節點if(NULL == s)return Faulse;s->data = element;s->next = head->next;head->next = s;head->len++;return Success;
}

3.單鏈表頭刪

需要將頭節點指向第二個節點(p->next->next)即可,然后釋放p->第一個節點

int head_delete(linklist head)
{if(NULL == head || head->len == 0)return Faulse;linklist del = head->next;head->next = del->next;free(del);del = NULL;head->len--;return Success;
}

4.單鏈表的尾插

因為鏈表的最后一個節點都是指向NULL,所以只需要循環尋找最后一個節點,然后將最后一個節點指向新節點,新節點指向NULL即可

int rear_insert(linklist head,datatype element)
{if(NULL == head)return Faulse;linklist s = create_node(0);if(NULL == s)return Faulse;s->data = element;linklist p = head;while(p->next != NULL)//循環尋找原最后節點p=p->next;p->next = s;head->len++;return Success;
}

5.單鏈表遍歷

只需要循環輸出p->data(數據域),然后p = p->next往下一個節點即可完成循環輸出遍歷

int output(linklist head)
{if(NULL == head)return Faulse;linklist p = head->next;while(p != NULL){printf("%d\t",p->data);p=p->next;}printf("\n");
}

6.單鏈表按位置查找

需要判斷給的值是否大于長度,然后循環從0到輸入的位置,進行p=p->next下移,然后輸出即可

int position_select(linklist head,int position)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position; i++)p = p->next;printf("%d個位置是:%d\n",position,p->data);return Success;
}

7.單鏈表按位置刪除

和按位置查找一樣,然后循環從0到輸入的位置,進行p=p->next下移,然后使用尾刪即可。

int position_delete(linklist head,int position)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position-1; i++)p=p->next;linklist del = p->next;p->next = del->next;free(del);head->len--;return Success;
}

8.單鏈表按位置修改

和按位置查找一樣,然后循環從0到輸入的位置,進行p=p->next下移,然后修改p->data修改數據域即可。

int position_change(linklist head,int position,datatype element)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position; i++)p = p->next;p->data = element;return Success;
}

9.單鏈表按元素查找

通過for循環,從第一個節點到最后一個節點進行和輸入值對比,在每次循環記得將p下移,找到輸入值的時候,輸出i即可,既是第i個節點。

int element_select(linklist head,datatype element)
{if(NULL == head)return Faulse;linklist p = head;for(int i = 1; i <= head->len; i++){p = p->next;if(p->data == element)return i;else if(i == head->len+1)printf("沒有這個數\n");}
}

10.單鏈表按元素修改

和按元素查找相似,從第一個節點到最后一個節點進行和輸入值對比,然后找到后,將data數據域修改即可。

int element_change(linklist head,datatype element,datatype changeelement)
{if(NULL == head)return Faulse;linklist p = head;for(int i = 1; i <= head->len; i++){p = p->next;if(p->data == element)		p->data = changeelement;		else if(i == head->len+1)printf("沒有這個數\n");}return Success;
}

11.單鏈表按元素刪除

可以直接在函數里調用元素尋找函數,將返回的地址值,然后賦給按位置刪除函數,刪除即可。

int element_delete(linklist head,datatype element)
{if(NULL == head)return Faulse;int i = element_select(head,element);position_delete(head,i);return Success;
}

12.單鏈表逆置

int reverse(linklist head)
{if(NULL == head)return Faulse;linklist p = head->next;head->next = NULL;for(int i = 0; i < head->len; i++){linklist temp = p;p = p->next;temp->next = head->next;head->next = temp;}return Success;
}

13.單鏈表排序

運用了冒泡排序的基礎模板,只不過內部的交換變成了節點之間的互相連接。交換原理是:1.定義一個s指向p->next(記錄第二個節點)

2.p就能指向p->next->next(第一個節點指向第三個節點)

3.s->next = p(將第二個節點指向第一個節點)

4.p的上一個節點需要指向第二個節點

按上面四步可以完成交換值,但是因為單項鏈表沒辦法調用上一個節點,所以需要定義p(原上一個節點),p->next(原p節點),s = p->next->next(原第二個節點),即每個節點往前移一個節點進行提前比較,換值即可。然后在每次換之后將p往下移(p = p->next)即可(因為鏈表沒使用到循環的i和j,所以步長需要自己增加)。

int sort(linklist head)
{if(NULL == head || head->len <= 1)return Faulse;linklist p = head;printf("%d\n",head->len);for(int i = 1; i < head->len; i++){p = head;for(int j = 0; j < head->len-i; j++){if(p->next->data > p->next->next->data){linklist s = p->next->next;//交換p->next->next = s->next;s->next = p->next;p->next = s;p = p->next;//步增}elsep = p->next;}}return Success;
}

14.單鏈表查找倒數第n個節點

尋找倒數第n個值,需要定義兩個指針,指針之間相差n個節點距離,然后兩個一起后移,當后面一個指針到末尾了,前一個指針就指向倒數第n個值了

int rearnum_select(linklist head,int num)
{	if(NULL == head)return Faulse;linklist p = head;linklist q = head;for(int i = 0; i < num; i++)//令兩個指針相隔n{q = q->next;}while(q != NULL)//一起后移,到底輸出前一個指針{p = p->next;q = q->next;}printf("倒數第%d個數是:%d\n",num,p->data);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90607.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 ASP.NET Web 應用程序(.NET Framework)的花店系統

1.1功能模塊實現1.1.1整體結構界面由兩部分組成&#xff1a;左側導航欄、右側內容展示區。使用了 Bootstrap 5 的樣式庫&#xff0c;并結合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 條件判斷語句來動態生成菜單項。1.1.2導航欄功能模塊導航欄基礎結構導航欄基礎結構使用 Bo…

C++ Qt6 CMake qml文件啟動方式說明

在Qt6之后,Qt程序默認使用CMake進行構建,當然也可以使用qmake, 本篇博客介紹Qt6.8之前和Qt6.8版本中QtQuick程序的啟動方式。 在QtQuick程序main.cpp里qml的文件啟動分為兩種:(1)直接加載qml文件,(2)加載qml模塊,下面分別介紹這兩種啟動方式。 方式1:直接啟動qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼之后存儲比特數是多少?

要計算字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼后的存儲比特數&#xff0c;需按以下步驟進行&#xff1a;步驟 1&#xff1a;統計字符出現頻率先統計字符串中每個字符的出現次數&#xff1a;a&#xff1a;出現 6 次s&#xff1a;出現 6 次d&#xff1a;出現 1 次j&a…

什么是游戲盾(高防版)?

隨著網絡游戲產業的快速發展&#xff0c;游戲服務器的安全問題日益受到關注。DDoS攻擊、CC攻擊等網絡威脅常常導致游戲卡頓、斷線甚至服務器宕機&#xff0c;嚴重影響玩家體驗。游戲盾&#xff08;高防版&#xff09;是一種專為游戲業務設計的網絡安全防護服務&#xff0c;集成…

openGauss數據庫在CentOS 7 中的單機部署與配置

部署 版本選擇 通過openGuass官網下載地址 &#xff0c;我們可以看到它支持x86_64與Aarch64兩種平臺&#xff0c;又分成openEuler 22、openEuler 20、Centos 7以及Docker 版本。 進入CentOS 7標簽&#xff0c;看到又分成企業版、輕量版、極簡版與分布式鏡像版。 本文只討論…

HTTP響應狀態碼詳解

HTTP 響應狀態碼&#xff08;HTTP Status Code&#xff09;是服務器在響應客戶端請求時返回的 3 位數字代碼&#xff0c;用于表示請求的處理狀態。以下是常見的 HTTP 狀態碼及其含義&#xff1a; 1xx&#xff08;信息性狀態碼&#xff09; 表示請求已被接收&#xff0c;需要繼…

Pytorch中register_buffer和torch.nn.Parameter的異同

說下register_buffer和Parameter的異同 相同點方面描述追蹤都會被加入 state_dict&#xff08;模型保存時會保存下來&#xff09;。與 Module 的綁定都會隨著模型移動到 cuda / cpu / float() 等而自動遷移。都是 nn.Module 的一部分都可以通過模塊屬性訪問&#xff0c;如 self…

吉吉巳資源整站源碼完整打包,適用于搭建資源聚合/整合類站點,全網獨家,拿來就用

想要搭建一個資源整合站點&#xff0c;如影視聚合類站點、資訊聚合類站點、圖集聚合類站點等&#xff0c;需要花費大量的時間來查找合適的系統或源碼。然后要去測試&#xff0c;修復bug&#xff0c;一直到能夠正常的運營使用&#xff0c;花費的時間絕對不短&#xff0c;今天分享…

嵌入式學習的第三十五天-進程間通信-HTTP

TCP/IP協議模型&#xff1a;應用層&#xff1a;HTTP;傳輸層&#xff1a;TCP UDP;網絡層&#xff1a;IPv4 IPv6網絡接口層一、HTTP協議1. 萬維網WWW(World Wide Web) 世界范圍內的&#xff0c;聯機式的信息儲藏所。 萬維網解決了獲取互聯網上的數據時需要解決的以下問題&#x…

es 和 lucene 的區別

1. Lucene 是“發動機”&#xff0c;ES 是“整車”Lucene&#xff1a;只是一個 Java 庫&#xff0c;提供倒排索引、分詞、打分等底層能力。你必須自己寫代碼處理索引創建、更新、刪除、分片、分布式、故障恢復、API 封裝等所有邏輯。Elasticsearch&#xff1a;基于 Lucene 的分…

AS32S601 系列 MCU芯片GPIO Sink/Source 能力測試方法

一、引言隨著電子技術的飛速發展&#xff0c;微控制器&#xff08;MCU&#xff09;在工業控制、汽車電子、商業航天等眾多領域得到了廣泛應用。國科安芯推出的AS32S601 系列 MCU 以其卓越的性能和可靠性&#xff0c;成為了眾多設計工程師的首選之一。為了確保其在實際應用中的穩…

JAVA-08(2025.07.24學習記錄)

面向對象類package com.mm;public class Person {/*** 名詞-屬性*/String name;int age;double height;/*** 動詞-方法*/public void sleep(String add) {System.out.println("我在" add "睡覺");}public String introduce() {return "我的名字是&q…

地下隧道管廊結構健康監測系統 測點的布設及設備選型

隧道監測背景 隧道所處地下環境復雜&#xff0c;在施工過程中會面臨圍堰變形、拱頂沉降、凈空收斂、初襯應力變化、土體塌方等多種危險情況。在隧道營運過程中&#xff0c;也會受到材料退化、地震、人為破壞等因素影響&#xff0c;引發隧道主體結構的劣化和損壞&#xff0c;若不…

node.js卸載與安裝超詳細教程

文章目錄一、卸載Step1&#xff1a;通過控制面板刪除node版本Step2&#xff1a;刪除node的安裝目錄Step3&#xff1a;查找.npmrc文件是否存在&#xff0c;有就刪除。Step4&#xff1a;查看以下文件是否存在&#xff0c;有就刪除Step5&#xff1a;打開系統設置&#xff0c;檢查系…

飛算JavaAI“刪除接口信息” 功能:3 步清理冗余接口,讓管理效率翻倍

在飛算JavaAI的接口設計與管理流程中&#xff0c;“刪除接口信息” 功能為用戶提供了靈活調整接口方案的便利。該功能的存在&#xff0c;讓用戶能夠在接口生命周期的前期&#xff08;審核階段&#xff09;及時清理無需創建的接口&#xff0c;保證接口管理的簡潔性與高效性。一、…

行業熱點丨SimLab解決方案如何高效應對3D IC多物理場與ECAD建模挑戰?

半導體行業正快速超越傳統2D封裝技術&#xff0c;積極采用 3D集成電路&#xff08;3D ICs&#xff09;和2.5D 先進封裝等方案。這些技術通過異構芯粒、硅中介層和復雜多層布線實現更高性能與集成度。然而&#xff0c;由于電子計算機輔助設計&#xff08;ECAD&#xff09;數據規…

2025暑期—05神經網絡-BP網絡

按誤差反向傳播(簡稱誤差反傳)訓練的多層前饋網絡線性回歸或者分類不需要使用神經元&#xff0c;原有最小二程即可。求解J依次變小。使用泰勒展開&#xff0c;只看第一階。偏導是確定的&#xff0c;需要讓J小于0的delta WkWk構造完成后 J&#xff08;Wk1&#xff09;已知&#…

qml的信號槽機制

qml的信號槽機制和qtwidget差不多&#xff0c;但是使用方法不一樣&#xff0c;qtwidget一般直接用connect函數把信號和槽一綁定就完事了&#xff0c;qml分為自動綁定和手動綁定。信號自動綁定在一個組件里面定義一個信號&#xff0c;用signal定義&#xff0c;當事件觸發&#x…

Unity國際版下載鏈接分享(非c1國內版)

轉載Unity國際版下載鏈接分享&#xff08;非c1國內版&#xff09; - 嗶哩嗶哩 大家平時使用Unity注意一下會發現&#xff0c;現在我們下載的Unity版本號后面都一個c1&#xff0c;但是大家在B站學習時大神UP主們使用的Unity版本號大都是沒有c1的。 例如&#xff1a;我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在復雜的系統中&#xff0c;每個業務實體都需要使用ID做唯一標識&#xff0c;以方便進行數據操作。例如&#xff0c;每個用戶都有唯一的用戶ID&#xff0c;每條內容都有唯一的內容ID&#xff0c;甚至每條內容下的每條評論都有唯一的評論ID。 4.1.1 全局唯一與UUID 在互聯網還未…