#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 用户结构体
typedef struct {
int id;
char username[50];
char password[50];
char phone[20];
char email[50];
} User;
// 二叉排序树结点结构体
typedef struct Node {
User user;
struct Node* left;
struct Node* right;
} Node;
// 创建新的结点
Node* createNode(User user) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->user = user;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入结点到二叉排序树
Node* insertNode(Node* root, User user) {
if (root == NULL) {
root = createNode(user);
} else {
// 根据用户名比较大小决定插入位置
if (strcmp(user.username, root->user.username) < 0) {
root->left = insertNode(root->left, user);
} else {
root->right = insertNode(root->right, user);
}
}
return root;
}
// 在二叉排序树中查找结点
Node* searchNode(Node* root, char* username) {
if (root == NULL || strcmp(username, root->user.username) == 0) {
return root;
}
if (strcmp(username, root->user.username) < 0) {
return searchNode(root->left, username);
}
return searchNode(root->right, username);
}
// 删除二叉排序树中的结点
Node* deleteNode(Node* root, char* username) {
if (root == NULL) {
return root;
}
if (strcmp(username, root->user.username) < 0) {
root->left = deleteNode(root->left, username);
} else if (strcmp(username, root->user.username) > 0) {
root->right = deleteNode(root->right, username);
} else {
// 找到要删除的结点
// 结点没有子节点或只有一个子节点
if (root->left == NULL) {
Node* temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
Node* temp = root->left;
free(root);
return temp;
}
// 结点有两个子节点
Node* minNode = root->right;
while (minNode->left != NULL) {
minNode = minNode->left;
}
root->user = minNode->user;
root->right = deleteNode(root->right, minNode->user.username);
}
return root;
}
// 修改二叉排序树中的结点
void modifyNode(Node* root, char* username, User user) {
Node* node = searchNode(root, username);
if (node != NULL) {
node->user = user;
}
}
// 中序遍历二叉排序树,打印用户信息
void inorderTraversal(Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("ID: %d, Username: %s, Password: %s, Phone: %s, Email: %s\n",
root->user.id, root->user.username, root->user.password, root->user.phone, root->user.email);
inorderTraversal(root->right);
}
}
// 保存二叉排序树到.csv文件
void saveToFile(FILE* file, Node* root) {
if (root != NULL) {
saveToFile(file, root->left);
fprintf(file, "%d,%s,%s,%s,%s\n", root->user.id, root->user.username, root->user.password, root->user.phone, root->user.email);
saveToFile(file, root->right);
}
}
// 从.csv文件中加载用户信息到二叉排序树
Node* loadFromFile(FILE* file, Node* root) {
char line[256];
while (fgets(line, sizeof(line), file)) {
User user;
sscanf(line, "%d,%[^,],%[^,],%[^,],%[^,\n]", &user.id, user.username, user.password, user.phone, user.email);
root = insertNode(root, user);
}
return root;
}
int main() {
Node* root = NULL;
FILE* file = fopen("users.csv", "r");
if (file != NULL) {
root = loadFromFile(file, root);
fclose(file);
}
int choice;
do {
printf("\n------ 用户信息管理系统 ------\n");
printf("1. 查找用户信息\n");
printf("2. 新增用户信息\n");
printf("3. 删除用户信息\n");
printf("4. 修改用户信息\n");
printf("5. 打印用户信息\n");
printf("6. 保存用户信息到文件\n");
printf("0. 退出\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 0:
printf("感谢使用用户信息管理系统,再见!\n");
break;
case 1: {
char username[50];
printf("请输入要查找的用户名:");
scanf("%s", username);
Node* node = searchNode(root, username);
if (node != NULL) {
printf("用户信息找到:\n");
printf("ID: %d, Username: %s, Password: %s, Phone: %s, Email: %s\n",
node->user.id, node->user.username, node->user.password, node->user.phone, node->user.email);
} else {
printf("未找到该用户名的用户信息。\n");
}
break;
}
case 2: {
User user;
printf("请输入新用户的ID:");
scanf("%d", &user.id);
printf("请输入新用户的用户名:");
scanf("%s", user.username);
printf("请输入新用户的密码:");
scanf("%s", user.password);
printf("请输入新用户的电话:");
scanf("%s", user.phone);
printf("请输入新用户的邮箱:");
scanf("%s", user.email);
root = insertNode(root, user);
printf("用户信息已添加。\n");
break;
}
case 3: {
char username[50];
printf("请输入要删除的用户名:");
scanf("%s", username);
root = deleteNode(root, username);
printf("用户信息已删除。\n");
break;
}
case 4: {
char username[50];
printf("请输入要修改的用户名:");
scanf("%s", username);
Node* node = searchNode(root, username);
if (node != NULL) {
User user;
printf("请输入新的ID:");
scanf("%d", &user.id);
printf("请输入新的用户名:");
scanf("%s", user.username);
printf("请输入新的密码:");
scanf("%s", user.password);
printf("请输入新的电话:");
scanf("%s", user.phone);
printf("请输入新的邮箱:");
scanf("%s", user.email);
modifyNode(root, username, user);
printf("用户信息已修改。\n");
} else {
printf("未找到该用户名的用户信息。\n");
}
break;
}
case 5:
printf("所有用户信息:\n");
inorderTraversal(root);
break;
case 6: {
FILE* file = fopen("users.csv", "w");
if (file != NULL) {
saveToFile(file, root);
fclose(file);
printf("用户信息已保存到文件。\n");
} else {
printf("保存文件失败。\n");
}
break;
}
default:
printf("无效的选择,请重新输入。\n");
}
} while (choice != 0);
return 0;
}