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;
}