节点保存的结构体是这样的:
//结构体
//用户名/管理员名与密码
typedef struct User{
char username[20];
char password[20];
struct User *next;
}usr;
以下是初始化函数
//初始化链表函数
//用户初始化(把文件中的用户名和密码导入链表)
usr *userNode(){
usr *usrhead=(usr*)malloc(sizeof(usr));
usr temp;
usr *p=usrhead;
temp.next=NULL;//防止野指针
p->next=NULL;
FILE *user=fopen("users.txt","r");
if (user==NULL){
printf("文件打开失败!\n");
return usrhead;
}
//循环读取文件并存到新的链表中
while(1){
if(fgets(temp.username,sizeof(temp.username),user)==NULL){
break;
}
fgets(temp.password,sizeof(temp.password),user);
removeNewLine(temp.username);removeNewLine(temp.password);
p->next=(usr*)malloc(sizeof(usr));
p=p->next;
strcpy(p->username,temp.username);
strcpy(p->password,temp.password);
p->next=NULL;
}
fclose(user);
return usrhead;
}
这是一个示例,具体代码自行修改,下面是GPT的解释
ChatGPT的解释
这段 C 代码是用于初始化链表的函数。它的作用是从一个名为 "users.txt" 的文件中读取用户名和密码,并将它们存储到链表中。
usr *userNode()
: 这是一个函数声明,它返回一个指向usr
结构体的指针。usr *usrhead=(usr*)malloc(sizeof(usr));
: 在内存中分配了一个usr
结构体大小的空间,并将其地址赋给usrhead
指针。usr temp;
: 创建一个临时的usr
结构体变量temp
,用来暂存从文件中读取的用户名和密码。usr *p=usrhead;
: 创建一个指向usr
结构体的指针p
,并将其初始化为usrhead
,它将用于遍历链表。temp.next=NULL;
和p->next=NULL;
: 将temp
和p
的next
字段初始化为NULL
,确保没有野指针。FILE *user=fopen("users.txt","r");
: 打开名为 "users.txt" 的文件以供读取。如果文件无法打开,则输出错误信息并返回usrhead
。while(1) { ... }
: 这是一个无限循环,用于从文件中读取用户名和密码,并将其存储到链表中。if(fgets(temp.username,sizeof(temp.username),user)==NULL) { break; }
: 使用fgets
函数从文件中读取一行作为用户名,如果读取到文件末尾则跳出循环。fgets(temp.password,sizeof(temp.password),user);
: 读取文件中的下一行作为密码。removeNewLine(temp.username); removeNewLine(temp.password);
: 去除用户名和密码中的换行符。p->next=(usr*)malloc(sizeof(usr));
: 分配新的usr
结构体大小的内存,并将其地址存储在p->next
中,创建新节点。p=p->next;
: 将p
指向下一个节点,为下一次循环准备。strcpy(p->username,temp.username); strcpy(p->password,temp.password);
: 将从文件中读取的用户名和密码复制到新节点p
中。p->next=NULL;
: 将新节点的next
指针设置为NULL
,表示这是链表中的最后一个节点。fclose(user);
: 关闭文件。return usrhead;
: 返回链表的头指针usrhead
,其中包含了从文件中读取的用户名和密码的链表。
这个函数的核心作用是从文件中读取用户名和密码,然后将它们按顺序存储到链表中的节点中,最后返回链表的头指针。
© 版权声明
文章版权归作者所有,请勿转载至任何平台。
THE END
暂无评论内容