#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
// 用户信息结构体
typedef struct {
int id;
char username[MAX_LEN];
char password[MAX_LEN];
char phone[MAX_LEN];
char email[MAX_LEN];
} User;
// 链表节点结构体
typedef struct Node {
User user;
struct Node* next;
} Node;
// 读取.csv文件中的用户信息并加载到链表中
Node* loadUsersFromCSV(const char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("Failed to open file: %s\n", filename);
return NULL;
}
char line[MAX_LEN];
Node* head = NULL;
Node* tail = NULL;
while (fgets(line, sizeof(line), file) != NULL) {
// 解析CSV行
char* token;
char* rest = line;
int field = 0;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->next = NULL;
while ((token = strtok_r(rest, ",", &rest))) {
switch (field) {
case 0:
newNode->user.id = atoi(token);
break;
case 1:
strcpy(newNode->user.username, token);
break;
case 2:
strcpy(newNode->user.password, token);
break;
case 3:
strcpy(newNode->user.phone, token);
break;
case 4:
strcpy(newNode->user.email, token);
break;
default:
break;
}
field++;
}
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
fclose(file);
return head;
}
// 在链表中查找指定ID的用户
Node* findUser(Node* head, int id) {
Node* current = head;
while (current != NULL) {
if (current->user.id == id) {
return current;
}
current = current->next;
}
return NULL;
}
// 添加用户到链表
void addUser(Node** head, User newUser) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->user = newUser;
newNode->next = *head;
*head = newNode;
printf("User added successfully.\n");
}
// 从链表中删除指定ID的用户
void deleteUser(Node** head, int id) {
Node* current = *head;
Node* prev = NULL;
while (current != NULL) {
if (current->user.id == id) {
if (prev == NULL) {
*head = current->next;
} else {
prev->next = current->next;
}
free(current);
printf("User deleted successfully.\n");
return;
}
prev = current;
current = current->next;
}
printf("User not found.\n");
}
// 修改链表中指定ID的用户信息
void modifyUser(Node* head, int id, User modifiedUser) {
Node* userNode = findUser(head, id);
if (userNode!= NULL) {
userNode->user = modifiedUser;
printf("User modified successfully.\n");
} else {
printf("User not found.\n");
}
}
// 将链表中的用户信息写入.csv文件
void saveUsersToCSV(const char* filename, Node* head) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("Failed to open file: %s\n", filename);
return;
}
Node* current = head;
while (current != NULL) {
fprintf(file, "%d,%s,%s,%s,%s\n", current->user.id, current->user.username, current->user.password, current->user.phone, current->user.email);
current = current->next;
}
fclose(file);
printf("User information saved successfully.\n");
}
// 释放链表内存
void freeList(Node* head) {
Node* current = head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
}
int main() {
const char* filename = "users.csv";
Node* userList = loadUsersFromCSV(filename);
if (userList == NULL) {
printf("No user information found.\n");
return 0;
}
int choice;
int id;
User newUser;
User modifiedUser;
do {
printf("\nUser Management System\n");
printf("1. Add User\n");
printf("2. Delete User\n");
printf("3. Modify User\n");
printf("4. Search User\n");
printf("5. Save User Information\n");
printf("6. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter user ID: ");
scanf("%d", &newUser.id);
printf("Enter username: ");
scanf("%s", newUser.username);
printf("Enter password: ");
scanf("%s", newUser.password);
printf("Enter phone: ");
scanf("%s", newUser.phone);
printf("Enter email: ");
scanf("%s", newUser.email);
addUser(&userList, newUser);
break;
case 2:
printf("Enter user ID to delete: ");
scanf("%d", &id);
deleteUser(&userList, id);
break;
case 3:
printf("Enter user ID to modify: ");
scanf("%d", &id);
printf("Enter new username: ");
scanf("%s", modifiedUser.username);
printf("Enter new password: ");
scanf("%s", modifiedUser.password);
printf("Enter new phone: ");
scanf("%s", modifiedUser.phone);
printf("Enter new email: ");
scanf("%s", modifiedUser.email);
modifyUser(userList, id, modifiedUser);
break;
case 4:
printf("Enter user ID to search: ");
scanf("%d", &id);
Node* userNode = findUser(userList, id);
if (userNode != NULL) {
printf("User found:\n");
printf("ID: %d\n", userNode->user.id);
printf("Username: %s\n", userNode->user.username);
printf("Password: %s\n", userNode->user.password);
printf("Phone: %s\n", userNode->user.phone);
printf("Email: %s\n", userNode->user.email);
} else {
printf("User not found.\n");
}
break;
case 5:
saveUsersToCSV(filename, userList);
break;
case 6:
printf("Exiting program.\n");
break;
default:
printf("Invalid choice. Please try again.\n");
break;
}
} while (choice != 6);
freeList(userList);
return 0;
}