逆序存儲【數據結構】

C語言中malloc是動態內存分配函數。
函數原型:void malloc(unsigned int num_bytes);
參數:num_bytes 是無符號整型,用于表示分配的字節數。
返回值:如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。void
表示未確定類型的指針,void 可以指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什么類型的數據(比如是char還是int或者…)
功能:分配長度為num_bytes字節的內存塊
注意:當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用于任何數據對象。關于該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標準規定,該函數返回為void型指針,因此必要時要進行類型轉換。
實例:
#include"stdio.h"
#include"malloc.h"//malloc()函數被包含在malloc.h里面
int main(void)
{
char
a=NULL;//聲明一個指向a的char類型的指針
a=(char
)malloc(100*sizeof(char));//使用malloc分配內存的首地址,然后賦值給a
if(!a)//如果malloc失敗,可以得到一些log
{
perror(“malloc”);
return-1;
}
sprintf(a,"%s",“HelloWorld\n”);//“HelloWorld\n"寫入a指向的地址
printf(”%s\n",a);//輸出用戶輸入的數據
free(a);//釋放掉使用的內存地址
return0;//例2有無內存泄露?
}
(分配類型 *)malloc(分配元素個數 *sizeof(分配類型))
如果成功,則返回該空間首地址,該空間沒有初始化,如果失敗,則返回0

,動態分配內存時的返回值是不確定的,也就是說我們在申請空間的時候,還不知道用戶用這個空間來存儲什么數據類型,所以使用voId,沒有外地表示的,是申請空間的首地址,如果我們申請的是200個空間,我們返回的只是200,而不是200到203.我們以整形為例占用4個字節,
注意:我們在進行開辟存儲空間的時候,一般都是給予一個特定的數值,而是用你所需要開辟空間的個數去乘以每一個類型所占據的字節數,這樣對于不同的操作系統,我們也能夠控制我們需要的空間數量
函數值是所分配區域的第1個字節的地址,或者說,此函數是一個指針型函數返回的指針指向該分配率的開頭位置,注意安全措施,不是返回的直接地址的長度,而是第1個字節的地址,同時呢函數也可以看成是一個指針型函數,對于指針型函數一定會有返回值,而此函數返回的指針指向該分配率的開頭位置,
Elem是所有數據類型的總稱,把具體的事情出現后就有了概括性,當我們不是知道用戶具體想要開辟什么樣的類型的空間地址,我們可以使用抽象數據類型Elem,
注意指針的及類型為voId及不指向任何類型的數據,只提供一個地址,沒有快遞,也就是說明不知道用戶需要開辟什么樣數據類型的空間,同時也不知道返回的數據類型是什么樣的,如果死了,他說不能正常執行就說明硬件內存沒有足夠的空間來供用戶進行使用,屬于硬件層面的技能,
同時我們要知道與calloc函數的區別是什么樣子:
Calloc,它的作用是在內存的動態存儲空間中分配三個長度為30的內連續空間,這個空間是比較大的,足以保存一個數字,但是他的參數是有兩個的,而我們前面所提到的,另一個函數它的參數只有一個,
3.接下來我們來了解free函數,他的函數原型為void free (void *p);這里我們需要注意的是,第1個參數是申請時的空間,這里申請就是指malloc函數進行申請得到的地址值,第2個參數是指擴充之后的地址,空間大小的數值,比如說我們原來申請的空間是10個,那么我們可以在要5個空間,這里我們就需要寫第2個參數的值為15而不是5,他是針對于colloc函數獲取動態空間以及malloc函數,獲取空間得到的空間大小,這里就相當于是一開始,我們沒有想想充分到底需要多少個空間,但是隨著數據的進行,我們知道自己所需要的空間是大了或者是小了,那么我們對我們所需要的空間進行一個改動,挑類似魚,我們吃饅頭,一開始我們打算的是吃三個饅頭,但當吃了兩個饅頭之后,我們覺得自己已經好了,那我們就需要將自己跟前的饅頭數量改變一下,改為2,也就是減少一個,當吃完兩個感覺剩下的還是不夠吃,就需要再向空間{食堂的大師傅}申請兩個饅頭,這里申請兩個饅頭,但是不能寫2,而是需要寫5,這里就涉及到兩個問題,我們向食堂的大師傅去要兩個饅頭,如果食堂里是有兩個饅頭,那么我們就是申請成功了,如果食堂里沒有,那么我們就會申請失敗,返回值就是空,也就是null,沒有空間了,而對于我們將自己跟前的饅頭拿回食堂就不存在返回時不接收我們的饅頭的情況,realloc(p,50);指的就是將p所指向的已進行分配了的動態空間改為50個字節啊,
下面我們將詳細的了解一下realloc函數,也就是作用機制,第1種情況,比如我們一開始申請了10個空間,當我們使用到第10個的時候,發現我們還需要5個空間才能完成我們這次的存儲任務,那么我們就需要再開辟5個空間,使用函數realloc函數,傳遞參數為15,我們發現,原來的地址空間當中,后面有5個連續的空間與前面的10個空間是相連的,那么我們就一次性的將15個空間再分配給原來的地質空間,變成15個空間,此時分配完成,第2種情況,當我們想要開辟15個聯系的空間時,發現其中的某個空間是被其他元素所占據式,那么我們就無法成功開辟這15個空間的內存,這也是由于我們在申請動態內存空間時,必須申請的是連續的動態空間,如果我們沒有聯系的15個空間的話,那么我們就放棄原來的可以存儲10個空間大小的倉庫,然后去尋找另外一個倉庫,我們所需要成長的另一個倉庫的大小是15個空間,然后呢,我們需要將原來倉庫的物品搬到我們的新倉庫當中進行存儲,
我們可以簡單的進行類比,比如我們成立了一家公司,這家公司的規模是10個吊車的倉庫,那么我們就需要去尋找大小為10的倉庫來進行存儲,當我們有了更雄厚的實力,將原來的10個吊車改為20個車,那么我們就需要去另外找一個倉庫來存儲這20個車,并且我們需要到原來的倉庫歸還給我們一開始租賃的那一個人,并且把所有的車放到我們新開辟的車間進行存儲,方便我們進行同意的管理,我們是不能夠將所有的車存放到一個空間當中的,是不符合我們的計算機硬件系統的

free是針對于前面的兩個函數進行實現功能的,我們需要傳遞的參數就是一個地址值,為啥呢?因為我們知道前面兩個函數返回的都是一個地址值,也就是可以理解為我們想使用一個倉庫,那么我們只需要把他的鑰匙拿過來就可以了,還可以理解成我們想喝一瓶酒,那么我們必須拿起瓶器,,想開一輛車,那么我們需要鑰匙,而不是搬走整個車,但是我們類比前面的函數,可知Free函數它不需要返回值類型,而且他也不研究他是否成功,就像我們去借一輛自行車來騎,那么我們使用了這個自行車,我們返回去肯定就是會成功的,而不是返回失敗,
4.realloc函數:函數原型void realloc(voidp,UnsIgned.Intsize.)

1.單鏈表進行逆序存儲的原理理解:
我們說為什么提到逆序存儲這一詞語?因為我們正序存儲時,需要尋找最后一個位置,來進行結點的插入操作,這時候就浪費了時間和空間,找最后一個節點的位置時有兩種方法,一個是指針的方法,一個是循環的方法,為了避免這兩種方法,我們提出了逆序存儲的原理,也就是說我們把插入節點的位置進行固定,每次插入從首源節點的位置進行插入,注意此時我們插入的是一個具有頭節點的單鏈表,此時單鏈表是空的,

順序存儲結構和鏈表存儲結構在時間復雜度上有什么區別?
下面討論如何將兩個有序鏈表合并成一個有序鏈表
此處的兩個游戲列表指的是他們的順序是從大到小,或者是從小到大的事情,也就是說他們的排列是很規則的,

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

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

相關文章

為什么 main 方法是 public static void ?

main 方法是我們學習Java編程語言時知道的第一個方法,你是否曾經想過為什么 main 方法是 public、static、void 的。當然,很多人首先學的是C和C,但是在Java中main方法與前者有些細微的不同,它不會返回任何值,為什么 ma…

返回地址【數據結構】

小問題? 1.我們是如何根據地址值來找到我們對應的數據的? 詳細陳述一下:當我們開辟一個整數類型,取名為a,假設地址空間是從數值為2000進行存儲,并且我們假設整形占用4個字節,那么我們在內存中需…

【超級詳細的小白教程】Hexo 搭建自己的博客

– 前言 這是一篇有關如何使用 Github Pages 和 Hexo 搭建屬于自己獨立博客的詳盡教程,本人是軟件工程專業本科生,目前只學習了C和C編程語言,對網站開發的有關知識幾乎為零,這也是我搭建好自己的博客之后寫的第一篇博客&#xff…

面向對象思想精華總結

一、三大特性 封裝繼承多態 二、類圖 泛化關系 (Generalization)實現關系 (Realization)聚合關系 (Aggregation)組合關系 (Composition)關聯關系 (Association)依賴關系 (Dependency) 三、設計原則 S.O.L.I.D其他常見原則 參考資料 一、三大特性 封裝 利用抽象數據類型將數據…

數組名與指向數組的指針之間的聯系與區別【數據結構】

我們遇到一個非常棘手的問題,這個問題就是,對于一堆數據來說,我們進行存儲,放到一個指定的倉庫當中,先前我們使用數組加加標的形式進行訪問倉庫當中的元素位置,但是呢,現在我們使用的是一個指針…

Struts2的action中處理JSONP方式提交的中文亂碼問題:

昨天在做公司網站的時候出現了一個中文亂碼問題,讓我郁悶了一晚上和一上午,最后在網友的提示下,我終于解決了,現在寫出來供后來的兄弟們參考: 1.問題是這樣的,就是客戶端是以JSONP的方式提交的數據&#x…

leetcode509. 斐波那契數(矩陣快速冪)

斐波那契數,通常用 F(n) 表示,形成的序列稱為斐波那契數列。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 給定 N,計算 F(N)。…

insert函數的修改,

我們來看一下圖片當中的第2個圓圈,為什么使用size來相加呢?我們知道一開始我們定義的初始空間為init_size;我們想一下啊,如果是第1次進行空間的增加,那么我們使用InIt來進行相加是可以的,但是當第2次想加我們再想開辟空…

leetcode520. py解字符串真是太殘暴了

給定一個單詞,你需要判斷單詞的大寫使用是否正確。 我們定義,在以下情況時,單詞的大寫用法是正確的: 全部字母都是大寫,比如"USA"。 單詞中所有字母都不是大寫,比如"leetcode"。 如果…

【數據結構】線性表大咖

循環鏈表的介紹 概念:鏈表的最后一個節點的指針,由原來的 空指針變成指向第1個節點的鏈表。 類比:我們進行串珠子的操作,將首尾通過線進行連接,同樣我們的鏈表就是通過指針指向的方式進行連接,使其成為一…

leetcode551. 學生出勤記錄 I

給定一個字符串來代表一個學生的出勤記錄,這個記錄僅包含以下三個字符: A : Absent,缺勤 L : Late,遲到 P : Present,到場 如果一個學生的出勤記錄中不超過一個A(缺勤)并且不超過兩個連續的L(遲到),那么這個學生會被獎…

一元多項式的表示和相加【數據結構】

一元多項式的表示和相加 運算只是一個定義,一切的一切,到最后都必須歸咎于存儲結構當中,實現物理存儲,一元多項式包括數據對象數據關系以及數據之間的各種操作, 一元多項式的實現:用帶表頭結點的有序鏈表…

線性結構基本概念【數據結構】F

線性表的概念:線性表是一種最簡單的線性結構,線性結構是單個數據元素的有序結合 線性結構的基本特征為: 第一,集合中必存在唯一的一個第1元素, 第二,集合中必存在唯一的一個最后元素, 第三&am…

leetcode589. N叉樹的前序遍歷

給定一個 N 叉樹&#xff0c;返回其節點值的前序遍歷。 例如&#xff0c;給定一個 3叉樹 : 返回其前序遍歷: [1,3,5,6,2,4]。 思路&#xff1a;先放入自己&#xff0c;再依次遍歷孩子。 /* // Definition for a Node. class Node {public int val;public List<Node> c…

ORA-00001 違反唯一約束條件

程序跑出下面的異常&#xff1a;com.ibm.websphere.ce.cm.DuplicateKeyException: ORA-00001: 違反唯一約束條件 (EOMS3.SYS_C0024492)&#xff0c;參考下面的文章了解到我的程序可能是序列的問題。&#xff08;果然是序列產生的最小值設置的太小&#xff0c;將序列值設置大之后…

順序結構實現【數據結構】

雖然在數據結構當中是先出現的線性表&#xff0c;然后出現的是數組 一&#xff1a;線性表的順序存儲結構 順序映象&#xff1a;用一組地址連續的存儲單元依次存放線性表當中的數據元素 線性表的起始地址&#xff1a;線性存儲第一個數據元素的地址&#xff0c;我們也稱作是基地址…

leetcode590. N叉樹的后序遍歷

給定一個 N 叉樹&#xff0c;返回其節點值的后序遍歷。 例如&#xff0c;給定一個 3叉樹 : 思路&#xff1a;先遍歷所有孩子&#xff0c;再放入自己。 /* // Definition for a Node. class Node {public int val;public List<Node> children;public Node() {}public No…

鏈表的形式【F】

數據元素之間的關系在計算機中有兩種表示方法: 順序映象, 非順序映象. 對應兩種存儲結構: 順序存儲結構, 鏈式存儲結構 線性結構就是一種邏輯關系&#xff0c;方便我們對數據進行研究但是不考慮真實的存儲結構 數據是什么&#xff1f; 數據是能夠反應一定內容的一組數據類型的…

leetcode892. 三維形體的表面積

在 N * N 的網格上&#xff0c;我們放置一些 1 * 1 * 1 的立方體。 每個值 v grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。 請你返回最終形體的表面積。 示例 1&#xff1a; 輸入&#xff1a;[[2]] 輸出&#xff1a;10 示例 2&#xff1a; 輸入&#xff1a;…

leetcode914. 卡牌分組

給定一副牌&#xff0c;每張牌上都寫著一個整數。 此時&#xff0c;你需要選定一個數字 X&#xff0c;使我們可以將整副牌按下述規則分成 1 組或更多組&#xff1a; 每組都有 X 張牌。 組內所有的牌上都寫著相同的整數。 僅當你可選的 X > 2 時返回 true。 示例 1&#xf…