【數據結構基礎筆記】【鏈表】

代碼參考《妙趣橫生的算法.C語言實現》

文章目錄

  • 前言
    • 1、鏈表基礎
    • 2、創建一個鏈表
    • 3、插入結點
    • 4、刪除結點
    • 5、銷毀鏈表
    • 6、實例分析


前言

本章總結:鏈表的定義、創建、銷毀,結點的插入與刪除


1、鏈表基礎

鏈表的物理存儲結構是用一組地址任意的存儲單元存儲數據的。
在鏈表結構中,每個數據元素記錄都存放在鏈表的一個結點node中,而每個結點之間由指針將其連接到一起。
每個結點由指針域(存放后繼結點的位置)、數據域構成。
一個鏈表通常有一個表頭,是一個指針變量,用來存放第一個結點地址。
鏈表的最后一個結點的的指針域要置空,表示為鏈表的尾結點。
在這里插入圖片描述
鏈表特點:
1、每個結點包括兩個部分:數據域和指針域
數據域用來存放數據元素本身信息,指針域用來存放后繼結點的地址
2、鏈表邏輯上是連續的,但物理上不一定是連續存儲結點。
3、只要獲取鏈表的頭結點,就可以通過指針遍歷整條鏈表
一個鏈表結點可以描述為:

typedef struct node{ElemType data;		//數據域struct node *next;	//指針域
}LNode,*LinkList;

每個結點的類型是LNode
*LinkList是指向LNode類型數據的指針類型定義。
所以 LNode *L 與 LinkList L; 是等價的。

2、創建一個鏈表

LinkList GreatLinkList(int n)
{//建立一個長度為n的鏈表LinkList p,r,list=NULL;		//p:相當于每次新建結點的暫存器,r:相當于插入結點的上一個結點,永遠指向原先鏈表的最后一個結點。list鏈表的頭指針ElemType elem;				//獲取暫存數據int i;						//定義累加器for(i=0;i<n;i++){scanf("%d",&elem);p=(LinkList)malloc(sizeof(LNode));	//分配內存,并將首地址送到pp->data=elem;			//置入數據p->next =NULL;			//指針指向NULL,暫時不考慮下一個結點if(!list)				//如果鏈表為空,則新創建的結點就是該鏈表的第一個結點list=p;else					//如果鏈表不為空,則將新建立的結點連接到之前鏈表的尾部r->next=p;r=p;					//將p結點的數據賦給r}return list;				//將鏈表的頭指針返回主調函數,通過list就可以訪問鏈表中的每個結點,并進行操作	
}

3、插入結點

步驟描述:
1、創建新節點,用指針p指向該結點
2、將q指向結點的next域的值賦值給p指向結點的next域
3、將p的值賦值給q的next域
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ynbLqOhX-1600526323871)(C:\Users\15409\AppData\Roaming\Typora\typora-user-images\1600507457502.png)]
代碼描述:

void insertList(LinkList *list,LinkList q,ElemType e)
{//向鏈表中由指針q指向的結點后面插入結點,結點數據位eLinkList p;p=(LinkList)malloc(sizeof(LNode));		//生成一個新節點,由p指向它p->data=e;if(!*list)				//如果鏈表為空{*list=p;p->next=NULL;}						//當鏈表為空的時候,q沒有意義,只能在頭結點后面插入第一個元素else{//當鏈表不為空的時候,認為q指向的結點一定存在//將q指向的結點的next域的值賦給p指向的結點的next域p->next=q->next;q->next=p; }
}

通過這個算法同樣可以創建一個鏈表,因為鏈表為空時,list==NULL,可以自動創建一個結點。在下面創建其他結點時,只要始終將指針q指向鏈表的最后一個結點,就可以創建出一個鏈表

4、刪除結點

從非空鏈表中刪除q所指的結點。
考慮三個情況:1、q指向的是鏈表的第一個結點
2、q指向的結點的前驅結點的指針已知
3、q指向的結點的前驅結點的指針未知
步驟:
1:將q所指的結點的指針域next的值賦給頭指針list,讓list指向第二個結點,再釋放掉q所指的結點即可。
2:假設前驅指針為r,將q所指的結點的指針域next的值賦給r的指針域next,釋放掉q所指結點
3:當q所指的結點的前驅結點的指針未知,需要通過鏈表頭指針list遍歷鏈表,找到q的前驅結點,并將該指針賦值給變量r,再按照第二種情況去做即可

情況1、2的代碼描述:

void delLink(LinkList *list,LinkList r,LinkList q)
{if(q==*list)		//情況1:q指向鏈表的第一個結點*list=q->next;else				//情況2:q指向的結點前驅結點的指針已知r->next=q->next;free(q);
}

情況1、3的代碼描述:

void delLink(LinkList *list,LinkList r,LinkList q)
{if(q==*list)//情況1:q指向鏈表的第一個結點{*list=q->next;  free(q);}else				//情況3:q指向的結點前驅結點的指針未知{for(r=*list;r->next!=q;r=r->next);	//遍歷鏈表,找到q的前驅結點的指針if(r->next!=NULL){r->next=q->next;			//從鏈表中刪除q指向的結點free(q);}} 
}

5、銷毀鏈表

使用鏈表之后需要銷毀它,因為鏈表本身會占用內存。
code描述:

void destroyLinkList(LinkList *list)
{LinkList p,q;p=*list;while(p){q=p->next;free(p);p=q;}*list=NULL;
}

6、實例分析

要求:
輸入一組整數(大于10個數),以0作為結束標志,將這組整數存放到一個鏈表中(結束標志0不包括在內),打印出該鏈表中的值。然后刪除該鏈表中的第5個元素,打印出刪除后的結果。最后在內存中釋放掉該鏈表。

#include "stdio.h"
#include "malloc.h"
#include "conio.h"typedef int ElemType;
//指針定義
typedef struct node {ElemType data;		//數據域struct node* next;	//指針域
}LNode, * LinkList;//***********創建鏈表******************//
//
LinkList GreatLinkList(int n)
{//建立一個長度為n的鏈表LinkList p, r=NULL, list = NULL;		//p:相當于每次新建結點的暫存器,r:相當于插入結點的上一個結點,永遠指向原先鏈表的最后一個結點。list鏈表的頭指針ElemType elem;				//獲取暫存數據int i;						//定義累加器for (i = 0;i < n;i++){scanf("%d", &elem);p = (LinkList)malloc(sizeof(LNode));	//分配內存,并將首地址送到pp->data = elem;			//置入數據p->next = NULL;			//指針指向NULL,暫時不考慮下一個結點if (!list)				//如果鏈表為空,則新創建的結點就是該鏈表的第一個結點list = p;else					//如果鏈表不為空,則將新建立的結點連接到之前鏈表的尾部r->next = p;r = p;					//將p結點的數據賦給r}return list;				//將鏈表的頭指針返回主調函數,通過list就可以訪問鏈表中的每個結點,并進行操作	
}//*************插入結點************//
//
void insertList(LinkList* list, LinkList q, ElemType e)
{//向鏈表中由指針q指向的結點后面插入結點,結點數據位eLinkList p;p = (LinkList)malloc(sizeof(LNode));		//生成一個新節點,由p指向它p->data = e;if (!*list)				//如果鏈表為空{*list = p;p->next = NULL;}						//當鏈表為空的時候,q沒有意義,只能在頭結點后面插入第一個元素else{//當鏈表不為空的時候,認為q指向的結點一定存在//將q指向的結點的next域的值賦給p指向的結點的next域p->next = q->next;q->next = p;}
}
//通過這個算法同樣可以創建一個鏈表,因為鏈表為空時,list==NULL,可以自動創建一個結點。在下面創建其他結點時,只要始終將指針q指向鏈表的最后一個結點,就可以創建出一個鏈表//刪除結點
void delLink(LinkList* list, LinkList q)
{LinkList r;if (q == *list)//情況1:q指向鏈表的第一個結點{*list = q->next;free(q);}else				//情況3:q指向的結點前驅結點的指針未知{for (r = *list;r->next != q;r = r->next);	//遍歷鏈表,找到q的前驅結點的指針if (r->next != NULL){r->next = q->next;			//從鏈表中刪除q指向的結點free(q);}}
}//銷毀鏈表
void destroyLinkList(LinkList* list)
{LinkList p, q;p = *list;while (p){q = p->next;free(p);p = q;}*list = NULL;
}void print_linklist(LinkList show_list)
{while (show_list){printf("%d ",show_list->data);show_list = show_list->next;}
}
int main()
{int elem = 0;   //定義中間變量數據int i = 0;      //定義累加器LinkList L, q;  q = L = GreatLinkList(1);       //創建1個鏈表結點,q和L指向該結點scanf("%d",&elem);while (elem)                    //循環地輸入數據,同時插入新生成的結點,結束條件:輸入數據為0{insertList(&L,q,elem);q = q->next;scanf("%d", &elem);}q = L;printf("The content of the linklist\n");print_linklist(q);q = L;printf("\n Delete the fifth element\n");for (i=0;i<4;i++)           //將指針q指向第五個元素{if (q == NULL)     //確保此時鏈表的長度大于等于5,否則是非法操作{printf("The length of the linklist is smaller than 5");_getche();return 0;}q = q->next;}delLink(&L,q);q = L;print_linklist(q);destroyLinkList(&L);return 0;
}

result:
在這里插入圖片描述

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

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

相關文章

動態添加,刪除行之心理測試系統

動態添加&#xff0c;刪除行之考試系統 數據庫設計&#xff1a; xl_option 題目選項 20090105134755404(編號) 20090105134904421(外鍵) 比較符合(選項內容) ②(選項標號) 2&#xff08;選項分值&#xff09; xl_subject 題目信息 20090105134943608&#xff08;編號&#xff…

android bitmap裁剪中間,Android裁剪中心位圖

雖然上面的大多數答案提供了一種方法來實現這一點&#xff0c;但已經有一種內置的方法來實現這一點&#xff0c;它是一行代碼(ThumbnailUtils.extractThumbnail())int dimension getSquareCropDimensionForBitmap(bitmap);bitmap ThumbnailUtils.extractThumbnail(bitmap, di…

二、request請求庫

一、requests介紹與安裝 1&#xff0c;requests介紹 答&#xff1a;requests是一個優雅且簡單的Python HTTP請求庫 2&#xff0c;requests作用 答&#xff1a;requests的作用是發送請求獲取響應數據 3&#xff0c;requests安裝 答&#xff1a;pip install requests 二、…

Java Vector Capacity()方法與示例

向量類的Capacity()方法 (Vector Class capacity() method) capacity() method is available in java.util package. Capacity()方法在java.util包中可用。 capacity() method is used to return the current capacity (i.e. initially, how many object exists) of this Vecto…

MFC和GTK的區別

關鍵技術 http://blog.csdn.net/master_max/article/details/1540204 MFC和GTK的區別&#xff1f;&#xff1f; 1.  兩者都是基于面向對象設計的。盡管MFC是用C寫的&#xff0c;而GTK是用C寫的&#xff0c;但思想都是面向對象的。GTK使用glib的對象機制&#xff0c;由于用C寫…

視頻圖像質量評價

目錄1、人眼視覺特性1、眼的適應性2、對比靈敏度3、空間分辨率和時間分辨率4、馬赫效應5、可見度閾值2、圖像質量測度3、圖像評價方法4、圖像評價方法的優劣1、人眼視覺特性 1、眼的適應性 暗適應性&#xff1a;從亮環境到暗環境&#xff0c;適應暗環境的特性 亮適應性&#…

鴻蒙科技與文化,數字閱讀 | “華為鴻蒙”:當現代科技遇到古典文化

華為事件愈演愈烈。海思芯片 20 年 " 備胎 " 終轉正&#xff0c;那么操作系統呢&#xff1f;最近&#xff0c;華為為自主研發的操作系統注冊商標—— " 鴻蒙 "&#xff0c;引發了關于華為注冊整本《山海經》的熱烈討論&#xff0c;很多人的朋友圈&#xff…

三、Beautiful Soup解析庫

一、Beautiful Soup介紹與安裝 1&#xff0c;Beautiful Soup介紹 答&#xff1a;Beautiful Soup是一個可以從HTML或XML文件中提取數據的Python庫 2&#xff0c;Beautiful Soup安裝 答&#xff1a;安裝Beautiful Soup 4&#xff1a;pip install bs4 安裝lxml&#xff1a;pip…

strictmath_Java StrictMath sqrt()方法與示例

strictmathStrictMath類sqrt()方法 (StrictMath Class sqrt() method) sqrt() Method is available in java.lang package. sqrt()方法在java.lang包中可用。 sqrt() Method is used to find the square root of the given parameter in the method. Here, "sqrt" st…

recovery編譯問題匯總

1、修改支持USB大容量存儲 &#xff08;1&#xff09;、首先需要查看手機lun位置 手機鏈接電腦&#xff0c;打開cmd命令行&#xff0c;依次輸入以下命令: adb shell find /sys -name "lun" 輸出以下結果&#xff1a; 發現手機輸出結果有兩個&#xff0c;需要進一步查…

言語理解每日學習及精解20110831

【例題】天氣預報一般要考慮氣溫、氣壓、溫度、風力等因素&#xff0c;這些都是大氣層本身變化的結果&#xff0c;只要掌握這些因素&#xff0c;通過計算機的計算就能準確地預報天氣變化的趨勢。沙塵暴作為一種特殊的天氣現象&#xff0c;同樣要考慮上述氣象因素。據氣象學家分…

【數據結構基礎筆記】【棧】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、棧的定義2、創建一個棧3、入棧和出棧操作4、棧的清空、銷毀、計算棧的當前容量5、實例分析前言 本章總結&#xff1a;棧的定義、創建棧&#xff0c;銷毀棧&#xff0c;入棧出棧操作等操作。 1、棧的定義 棧是一種重要的…

四、正則表達式

一、正則表達式的概念和作用 正則表達式概念&#xff1a;一種字符串匹配的模式 正則表達式作用&#xff1a; 可以檢查一個字符串中是否包含某種字串替換匹配的字串提取某個字符串中匹配的字串 二、正則表達式中常見的語法 字符描述原樣字符匹配字符一般字符匹配自身beyondb…

用HTML語言制作list標記,html5 datalist標簽的用法是什么?這里有datalist標簽的用法實例...

本篇文章主要為大家講述了關于html5 datalist標簽的用法及html5 datalist標簽的用法實例。本文說了兩個常用的選項框的實例供大家選擇觀看&#xff0c;下面就讓我們一起來看這篇文章吧我們先來看看html5 datalist標簽的用法&#xff1a;標簽定義選項列表。請與input元素配合使用…

java treemap_Java TreeMap lastKey()方法與示例

java treemapTreeMap類lastKey()方法 (TreeMap Class lastKey() method) lastKey() method is available in java.util package. lastKey()方法在java.util包中可用。 lastKey() method is used to return the last highest key element value exists in this TreeMap. lastKey…

網上看來的

http://blog.163.com/dong_xiao_yang/blog/static/216138205201321114659430/ http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20compile%20FFmpeg%20for%20Raspberry%20Pi%20%28Raspbian%29#FFmpegwithlibaacpluslibx264andalsa-lib 編譯環境 Ubuntu 12.04 w64-mingw32下載lib…

閱讀iPhone.3D.Programming(O'Reilly.2010-05) 英文版 第一感覺

最近開始閱讀iPhone.3D.Programming(OReilly.2010-05)&#xff0c;英文版此書&#xff0c;我閱讀到P21了&#xff0c;中間講了一個樣例&#xff0c;HelloArrow在這個過程中&#xff0c;我想簡單點&#xff0c;少打點字&#xff0c;直接拿書中配套來學習&#xff0c;發現一個問題…

【數據結構基礎筆記】【隊列】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、隊列定義2、創建一個隊列3、入隊列4、出隊列5、銷毀一個隊列6、循環隊列的概念7、循環隊列的實現8、實例分析前言 本章總結&#xff1a;鏈隊列定義&#xff0c;創建&#xff0c;出隊入隊操作&#xff0c;銷毀操作&#x…

html圖片自動循環輪播圖,js實現圖片無縫循環輪播

本文實例為大家分享了js實現圖片無縫循環輪播的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下代碼如下Document#container{overflow:hidden;width:400px;height:300px;margin:auto;}#front,#container{display:flex;flex-direction:row;}#container img{width:400px…

五、json模塊

一、json模塊的介紹 json模塊是Python自帶的模塊&#xff0c;用于json和Python數據之間的相互轉換 Json與Python數據類型的對應關系 JsonPythonobjectdictarrayliststringstrnumber(int)int,longnumber(real)floattrueTruefalseFalsenullNone [#中括號括起來的&#xff0c;對…