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

 

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