#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct User
{
int id;
char name[20];
User* next;
};
// 定一個有頭鏈表
User h_user = { 0 };
// 鏈表添加數據(添加到末尾)
void insert_user(User* user);
// 動態創建User對象添加鏈表數據
void dynamic_new_user();
// 遍歷h_user鏈表數據
void list_user();
// 鏈表添加數據(按順序插入, 通過ID)
void add_user();
// 刪除節點
void delete_user(User* user);
/*
按順序插入節點與刪除節點
刪除節點的核心目標: 找到這個節點, 並記錄該節點的前一個節點pre
*/
int main() {
char input[20];
while (true)
{
printf(">>");
scanf("%s", &input);
if (!strcmp(input, "insert")) {
// 動態添加鏈表數據(User)
dynamic_new_user();
}
else if (!strcmp(input, "add")) {
// 按順序入插入
add_user();
// 比如添加下面三條數據
// {1, "張三"}
// {2, "李四"}
// {5, "王五"}
// 如何是實現{4, "老羅"}插入ID爲5的前面
}
else if (!strcmp(input, "list")) {
// 查看鏈表數據
list_user();
}
else if (!strcmp(input, "delete")) {
User user = {1};
delete_user(&user);
}
else if (!strcmp(input, "exit") || !strcmp(input, "quit")) {
break;
}
}
return 0;
}
// 鏈表添加數據(末尾)
void insert_user(User* user) {
// 獲取鏈表內存地址
User* p = &h_user;
// 如果p.next不是空指針的情況下循環
while (p->next)
{
// 得到鏈表的最後一個User對象數據
p = p->next;
}
p->next = user;
user->next = NULL;
}
// 動態創建User對象, 並添加到鏈表
void dynamic_new_user() {
User* user = (User*)malloc(sizeof(User));
printf("請輸入ID: ");
scanf("%d", &user->id);
printf("請輸入用戶名稱:");
scanf("%s", user->name);
insert_user(user);
}
// 遍歷h_user鏈表數據
void list_user() {
User* p = &h_user;
printf("ID \t Name \t \n");
while (p)
{
if (p->id)
printf("%d \t %s \t \n", p->id, p->name);
p = p->next;
}
}
// 鏈表添加數據(按順序插入, 通過ID)
void add_user() {
User* user = (User*) malloc(sizeof(User));
printf("請輸入ID: ");
scanf("%d", &user->id);
printf("請輸入用戶名稱:");
scanf("%s", user->name);
// 當前節點
User* cur = h_user.next;
// 上一個節點
User* pre = &h_user;
while (cur)
{
if (user->id < cur->id) break;
pre = cur;
cur = cur->next;
}
// 將NULL賦值給新增的user對象
user->next = pre->next;
// 插入
pre->next = user;
}
// 刪除節點
void delete_user(User* user) {
// 當前節點
User* cur = h_user.next;
// 上一個節點
User* pre = &h_user;
while (cur)
{
// 找到位置
if (user->id == cur->id) {
pre->next = cur->next;
free(cur);
break;
}
pre = cur;
cur = cur->next;
}
}