成人app

單鏈表一

點擊打開在線編譯器,邊學邊練

1. 單鏈表概念&設計

成人app單鏈表是一種鏈式存取的數據結構,,鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。以“結點的序列”表示的線性表稱作線性鏈表(單鏈表),單鏈表是鏈式存取的結構。

 

成人app對于鏈表的每一個結點,我們使用結構體(struct)進行設計,其主要內容有:


22.png

成人app其中,DATA數據元素,可以為你想要儲存的任何數據格式,可以是數組,可以是int,甚至可以是結構體(這就是傳說中的結構體套結構體)

NEXT為一個指針,其代表了一個可以指向的區域,通常是用來指向下一個結點,鏈表的尾部NEXT指向NULL(空),因為尾部沒有任何可以指向的空間了

成人app故,對于一個單鏈表的結點定義,可以代碼描述成:

//定義結點類型
typedef struct Node {
    int data;       //數據類型,你可以把int型的data換成任意數據類型,包括結構體struct等復合類型
    struct Node *next;          //單鏈表的指針域
} Node,*LinkedList;  
//Node表示結點的類型,LinkedList表示指向Node結點類型的指針類型


2. 初始化

同任何的結構,類型一樣,鏈表也需要初始化操作,初始化是創建一個單鏈表的前置節點并向后逐步添加節點,一般來說,我們所謂的初始化單鏈表一般指的是申請結點的空間,同時對一個結點輔以空值(NULL),其代碼可以表示為:

LinkedList listinit(){
    Node *L;
    L=(Node*)malloc(sizeof(Node));      //開辟空間 
    if(L==NULL){                     //判斷是否開辟空間失敗,這一步很有必要
        printf("申請空間失敗");
        //exit(0);                  //開辟空間失敗可以考慮直接結束程序
    }
    L->next=NULL;       //指針指向空
}

在這里我們有一個注意點,就是一定要記住判斷是否開辟空間失敗,雖然在很多試題中以及常用的環境提供的環境非常安全,幾乎沒有開辟失敗的存在,但是也一定要養成判斷是否開辟失敗并且判斷失敗后執行代碼,但在生產中由于未知的情況造成一旦空間開辟失敗任然在繼續執行代碼,后果將不堪設想,因此養成這樣的判斷是很有必要的,在C++中可以使用try-catch這樣的語句進行優化。


3. 創建單鏈表(頭插入法)

成人app在初始化之后,就可以著手開始創建單鏈表了,單鏈表的創建分為頭插入法和尾插入法兩種,兩者并無本質上的不同,都是利用指針指向下一個結點元素的方式進行逐個創建,只不過使用頭插入法最終得到的結果是逆序的。

如圖,為頭插法的創建過程:

25.png


該方法從一個空表開始,生成新結點,并將讀取到的數據存放到新結點的數據域中,然后將新結點插入到當前鏈表的表頭,即頭結點之后。

//單鏈表的建立1,頭插法建立單鏈表
LinkedList LinkedListCreatH() {
    Node *L;
    L = (Node *)malloc(sizeof(Node));   //申請頭結點空間
    L->next = NULL;                      //初始化一個空鏈表
 
    int x;                         //x為鏈表數據域中的數據
    while(scanf("%d",&x) != EOF) {
        Node *p;
        p = (Node *)malloc(sizeof(Node));   //申請新的結點
        p->data = x;                     //結點數據域賦值
        p->next = L->next;     //將結點插入到表頭L-->|2|-->|1|-->NULL
        L->next = p;
    }
    return L;


4. 創建單鏈表(尾插入法)

成人app如圖,為尾插入法的創建過程。

26.png


頭插法建立單鏈表的算法雖然簡單,但生成的鏈表中結點的次序和輸入數據的順序不一致。若希望兩者次序一致,可采用尾插法。

成人app該方法是將新結點逐個插入到當前鏈表的表尾上,為此必須增加一個尾指針 r, 使其始終指向當前鏈表的尾結點,否則就無法正確的表達鏈表。

//單鏈表的建立2,尾插法建立單鏈表
 
LinkedList LinkedListCreatT() {
    Node *L;
    L = (Node *)malloc(sizeof(Node));   //申請頭結點空間
    L->next = NULL;                  //初始化一個空鏈表
    Node *r;
    r = L;                          //r始終指向終端結點,開始時指向頭結點
    int x;                         //x為鏈表數據域中的數據
    while(scanf("%d",&x) != EOF) {
        Node *p;
        p = (Node *)malloc(sizeof(Node));   //申請新的結點
        p->data = x;                     //結點數據域賦值
        r->next = p;            //將結點插入到表頭L-->|1|-->|2|-->NULL
        r = p;
    }
    r->next = NULL;
    return L;
}

(待續)



本文固定URL:http://hnsaiyang.com/course/96

上一課:順序存儲和鏈式存儲 下一課:單鏈表二
第一章 數據結構入門
第二章 鏈表
第三章 棧
第四章 隊列
第五章 從C語言到C++
第六章 串,數組,矩陣,廣義表
第七章 樹
第八章 圖
第九章 算法—查找
第十章 算法—排序
第十一章 算法&競賽,思維培養
第十二章 后記
Dotcpp在線編譯      (登錄可減少運行等待時間)