C/C++ 鏈表構建、遍歷

1、鏈表的概述、簡單構建、遍歷(無頭鏈表)

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定義一個用戶對象
struct User
{
    int id;
    char name[20];
    User* next;
};
// 準備四個User對象
User us[4] = {
    {1, "張三", 0},
    {2, "李四", 0},
    {3, "王五", 0},
    {4, "趙六", 0},
};
// 查找鏈表中ID爲1的對象
User* find(User* head, int id);

/*
 鏈表:
    1、什麼是鏈表?
        把若干個對象用指針連起來,形成一個鏈狀的數據結構,成爲鏈表
    2、特徵
        鏈表頭:指鏈表中的第一個對象。只需要一個鏈表頭,就能訪問所有的串起來的對象
        鏈表尾:指鏈表中的最後一個對象。 它的next必須設爲空指針NULL
    3、鏈表的遍歷:下面while示列
*/
int main() {

    // 簡單構建鏈表(有點類似像Java set賦值child子節點構成樹結構數據)
    us[0].next = &us[1];
    us[1].next = &us[2];
    us[2].next = &us[3];
    us[3].next = 0;
    // 鏈表的最後一個對象的next爲Null,也就是0空指針,後面根據這一特徵可以判斷鏈表已結束

    // 鏈表的遍歷/循環
    User* p = &us[0];

    printf("ID \t Name\n");
    while (true)
    {
        printf("%d \t %s\n", p->id, p->name);
        // 判斷next是否在有數據,爲空指針的時候停止
        if (!p->next) break;
        p = p->next;
    }

    printf("\n");

    int input_a = 0;
    printf("請輸入要查詢的ID>>>\n");
    scanf("%d", &input_a);
    // 查找鏈表中ID爲1的對象
    User* userp = find(&us[0], input_a);
    // 如果鏈表中查詢到了值就打印
    if (userp) {
        printf("ID \t Name\n");
        printf("%d \t %s\n", userp->id, userp->name);
    }
    else {
        printf("未找到鏈表中ID爲 %d 的數據, \n", input_a);
    }

    system("pause");
}

User* find(User* head, int id) {
    User* p = head;
    while (true)
    {
        if (p->id == id) {
            return p;
        }
        if (!p->next) break;
        p = p->next;
    }
    return NULL;
}

2、有頭鏈表:用一個固定的頭節點來指代整個鏈表,所有的對象掛載這個頭節點下面,而頭節點本身不包含有效數據

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

struct User
{
    int id;
    char name[20];
    User* next;
};

// 有頭鏈表的定義:將一個對象作爲節點,並把成員next初始化爲NULL
// User head_user = { 1, "head", 0 }; // 0就是NULL
// 或者指定只定義next爲空指針
User head_user = {0};

// 往頭節點添加User對象(把對象附加到鏈表的開頭)
void add(User* user);
// 往尾節點添加User對象(把對象附加到鏈表的末尾)
void insert(User* user);

/*
 有頭鏈表:
    定義:用一個固定的頭節點來指代整個鏈表,所有的對象掛載這個頭節點下面,
        而頭節點本身不包含有效數據
    構造:
 調試查看鏈表數據: 進入調試F5 => 調出監視窗口 => 搜索鏈表名稱
*/
int main() {

    User user = {1, "張三", 0};
    insert(&user);
    User user2 = { 2, "李四", 0 };
    insert(&user2);

	return 0;
}

// 往頭節點添加User對象(把對象附加到鏈表的開頭)
void add(User* user) {
    // 傳進來的對象追加到鏈表第一個
    user->next = head_user.next;
    head_user.next = user;
}

// 往尾節點添加User對象(把對象附加到鏈表的末尾)
void insert(User* user) {
    // 通過指針獲取鏈表的內存地址
    User* p = &head_user;
    // 循環已存在的鏈表數據結構,目的得到鏈表的最後一個User的內存地址p
    while (p->next)
        p = p->next;
    // 將user賦給最後一個鏈表數據的next
    p->next = user;
    user->next = NULL;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章