1. 程式人生 > >想當黑客?淺談C語言程式設計:不會這個知識就別想了!

想當黑客?淺談C語言程式設計:不會這個知識就別想了!

淺談C語言資料結構——鏈式堆疊

看到標題點進來的朋友,應該對黑客這個名詞很敏感吧?我想應該是這樣的,但是你們知道作為一名黑客需要學習哪些知識嗎?小編不是什麼大佬,但小編可以明確的告訴你,學習C語言是必不可少的一步,為什麼?因為C語言是一個非常“底層”的語言,也是應用最廣泛程式語言。你可以這樣理解,最底層的是機器語言,緊接著的是彙編,然後就是C語言。

這是機器語言,看不懂?我也看不懂

學習C語言的過程中,資料結構是必須要掌握的,今天小編就跟大家講一下資料結構中的堆疊——鏈式堆疊。

今天要講的鏈式堆疊,對於一些剛入門的小夥伴可能比較難以理解,因為鏈式堆疊涉及到C語言中最令人頭

疼的知識點——指標。在小編看來,鏈式堆疊就相當於對指標進行操作,為什麼呢?請看下文↓

小編給大家推薦一個學習氛圍超好的地方,C/C++交流企鵝裙:870963251!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙裡有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程

建立節點

我們建立一個結構體來充當堆疊的一個節點,這個結構體有一個資料域和一個指標域,資料域用來儲存資料,這裡小編用來儲存整型資料指標域用來指明棧頂的下一個節點。不理解的可以看下圖↓

這是我們建立的堆疊節點

我們的棧頂指示器永遠指向左邊(上圖)的第一個節點,最左邊的節點為棧頂,最右邊的節點為棧底

,堆疊資料的新增和刪除都是在棧頂進行的,遵循“後進先出、先進後出”的原則。節點建立完畢之後,我們來建立我們需要的函式,這些函式並不是必要的,在這裡小編只是用來給大家做示例。

堆疊屬於一種資料結構,實現它並不意味著我們一定要寫某種形式的程式碼,某種形式的函式才能實現,堆疊是一種資料元素與資料元素之間邏輯關係,我們只要實現這種邏輯關係就可以了,不論以什麼形式實現

初始化並建立第一個節點

小編這次示例中一共有4個函式,這四個函式分別實現初始化堆疊、出棧、入棧、遍歷棧堆。我們先建立“初始化棧堆”函式,這個函式很簡單,它建立一個堆疊的第一個節點,並將它初始化(存入第一個資料)。具體實現步驟看下圖↓

head變數是一個全域性變數,它用來指明當前堆疊的棧頂,充當棧頂指示器,我們利用棧頂指示器來增加或刪除堆疊節點。head是一個指向“堆疊節點型別(inn)”的指標,在建立棧頂指示器或者堆疊節點時候,要注意變數的作用域,因為你建立的函式很可能無法改變它的值,怎麼避免呢?這就要用到指標了,因為你可以指明某個變數的地址,這樣一來函式就可以根據它的地址來對變數進行操作了。

入棧

入棧函式也非常的簡單,稍稍認真看一會就能明白了。細心的小夥伴可能會問,為什麼要用malloc()函式來申請一塊inn型別大小的記憶體呢,直接申明一個inn型別變數,用head的next成員指向它不就行了嗎?答案是:“我們接下來要用free()函式來釋放記憶體”,看不懂這裡?沒關係,當你用原始碼練習的時候你就知道了!

出棧

出棧函式和入棧函式是有一點關係的,因為出棧函式中的free()函式能釋放掉入棧函式動態申請的記憶體。出棧函式僅僅是一些指標與指標之間的轉換而已,沒有涉及到一些新的知識,理解這個函式僅僅需要你理解指標就可以了。具體的實現步驟就看下圖吧,小編也不知道怎麼表達出來,你們看著原始碼就能理解了。

遍歷棧堆

便利堆疊函式,這個函式的功能是用來遍歷整個堆疊,並打印出堆疊節點的資料,供我們觀察我們的程式,是否按照我們預先設計的路線實現。這個函式也是一些指標之間的轉換,不是特別難,仔細看就能看出他的工作原理了。

值得注意的是,這個函式中有一個rec指標,這個指標是用來幹嘛的呢?它是用來將棧頂指示器“復位”的,通過觀察我們可以看到,這個函式是使用棧頂指示器(head指標)來遍歷整個堆疊的,所以棧頂指示器會一步步的移到“棧底”,如果我們不將棧頂指示器“復位(調回棧頂)”,那麼接下來的堆疊操作就沒有相應的棧頂指示器了。

下圖是程式執行結果↓

相關推薦

黑客C語言程式設計這個知識

淺談C語言資料結構——鏈式堆疊 看到標題點進來的朋友,應該對黑客這個名詞很敏感吧?我想應該是這樣的,但是你們知道作為一名黑客需要學習哪些知識嗎?小編不是什麼大佬,但小編可以明確的告訴你,學習C語言是必不可少的一步,為什麼?因為C語言是一個非常“底層”的語言,也是應用最廣泛的

C#語言中的各種數據類型,與數據類型之間的轉換

優化配置 line com 歸類 浮點 初學者 結構 ali 順序 什麽是數據類型? 數據類型,百度百科是這樣解釋的:數據類型在數據結構中的定義是一個值的集合以及定義在這個值集上的一組操作。這樣的解釋對於一個初學者來說未必太過於深奧。 簡單點說,數據類型就是不同長度的數據的

C語言字符串結束符'

單獨 lan 數組 targe 情況 包括 span htm ext 如果你希望你的字符串以’\0‘結束,那麽你可以這樣做: 1 char str[]={"hello"};//①字符串賦值 2 char str[]={‘h‘,‘e‘,‘l‘,

編程之美,讓美國人科技高速發展,C語言帶給美國的變化

c99 開發者 追蹤 n) 再次 故障排查 最新 gen 內部數據   我去年7月份有幸應美國朋友的邀約,在美國眾多正在飛速發展中的高科技型企業暢遊了一番。本來我以為,美國只有Google公司,蘋果公司,FaceBook,IBM,微軟,思科這些巨型的高新技術企業在世界的新技

C語言中的兩種語句

我們都知道學習C語言都會遇到兩種常見的語句:選擇語句,迴圈語句。今天就讓我們一起來簡單看看這些語句的特點及功能吧! 選擇語句 if語句,用來實現兩個分支的選擇結構。 switch語句,用來實現多分支的選擇結構。 比如這裡有一個選擇語句: #include&

C語言

作為一個剛入坑學習C語言的萌新,對C語言也有了一個初步的認識。現在,筆者將分享一下學習C語言的這麼些日子裡對C語言的認識。迴圈結構,順序結構,以及選擇結構是結構化程式設計的基本結構。在我們剛剛學習C語言並用之敲程式碼的時候時常要用到這三種結構。其實對於這三種結構,書上的講述已經十分清楚了,讀者也能十

C語言中的布林(bool)型別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c語言程式設計用strcpy比較陣列(銀行卡密碼程式設計),strcpy(複製陣列內容)和getchar()(敲鍵盤字元,統計要的字元的個數)

統計從鍵盤輸入一行字元的個數:   1 //用了getchar() 語句 2 //這裡的\n表示回車 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int n =

C 語言中的結構體【struct】與聯合體【union】

## C語言中結構 struct 與聯合 union 語法基本一致,如下以 struct 為例 一、struct 的基本用法 struct student {     int num;     char* sex; &nbs

c#語言的類,事件,物件,方法和函式的區別

在討論這些關係之前讓我們先來了解一下面向過程和麵向物件的區別: 所謂面向過程就是把一切事物或者需要解決的問題都當做是一個過程來處理,而面向物件則是把一切事物當成一個一個的物件來處理,這兩者有什麼區別呢,舉一個簡單的例子: 編寫一個駕駛汽車的程式: (1)面向過程的程式設計:

c語言typedef 與結構體指標(個人小經驗)

 #include<stdio.h> #include<string.h> typedef struct emp{  char sex[8];  char name[15];  int age; }*emp;//這裡我們用typedef把emp這

c語言中的易錯點

1、printf中字串過長時需要折行書寫使得程式更加易讀 printf("隨便打的話隨便打的話隨便打的話隨便打的話隨便打的話"); 用下面的方式直接折行會報錯 printf("隨便打的話隨便打的話隨便打的話 隨便打的話隨便打的話"); ①用””

C語言中文字檔案與二進位制檔案

C語言中,按檔案中的資料組織形式來分,資料檔案可分為ASCII碼檔案(即文字檔案)和二進位制檔案。 文字檔案在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。 二進位制檔案把資料按其在記憶體中的儲存形式存放在磁碟上,一個位元組並不一定對應一個字元。 對於A

C語言中的聯合體

      當多個數據需要共享記憶體或者多個數據每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對於聯合體是這麼描述的:      1)聯合體是一個結構;      2)它的所有成員相對於基地址的偏移量都為0;      3)此結構空間要大到足夠容納最"寬

C語言中如何取隨機數

1. 基本函式在C語言中取隨機數所需要的函式是:int rand(void);void srand (unsigned int n);rand()函式和srand()函式被宣告在標頭檔案stdlib.h中,所以要使用這兩個函式必須包含該標頭檔案:#include <

C語言中的堆

作業系統堆管理器管理: 堆管理器是作業系統的一個模組,堆管理記憶體分配靈活,按需分配。 大塊記憶體:   堆記憶體管理者總量很大的作業系統記憶體塊,各程序可以按需申請使用,使用完釋放。 程式手動申請&釋放:   手工意思是需要寫程式碼去申請

C語言的volatile關鍵字

對於volatile關鍵字我們平時很少用到,但是有時候它就派上用場了,所以下面我們淺談一下(如果你要搞嵌入式程式設計,抱歉此處小二的層次幫不了你,┭┮﹏┭┮) 注:此處使用的是C++編譯器 沒有volatile關鍵字 來看一段程式碼: #include <std

C語言發展史

  C語言之所以命名為C,是因為 C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。   1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Programm

C語言的資料儲存(一)

程式由指令和資料組成,C語言程式亦是如此。開發者在編寫程式的時候往往需要根據不同資料的特點以及程式需求來選擇不同的資料儲存方式,那麼在C語言中資料的儲存分為哪些方式呢? C程式大致來講可以分為四個資料區:常量區,靜態去,堆區,棧區。 其中常量區儲存了未被作為初始化使用的字

C語言中的記憶體對齊

先看一下下面兩段程式碼: 1:#include int main(){       struct st{              short a;              int b,c;              char d;       };       printf("%d",sizeof(st