C語言-鏈表_基礎

鏈表-基礎

1. 數組

1.1 靜態數組

例子:int nums[5] = {0};struct person ps[5];
缺點:1,無法修改地址2,無法動態定義長度3,占用內存過大或過小4,增刪速度慢
優點數組的內存是連續開辟的,所以讀取速度快

1.2 動態數組

例子:int *nums = (int *) calloc(5,sizeof(int));struct person *ps = (struct person *)calloc(5,sizeof(struct person));
缺點:增刪速度慢編寫代碼較為復雜
優點:讀取效率高

2. 常用數據結構

1、數組結構:內存連續開辟

2、鏈表結構:離散開辟

3、樹

4、二叉樹(均衡二叉樹,非均衡二叉樹)

5、圖

3. 鏈表結構

分類:

單鏈表:

  • 一個節點只記錄下一個節點的地址

雙鏈表:

  • 一個節點即記錄下一個節點的地址,也記錄上一個節點的地址

4. 設計節點

需求:將多個學員信息設計為鏈表

單鏈表節點設計:

typedef struct student
{//數據域char name[50];char sex[5];int num;double score;//指針域struct student *next;
}Stu;

雙鏈表節點設計:

typedef truct student
{//數據域char name[50];char sex[5];int num;double score;//指針域struct student *next;struct student *head;
}Stu;

總結:

typedef struct 結構體名稱
{//數據域//指針域
}別名;

5. 靜態單鏈表

#include <stdio.h>
typedef struct student
{//數據域char name[50];char sex[5];int num;double score;//指針域struct student *next;
}Stu;
int main(int argc, char const *argv[])
{Stu s01 = {"張三", "男", 1, 99, NULL};Stu s02 = {"李四", "男", 2, 96, NULL};Stu s03 = {"王五", "女", 3, 97, NULL};Stu s04 = {"錢七", "男", 4, 93, NULL};Stu s05 = {"趙八", "女", 5, 97, NULL};Stu *head = &s01;   //將s01作為首節點s01.next = &s02;    //將s02設置為s01的下一個節點   s02.next = &s03;s03.next = &s04;s04.next = &s05;//鏈表的遍歷//pd:當前鏈表的節點Stu *pd = head;while(pd != NULL){printf("%s %s %d %.2lf\n", pd->name, pd->sex, pd->num, pd->score);//下一個節點賦值給當前節點,為下一輪循環pd = pd->next;}return 0;
}

6. 動態單鏈表

動態開辟內存,存儲結構體學生信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{//數據域char name[50];char sex[5];int age;//指針域struct student *next;
}Stu;
int main(int argc, char const *argv[])
{Stu *s01 = calloc(1,sizeof(Stu));strcpy(s01->name, "陳晴朗");strcpy(s01->sex, "男");s01->age = 18;Stu *s02 = calloc(1,sizeof(Stu));strcpy(s02->name, "李槐");strcpy(s02->sex, "男");s02->age = 8;Stu *s03 = calloc(1,sizeof(Stu));strcpy(s03->name, "李寶瓶");strcpy(s03->sex, "女");s03->age = 14;Stu *s04 = calloc(1,sizeof(Stu));strcpy(s04->name, "裴錢");strcpy(s04->sex, "女");s04->age = 12;Stu *s05 = calloc(1,sizeof(Stu));strcpy(s05->name, "崔東山");strcpy(s05->sex, "男");s05->age = 16;Stu *head = s01;   //將s01作為首節點s01->next = s02;    //將s02設置為s01的下一個節點   s02->next = s03;s03->next = s04;s04->next = s05;//鏈表的遍歷//pd:當前鏈表的節點Stu *pd = head;while(pd != NULL){printf("%s\t%s\t%d\n", pd->name, pd->sex, pd->age);//下一個節點賦值給當前節點,為下一輪循環pd = pd->next;}return 0;
}
// 陳晴朗  男      18
// 李槐    男      8
// 李寶瓶  女      14
// 裴錢    女      12
// 崔東山  男      16

練習:學員管理系統

需求:

選項有:1,查詢所有學員信息2,添加學員信息3,插入學員信息4,刪除學員信息5,修改學員信息(作業)6,查找指定位置的學員(作業)7,退出程序(釋放內存)

代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{//數據域char name[30];char sex[10];int num;//指針域struct student *next;
}STU;
//記錄鏈表首節點
STU *head = NULL;//查詢函數(打印鏈表)
void print_link(STU *head)
{//定義一個節點作為當前節點STU *pd = head;while (pd != NULL){printf("姓名:%s\t性別:%s\t學號:%d\n",pd->name,pd->sex,pd->num);//獲取下一個節點賦值給當前節點pd = pd->next;}printf("\n");
}//計算鏈表長度
int get_len(STU *head)
{int i = 0;STU *pd = head;while(pd != NULL){i++;pd = pd->next;}return i;
}//添加學員信息邏輯
/*添加新節點到連接尾部參數;head:鏈表的頭節點stu:要添加的新節點返回值鏈表的頭節點
*/
STU *add(STU *head, STU *stu)
{//如果傳進來的學員信息為空,直接返回傳進來的頭結點if (stu == NULL){return head;}//判斷鏈表首節點是否為空,為空表示此時鏈表還沒有節點,直接將數據賦值給首結點if (head == NULL){head = stu;printf("添加成功\n\n");return head;}//查詢最后一個節點,找到NULL的前一個節點//假設當前節點就是最后一個節點(即一個也沒有),此時首節點就是最后一個節點STU *lastNode = head;while(lastNode != NULL){//進循環,表示這不是最后一個節點,就判斷他的下一個節點是否為空,為空直接跳出循環if (lastNode->next == NULL){break;}else{//此時表示他的下一個節點不是NULL,將它的下一個節點賦值給它lastNode = lastNode->next;}}//沒有進循環表示lastNode就是當前鏈表的最后一個節點//此時就要將本次創建的節點添加到 原鏈表最后一個節點的后面lastNode->next = stu;printf("添加成功\n\n");return head;
}//尾部添加學員信息
STU *add_student(STU *head)
{//開辟一塊堆內存空間賦值 結構體指針變量,用來存儲學員信息(即stu指向這片堆內存)STU *stu = calloc(1,sizeof(STU));printf("請輸入學員姓名\n");scanf("%s", stu->name);printf("請輸入學員性別\n");scanf("%s", stu->sex);printf("請輸入學員學號\n");scanf("%d", &stu->num);head = add(head, stu);return head;}//插入學員
STU *inster_student(STU *head)
{STU *stu = calloc(1,sizeof(STU));printf("請輸入學員姓名\n");scanf("%s", stu->name);printf("請輸入學員性別\n");scanf("%s", stu->sex);printf("請輸入學員學號\n");scanf("%d", &stu->num);printf("請輸入要插入學員的位置(從0開始)\n");int index = 0;scanf("%d", &index);//排除錯誤int len = get_len(head);if (index > len){//插入位置超過鏈表長度,插入鏈表末位head = add(head, stu);return head;}if (index < 0){printf("輸入位置有誤\n");return head;}//為0表示插入第一個位置if (index == 0){//將首節點位置變為下一個節點stu->next = head;//將新建的節點賦值給首節點head = stu;printf("添加成功\n");return head;}//尋找插入節點的前一個節點STU *pd = head;for (int i = 0; i < index - 1; i++){pd = pd->next;}stu->next = pd->next; //將前一個節點的原后一個節點賦值給新節點的下一個節點pd->next = stu;printf("添加成功\n\n");return head;
}//刪除學員
STU *del_student(STU *head)
{printf("請輸入要刪除學員的位置(從0開始)\n");int index = 0;scanf("%d", &index);//排除錯誤int len = get_len(head);if (index > len || index < 0){printf("輸入位置有誤\n");return head;}//為0表示刪除第一個位置if (index == 0){//將首節點的下一個節點變為首節點head = head->next;printf("刪除成功\n");return head;}STU *pd1 = head, *pd2;int i = 0;while (i < index){pd2 = pd1;pd1 = pd1->next;i++;}if (pd1 != NULL){pd2->next = pd1->next;}printf("刪除成功\n");return head;
}//修改學員
STU *update_student(STU *head)
{STU *stu = calloc(1,sizeof(STU));printf("請輸入要修改學員姓名\n");scanf("%s", stu->name);printf("請輸入要修改學員性別\n");scanf("%s", stu->sex);printf("請輸入要修改學員學號\n");scanf("%d", &stu->num);printf("請輸入要修改學員的位置(從0開始)\n");int index = 0;scanf("%d", &index);//排除錯誤int len = get_len(head);if (index > len || index < 0){printf("輸入位置有誤\n");return head;}//為0表示修改第一個位置if (index == 0){//將新節點的next指向原首節點的下一個節點stu->next = head->next;printf("修改成功\n");return head;}//不為0int i = 0;//定義兩個指針變量記錄當前節點和上一個節點STU *pd1 = head, *pd2;while (i < index){pd2 = pd1;pd1 = pd1->next;i++;}pd2->next = stu;stu->next = pd1->next;printf("修改成功\n");return head;
}//查詢指定學員位置
STU *find_student(STU *head)
{printf("請輸入要查找學員的位置(從0開始)\n");int index = 0;scanf("%d", &index);//排除錯誤int len = get_len(head);if (index > len || index < 0){printf("輸入位置有誤\n");return head;}STU *pd = head, *pd1;//為0表示查找的是第一個學員if (index == 0){//直接打印首節點printf("姓名:%s\t性別:%s\t學號:%d\n\n",pd->name,pd->sex,pd->num);return head;}//不為0,尋找當前節點int i = 0;while (i < index){pd1 = pd;pd = pd->next;i++;}printf("姓名:%s\t性別:%s\t學號:%d\n\n",pd->name,pd->sex,pd->num);return head;
}//菜單函數
void my_menu(int tag)
{switch (tag){case 1:print_link(head);break;case 2:head = add_student(head);break;case 3:head = inster_student(head);break;case 4:head = del_student(head);break;case 5:head = update_student(head);break;case 6:head = find_student(head);break;default:printf("輸入有誤, 請重新輸入\n\n");break;}
}//釋放內存
void free_link(STU *head)
{STU *pd = head;while (pd != NULL){//記錄其下一個節點STU *next = pd->next;//釋放當前節點free(pd);//更換當前節點pd = next;}}int main(int argc, char const *argv[])
{while (1){printf("1,查詢所有學員信息\n2,添加學員信息\n3,插入學員信息\n4,刪除學員信息\n5,修改學員信息\n6,查找指定位置的學員\n7,退出程序\n\n");printf("請輸入本次操作的選項(輸入對應數字)\n");int tag = 0;scanf("%d", &tag);if (tag != 7){my_menu(tag);}else{free_link(head);printf("歡迎下次光臨!\n");break;}}return 0;
}

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

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

相關文章

Vmware突然無法獲取IP(二)

一 測試環境 宿主機&#xff1a; window10Vmware 17 proUbuntu 18.04虛擬機中 二 問題 之前虛擬機可以正常使用。過程中&#xff0c;安裝了docker&#xff08;不確定是否和這個有關系&#xff09;第二天開啟虛擬機時&#xff0c;發現網口為down的狀態。將網口up后&#xff0…

python第三方庫——openpyxl

Bokeh是一個Python庫&#xff0c;用于對Excel 2010 xlsx/xlsm/xltx/xltm文件進行讀寫操作。 官網對該工具的介紹為&#xff1a; openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.It was born from lack of existing library to read/write…

使用Java實現漢諾塔問題

文章目錄 漢諾塔問題 今天和大家來看看漢諾塔問題&#xff0c;這也是一個經典的算法 漢諾塔問題 分治算法經典問題&#xff1a;漢諾塔問題 漢諾塔的傳說 漢諾塔&#xff1a;漢諾塔&#xff08;又稱河內塔&#xff09;問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的…

Git 克隆子目錄

背景 有時候&#xff0c;一個倉庫太大&#xff08;包含很多個工程&#xff09;&#xff0c;下載費時&#xff0c;又占電腦的空間。 如何只下載其中一個工程&#xff08;子目錄&#xff09;呢&#xff1f; 稀疏檢出&#xff08;Spare Checkout&#xff09; git 的 Spare Chec…

Java項目-瑞吉外賣Day5

視線新增套餐功能&#xff1a; 創建SetmealDish&#xff0c;SetmealDto類&#xff0c;與相關的mapper&#xff0c;service&#xff0c;serviceImpl&#xff0c;controller類。 Setmeal表示套餐&#xff0c;SetmealDish表示套餐對應的菜品。 交互過程&#xff1a; 前端請求&a…

TCP 和 UDP 區別? 2、TCP/IP 協議涉及哪幾層架構? 3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?

文章目錄 1、TCP 和 UDP 區別&#xff1f;2、TCP/IP 協議涉及哪幾層架構&#xff1f;3、描述下 TCP 連接 4 次揮手的過程&#xff1f;為什么要 4 次揮手&#xff1f;4、計算機插上電源操作系統做了什么&#xff1f;5、Linux 操作系統設備文件有哪些&#xff1f; 1、TCP 和 UDP …

RE2文本匹配調優實戰

引言 在RE2文本匹配實戰的最后&#xff0c;博主說過會結合詞向量以及其他技巧來對效果進行調優&#xff0c;本篇文章對整個過程進行詳細記錄。其他文本匹配系列實戰后續也會進行類似的調優&#xff0c;方法是一樣的&#xff0c;不再贅述。 本文所用到的詞向量可以在Gensim訓練…

2023年度盤點:智能汽車、自動駕駛、車聯網必讀書單

【文末送書】今天推薦幾本自動駕駛領域優質書籍 前言 2023年&#xff0c;智能駕駛和新能源汽車行業仍然有著肉眼可見的新進展。自動駕駛技術繼續嘗試從輔助駕駛向自動駕駛的過渡&#xff0c;更重要的是相關技術成本的下降。根據《全球電動汽車展望2023》等行業報告&#xff0c…

進程、容器與虛擬機的區別

進程、容器與虛擬機 參考&#xff1a;關于進程、容器與虛擬機的區別&#xff0c;你想知道的都在這&#xff01; 進程、容器與虛擬機的結構圖 進程 介紹 進程是一個正在運行的程序&#xff0c;它是一個個可執行文件的實例。當一個可執行文件從硬盤加載到內存中的時候&#xf…

如何用CHAT寫方案?

問CHAT&#xff1a;幫我寫一份航空無動力樂園的可執行方案 CHAT回復&#xff1a; 方案一&#xff1a;概念及地點篩選 航空無動力樂園是指以航空運動為主題&#xff0c;利用自然地形與風力進行滑翔、跳傘等無動力航空運動的戶外休閑娛樂樂園。鑒于此&#xff0c;首需要確定樂園…

Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中&#xff0c;可以通過實現SessionDAO接口來將會話信息保存到Redis中&#xff0c;并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此&#xff0c;要更新Redis中的超時登錄時間&#xff0c;可以按照以下步驟進行操作&#xff1a; 實現Se…

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一&#xff0c; 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) &#xff0c; 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式&#xff0c;分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存&#xff1a;線程之間共享程序的公共狀態&#xff0c;線程之間通過讀-寫內存中的公…

前端知識筆記(四十五)———前端開發與后端開發有什么區別

前端開發和后端開發是Web開發中的兩個關鍵領域&#xff0c;它們負責不同的任務和功能。下面是前端開發和后端開發之間的主要區別&#xff1a; 前端開發&#xff1a; 用戶界面&#xff1a;前端開發主要關注用戶界面的開發&#xff0c;包括網頁的布局、樣式、交互等方面。前端技…

Android集成科大訊飛語音識別與語音喚醒簡易封裝

目錄 一、語音喚醒部分 1、首先在科大訊飛官網注冊開發者賬號 2、配置喚醒詞然后下載sdk 3、選擇對應功能下載 4、語音喚醒lib包全部復制到工程目錄下 5、把語音喚醒詞文件復制到工程的assets目錄 6、復制對應權限到AndroidManifest.xml中 7、喚醒工具類封裝 二、語音識…

Linux學習第46天:Linux音頻驅動試驗:能不能?不行也得行。

Linux版本號4.1.15 芯片I.MX6ULL 大叔學Linux 品人間百味 思文短情長 CAN 是目前應用非常廣泛的現場總線之一&#xff0c;主要應用于汽車電子和工業領域&#xff0c;尤其是汽車 領域&#xff0c;汽車上大量的傳感器與模塊都是通過 C…

十二、MapReduce概述

1、MapReduce &#xff08;1&#xff09;采用框架 MapReduce是“分散——>匯總”模式的分布式計算框架&#xff0c;可供開發人員進行相應計算 &#xff08;2&#xff09;編程接口&#xff1a; ~Map ~Reduce 其中&#xff0c;Map功能接口提供了“分散”的功能&#xff…

【Java期末復習資料】(1)知識點總結

本文章主要是知識點&#xff0c;后續會出模擬卷 以下是選擇、填空可能考的知識點&#xff0c;多看幾遍&#xff0c;混個眼熟 面向對象程序設計的基本特征是&#xff1a;抽象、封裝、繼承、多態&#xff08;后三個是三大特性&#xff09;Java源文件的擴綴名是.java編譯Java App…