大白話說單鏈表,基礎使用

我是看着【C語言】帶你學C帶你飛和《啊哈!算法》學習的,建議看看鏈表這章

【C語言】《帶你學C帶你飛》(小甲魚)

鏈表,指針!

結構體可不可以這樣

struct Test{
    int x;
    int y;
    struct Test test;
};

哦這顯然是不行的,這樣會陷入無限循環,test的結構體又會指向自己,再次指向,就成了沒有出口的遞歸,但是有一種方法可以解決!

struct Test{
    int x;
    int y;
    struct Test *test;
};

📖這是什麼?指針?對就是指針!牛逼吧,一個星號解決問題!但是有沒有一個指向自身的數據結構呢?別說,還真有,那就是鏈表!

在這裏插入圖片描述

鏈表中最簡單的就是單鏈表,鏈表是使用指針連接在一起的,所以內存不需要緊密連接,所以比較鬆散,鏈表重一個節點的結構是一個信息域指針域,信息域就是存儲信息的,指針域是指向下一個節點的

在這裏插入圖片描述
指着指着,最後指向NULL結束,顯然還需要一個頭指針指向第一個節點

下一步,在鏈表中插入一個新的元素,只需要確定要插在哪裏,然後將原本的指針先拿開指向新來的節點,再將新來的節點指向原本的後一個節點就可以,這叫做頭插法

在這裏插入圖片描述

好,我們先構造一個簡單的只能輸入的傻鏈表

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct List
{
    int data;
    struct List *next;
}; //構建鏈表

void getInput(struct List *book)
{
    printf("輸入數據:");
    scanf("%s", book->data);
}

void addData(struct List **head)
{
    struct List *list, *temp;
    list = (struct List *)malloc(sizeof(struct List));
    //動態分配內存
    //檢測內存是否分配失敗
    if (list == NULL)
    {
        printf("內存分配失敗了\n");
        exit(1);
    }

    getInput(list);

    if (*head != NULL)
    { //非空鏈表插入
        temp = *head;
        *head = list;
        list->next = temp;
    }
    else
    { //空鏈表插入
        *head = list;
        list->next = NULL;
    }
    return;
}

int main()
{
    struct List *head;
    head = NULL;
    addData(&head);
    return 0;
}

現在分析,我說的不全面可以看視頻,首先需要頭指針head,指向NULL,意味着空鏈表,下面執行addData函數,給頭指針的地址,然後我們需要動態給list分配內存,list是主鏈吧,如果malloc崩了,那麼if語句就會異常退出,再次輸入數據,例如輸入一個123,如果非空鏈表需要用臨時變量保存頭指針,然後將next指向臨時變量,***就行了,空鏈表不需要臨時變量,就可以

下面可以輸出鏈表:

void printList(struct List * head)
{
    struct List * list;
    int count = 1;

    list = head; //將頭指針給鏈表

    while (list != NULL)
    {
        printf("id:%d", count);
        printf("data:%d\n", list->data);
        list = list->next; //賦值爲下一個節點
        count++; //計數器加一
    }
}

大家可以使用free釋放空間,如果鏈表不等於NULL就是不爲空,就一直循環!

SRC

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct List
{
    int data;
    struct List *next;
}; //構建鏈表

void getInput(struct List *book)
{
    printf("輸入數據:");
    scanf("%s", book->data);
}

void addData(struct List **head)
{
    struct List *list, *temp;
    list = (struct List *)malloc(sizeof(struct List));
    //動態分配內存
    //檢測內存是否分配失敗
    if (list == NULL)
    {
        printf("內存分配失敗了\n");
        exit(1);
    }

    getInput(list);

    if (*head != NULL)
    { //非空鏈表插入
        temp = *head;
        *head = list;
        list->next = temp;
    }
    else
    { //空鏈表插入
        *head = list;
        list->next = NULL;
    }
    return;
}

void printList(struct List * head)
{
    struct List * list;
    int count = 1;

    list = head; //將頭指針給鏈表

    while (list != NULL)
    {
        printf("id:%d", count);
        printf("data:%d\n", list->data);
        list = list->next; //賦值爲下一個節點
        count++; //計數器加一
    }
}

int main()
{
    struct List *head;
    head = NULL;
    addData(&head);
    addData(&head);
    addData(&head);
    printList(head);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章