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

 

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