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