1.3鏈表

鏈表的物理存儲結構是用一組地址任意的存儲單元存儲數據的。不像順序表占據連續的一段內存空間,而是將存儲單元分散在內存的任意地址上。

?

鏈表結構中,每個數據元素記錄都存放到鏈表的一個節點(node)中,而每個節點之間由指針將其連接在一起,形成了”鏈“的結構、

鏈表每個節點中,都必須有一個專門用來存放指針(地址)的域,用這個指針域來存放后繼結點的地址,這樣就達成了連接后繼結點的目的。

一條鏈表通常有1個”表頭“,是一個指針變量,用來存放第一個節點地址。此外,一條鏈表的最后一個節點的指針域要置空(NULL),表示該節點為鏈表的尾節點,因為它之沒有后繼結點了。

?

鏈表特征:

1)每個節點包括兩部分:數據域和指針域。其中數據域用來存放數據元素本身的信息,指針域用來存放后繼結點的地址。

2)鏈表邏輯上是連續的,而物理上不一定連續存儲節點、

3)只要獲得鏈表的頭節點,就可以通過指針遍歷整條鏈表。

?

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

?

#include"stdio.h"
#include"stdlib.h"
typedef int ElemType;typedef struct node{ElemType data;struct node *next;
}LNode,*LinkList;LinkList GreatLinkList(int n) {	//創建一個長度為n的鏈表 LinkList p,r,list=NULL;ElemType e;int i;for(i=1;i<=n;i++) {scanf("%d",&e);		//輸入結點的內容 p=(LinkList)malloc(sizeof(LNode));//為新建的結點開辟內存空間 p->data=e;			//元素賦值 p->next=NULL;if(!list)list=p;			//賦值鏈表頭指針 elser->next=p;		//將結點連入鏈表 r=p;}return list;		//返回鏈表頭指針 
}void insertList(LinkList *list,LinkList q,ElemType e) {//向鏈表中插入結點 e LinkList p;p=(LinkList)malloc(sizeof(LNode));//為新建的結點開辟新的內存空間 ,生成一個新結點,由p指向它 p->data=e;					//向該結點的數據域賦值e if(!*list) {*list=p;			//list內容為NULL時,表示該鏈表為空,賦值鏈表頭指針 p->next=NULL;}					//當鏈表為空時q沒有意義,只能在頭結點后面插入第一個元素 else {p->next=q->next;//當鏈表不為空時,認為q指向的結點一定存在,將q指向的結點的next域的值賦給p指向結點的next域q->next=p;	}
}void delLink(LinkList *list,LinkList q) {	//刪除鏈表的某結點 LinkList r;if(q==*list) {	//如果刪除第一個結點 *list=q->next;free(q);}else {			//刪除其他結點 for(r=*list;r->next!=q;r=r->next)if(r->next!=NULL) {r->next=q->next;free(q);}}
}void destroyLinkList(LinkList *list) {	//銷毀一個鏈表 LinkList p,q;p=*list;while(p) {	//循環釋放掉每一個鏈表結點 q=p->next;free(p);p=q;}*list=NULL;//將*list的內容置為NULL,這樣主函數中的鏈表list就為空,防止了list變為野指針,而且鏈表在內存中也完全被釋放掉了。
}int main() {int e,i;LinkList l,q;q=l=GreatLinkList(l);//創建一個鏈表結點,q和l都指向該結點 scanf("%d",&e);while(e) {			//循環輸入數據,同時插入新生成的結點 insertList(&l,q,e);q=q->next;scanf("%d",&e);}q=l;printf("the content of the linklist\n");while(q) {			//輸出鏈表中的內容 printf("%d",q->data);q=q->next;}q=l;printf("\nDelete the fifth element");for(i=0;i<4;i++) { //將指針q指向鏈表的第五個元素 if(q==NULL) {	//確保此時鏈表的長度大于等于5,否則將是非法操作 printf("the length of the linklist is  smaller than 5!");}q=q->next;}delLink(&l,q);	//找到鏈表中第五個元素,用q指向它,再刪除q所指的結點 q=l;while(q) {		//打印出刪除后的結果 printf("%d",q->data);q=q->next;}destroyLinkList(&l); 	//銷毀該鏈表 return 0;
}

  

創建鏈表注意:

(1)用malloc()函數在內存的動態存儲區(堆內存)中開辟一塊大小為sizeof(LNode)的空間,并將其地址賦給LinkList類型變量p,(LinkList為指向LNode變量的類型,LNode為前面定義的鏈表結點類型)。然后將數據e存入該結點的數據域data,指針域存放NULL。

(2)若指針變量list為空,說明本次生存的結點是第一個結點……

(3)若指針變量list不為空,說明本次生存的結點不是第一個結點,將p賦給r->next。此處的r是一個LinkList類型變量,永遠指向原先鏈表的最后一個結點,也就是要插入結點的前一個結點。

(4)再將p賦值給r,目的是使r再次指向最后的結點,以便生成鏈表的下一個結點,即保證r永遠指向原先鏈表的最后一個結點。

(5)重復(1)~(4)n次,生成n個結點的鏈表

(6)最后生成的鏈表的頭指針list返回主調函數,通過list就可以訪問到該鏈表的每一個結點。

?

刪除鏈表注意:

從非空鏈表刪除q所指的結點,考慮3種情況:

(1)q所指向的是鏈表的第一個結點

(2)q所指向的結點的前驅結點的指針已知

(3)q所指向的結點的前驅結點的指針未知

?

銷毀鏈表注意

鏈表使用完建議銷毀,因為鏈表本身會占用內存空間。若一個系統中使用很多鏈表,而使用完又不及時銷毀,那么這些垃圾空間積累過多,最終導致內存的泄露甚至程序的崩潰。

?

————————————————————————

————————————————————————

程序運行時候,刪除第5個元素,沒有顯示出預期結果。運行環境在DEV。

轉載于:https://www.cnblogs.com/dd2hm/p/6838694.html

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

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

相關文章

移植opencv3.20到3556AV100

1.移植環境&#xff1a; Ubuntu14.04 arm-hisiv200-linux-opencv3.20 下載地址 2.移植步驟&#xff1a; 1&#xff09;安裝cmake-gui 2&#xff09;新建一個opencv目錄存放opencv-3.2.0.zip&#xff0c;并解壓 擊Browse Source選擇~/hisi/opencv/opencv-3.2.0 點擊Brow…

ngnix 詳解

4 Nginx的rpm軟件包安裝 4.1 安裝包在位置 D:\講課內容--\新巴巴運動網\nginx高并發解決\nginx安裝包 4.2 此種安裝方式不用安裝gcc等編譯工具 4.3 安裝命令如下 rpm –ivh nginx 5 配置虛擬主機 5.1 什么是虛擬主機 虛擬主機是一種特殊的軟硬件技術&#xff0c;它可以將網絡上…

iscroll5制作上下拉刷新 tab出現的問題

1.iscoll5插件刷新后如果想改變現實位置如果向下幾px可以用 myScroll.scrollBy(0,0);方法&#xff0c;該值是相對當前位置。 2.iscoll5用到tab的時候&#xff0c;用點擊生成iscoll對象出現取消不了之前的對象的綁定事件&#xff0c;點擊多次后刷新執行多次的問題&#xff0c;解…

初談邏輯讀、物理讀、預讀

前言&#xff1a; 該文并不全是本人原創&#xff0c;里面的某些原理來自于CareySon。 SQL SERVER數據存儲的形式 要理解邏輯讀、物理讀、預讀這三個概念&#xff0c;先要搞懂SQL Server的數據存儲方式。 SQL Server數據庫包括數據文件和日志文件&#xff0c;一個數據庫可以有一…

Makefile常用萬能模板(包括靜態鏈接庫、動態鏈接庫、可執行文件)

1、生成可執行文件的makefile2、生成靜態鏈接庫的makefile3、生成動態鏈接庫的makefile 本文把makefile 分成了三份&#xff1a;生成可執行文件的makefile&#xff0c;生成靜態鏈接庫的makefile&#xff0c;生成動態鏈接庫的makefile。 這些makefile都很簡單&#xff0c;一般都…

TSQLDBServerHttpApi使用工作線程池

TSQLDBServerHttpApi使用工作線程池 TSQLDBServerHttpApi創建時&#xff0c;默認是使用單線程模式&#xff0c;且只使用一個數據庫連接&#xff0c;服務端要應對眾多的客戶端只靠一個工作線程&#xff08;主線程&#xff09;和一個數據庫連接&#xff0c; 服務端主線程不忙死才…

hibernate

Hibernate是一個開放源代碼的對象關系映射框架&#xff0c;他對JDBC進行了輕量級的封裝&#xff0c;使Java開發員可以隨心所欲的使用對象編程思維操作數據庫。 SessionFactory接口負責初始化Hibernate.他充當數據儲存源的代理&#xff0c;并負責創建Session對象。 Session&…

Python數據分析之pandas入門

一、pandas庫簡介 pandas是一個專門用于數據分析的開源Python庫&#xff0c;目前很多使用Python分析數據的專業人員都將pandas作為基礎工具來使用。pandas是以Numpy作為基礎來設計開發的&#xff0c;Numpy是大量Python數據科學計算庫的基礎&#xff0c;pandas以此為基礎&#x…

激光雷達和毫米波雷達的區別

什么是激光雷達 激光雷達&#xff0c;是以發射激光束探測目標的位置、速度等特征量的雷達系統。其工作原理是向目標發射探測信號&#xff08;激光束&#xff09;&#xff0c;然后將接收到的從目標反射回來的信號&#xff08;目標回波&#xff09;與發射信號進行比較&#xff0c…

Git—使用方法

1、:插件的安裝&#xff08;eclipse LUNA版本之后已經自動集成&#xff0c;不需要安裝插件&#xff09;、 * 先打開該網頁提供了對應版本的EGit&#xff0c;自己選擇相應的版本。&#xff08;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F&…

激光雷達與毫米波雷達對比

激光雷達是一種采用非接觸激光測距技術的掃描式傳感器&#xff0c;其工作原理與一般的雷達系統類似&#xff0c;通過發射激光光束來探測目標&#xff0c;并通過搜集反射回來的光束來形成點云和獲取數據&#xff0c;這些數據經光電處理后可生成為精確的三維立體圖像。采用這項技…

安全可靠國產系統下的應用怎么搭建?

據國家信息安全漏洞共享平臺&#xff08;CNVD&#xff09;統計數據&#xff0c;2016年我國共收錄通用軟硬件漏洞 10822個&#xff0c;漏洞來源涵蓋了眾多知名的國外廠商。應用軟件的不安全性對我國信息技術發展產生了重大威脅&#xff0c;近年來我國頻繁發布信息安全相關政策&a…

Win10 + Python + MXNet + VS2015配置

項目需要使用MTCNN來檢測、對齊、剪切出人臉&#xff0c;它是使用MXNet作為框架的&#xff0c;但是我自己的Ubuntu里各種框架亂成一團&#xff0c;不想再添亂就鐵了心要在windows里配一個。無奈網上的資料不多&#xff0c;掙扎了幾天之后決定留下這么一份文檔。 首先我們使用的…

bzoj 3224 Tyvj 1728 普通平衡樹

題目大意&#xff1a; 您需要寫一種數據結構&#xff08;可參考題目標題&#xff09;&#xff0c;來維護一些數&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x數 2. 刪除x數(若有多個相同的數&#xff0c;因只刪除一個) 3. 查詢x數的排名(若有多個相同的數&#xff0c…

不懂毫米波雷達?5分鐘讀懂毫米波雷達的那些事兒

2019年是毫米波風生水起的一年&#xff0c;也是毫米波名聲大噪的一年。毫米波應用范圍廣泛&#xff0c;如毫米波雷達、毫米波天線等。而本文&#xff0c;將向大家介紹毫米波雷達&#xff0c;主要內容包括&#xff1a;毫米波雷達原理、毫米波雷達主要特點、毫米波雷達優勢以及毫…

飛鴿傳書(IPMSG)協議(翻譯稿)

協議聲明&#xff1a; 本協議是由日本人Shirouzu Hiroaki &#xff08;白水 啟章&#xff09;先生編寫。 wanpengcoder翻譯于Mr.Kanazawa英文文檔&#xff0c;轉載請注明出處。 http://www.cnblogs.com/wanpeng/ 如有翻譯不當之處望提出&#xff0c;以便改進&#xff0c;衷心感…

redis集群的搭建

########環境######### centos 7.2 , gcch 環境ruby 2.0.0 redis 3.2.8 redis-3.3.3gem 公司要求搭建redis集群, 本來覺得挺好搞的,沒想到弄到現在.... 1, 環境準備 gcc , ruby 等環境準備 yum -y install gcc ruby ruby-devel rubygems rpm-build zlib redis-ruby接口安裝, 我…

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結 找出全書你認為最重要的一章&#xff0c;深入重新學習一下&#xff0c;要求&#xff08;期末占10分&#xff09;&#xff1a; 完成這一章所有習題詳細總結本章要點給你的結對學習搭檔講解你的總結并獲取反饋我選…

進程間五種通信方式

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。 IPC的方式通常有管道&#xff08;包括無名管道和命名管道&#xff09;、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket和Streams支持不同主機…

電子書下載:Silverlight 5 in Action

下載&#xff1a;http://www.ctdisk.com/file/8447319