C++ 有头链表的插入与删除

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cocosum

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值