【C语言项目】 以链表实现的管理系统(注册、登录、对表进行数据操作)

news2024/11/24 20:20:24

第一次编辑这么长的文章,如果对你有帮助,可以点赞收藏一下一起学习!一起进步!


目录

一、项目介绍

二、代码介绍

三、小记

四、完整代码

五、输出结果展示

1、成功将终端输入的用户姓名和密码分别存入到.txt文件中

2、登陆成功     &&    退出成功

3、创建/初始化管理表成功

4、录入人员信息成功

5、按位置插入人员信息成功,插入位置不对会报错

6、输出所有人员信息成功

7、通过姓名查找人员信息成功

8、通过姓名删除人员信息成功

9、导出所有人员信息到文件内成功

10、打印文件信息到终端上成功

11、按姓名将通讯录排序成功(实现的是升序排序)

12、获取链表长度成功

13、统计性别数量成功

14、返回上级菜单成功

15、销毁链表成功

16、退出成功


一、项目介绍

        项目:基于链表的通信录管理

意义:对于一个通信录来说,要管理联系人的信息,包括编号,姓名,性别,电话。开发其系统主要为了帮助用户提高通讯录有管理效率,节约资源,提高信息的精确度

模块:
一级菜单内容
1> 注册模块:完成用户信息的注册用于登录管理系统,将注册信息存入文件
2> 登录模块:使用输入的登录账号和密码与文件存储信息对比
3> 退出系统


二级菜单内容:
3> 创建模块create:创建链表完成对通信录的存储
4> 添加数据add:添加通信录的信息放入链表中
5> 查找信息find:可以通过姓名进行查找
6> 修改信息update:可以修改联系人信息并保存,修改联系人信息有包括了对联系人编号,姓名,性别,电话号码的分别修改,也可以同时对编号,姓名,性别,电话号码修改;
7> 删除信息delete:可根据输入的姓名进行删除
8> 插入信息insert:将给定的信息以及插入位置信息完成插入
9> 展示信息show:将通讯录的所有信息进行展示
10> 导出信息export:将通讯录信息导出到文件中
11> 按照姓名将通讯录排序
12> 返回上一级
辅助功能:
13> 初始化链表init:将链表进行初始化
14> 获取链表长度getLength:
15> 统计性别;


二、代码介绍

  1. 采用分文件编译,link_list.h,link_list.c,main.c
  2. 在堆区申请了空间用于存放链表
  3. link_list.h中定义了两个结构体,一个是管理结构体,一个是人员信息结构体,同时包含了函数的声明
  4. link_list.c中完成了函数功能的封装
  5. mian.c主函数里,使用了两个while循环,进行菜单的循环展示,如果登录成功,则会进入下一级菜单,使用switch,进行功能的实现
  6. 在注册的时候,只保证了一个用户的创建,多个用户的创建还没实现

三、小记

        项目不难,有耐心就能完成,其中也是遇到了很多的问题。例如在对链表进行操作的时候,没有对输入的内容进行逻辑判断是否合理,导致指针指向的位置发生偏移出现段错误。在进行赋值语句的时候,尝尝忘记数组不能作为常量直接进行赋值,如果需要赋值,需要借助strcmp等函数进行操作,否则会发生报错。


四、完整代码

//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_H
#include <myhead.h>

#define MAX 100

//人员信息
typedef struct Person
{
    char id[20];
    char name[20];
    char gender[20];
    char telephone[20];
}Person,*PersonPtr;

//人e员管理
typedef struct Manage
{
    Person person;
    int len;
    struct Manage *next;
}Manage,*ManagePtr;


//创建登录视图
void create_log_view();

//注册
int register_user();

//登录
int log_user();

//判空
int link_empty(ManagePtr person_ptr);

//创建管理视图
void create_view();

//创建班级链表
ManagePtr link_person_create();

//申请人员信息结点
ManagePtr link_apply_node(Person person);

//头删
int link_delete_head(ManagePtr person_ptr);

//头插插入人员信息
int link_insert_person(ManagePtr person_ptr,Person person);

//遍历人员信息
int link_printf_person(ManagePtr person_ptr);

//按位置查找人员结点
ManagePtr link_search_person_pos(ManagePtr person_ptr,int pos);

//按位置插入人员信息
int link_insert_person_pos(ManagePtr person_ptr,int pos,Person person);

//通过姓名查找人员信息
int link_search_name(ManagePtr person_ptr);

//通过人名删除信息
int link_delete_name(ManagePtr person_ptr);

//导出所有人员信息到文件内
void link_export_person(ManagePtr person_ptr);

//打印文件信息
void file_show();

//按照姓名将通讯录排序
void link_person_sort_name(ManagePtr person_ptr);

//统计人员总人数(链表长度)
int link_len(ManagePtr person_ptr);

//统计性别
void link_gender_statistics(ManagePtr person_ptr);

//销毁管理表
void link_destroy(ManagePtr person_ptr);

#endif
//link_list.c
#include "link_list.h"

// 创建登录视图
void create_log_view()
{
    printf("\t\t======1.注册\n");
    printf("\t\t======2.登录\n");
    printf("\t\t======3.退出\n");
}

// 注册
int register_user()
{
    // 存用户和密码
    char user_name[30] = {0};
    char password[30] = {0};

    // 判断是否成功打开文件
    FILE *fp_user = NULL, *fp_password = NULL;
    if ((fp_user = fopen("./user.txt", "w+")) == NULL || (fp_password = fopen("./password.txt", "w+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    // 从终端输入用户姓名和密码
    printf("请输入用户姓名:");
    fgets(user_name, sizeof(user_name), stdin);

    printf("请输入密码:");
    fgets(password, sizeof(password), stdin);

    // 使用fputs将用户名存入user_name.txt
    fputs(user_name, fp_user);
    user_name[strlen(user_name) - 1] = '\0'; // 将回车换成 '\0'

    // 使用fputs将密码写入password.txt
    fputs(password, fp_password);
    password[strlen(user_name) - 1] = '\0';

    // 关闭文件
    fclose(fp_user);
    fclose(fp_password);

    printf("注册成功\n");
    return 0;
}

// 登录
int log_user()
{
    char buf_name[30] = {0};
    char buf_password[30] = {0};
    char input_name[30] = {0};
    char input_password[30] = {0};

    // 打开文件
    FILE *fp_user = NULL, *fp_password = NULL;
    if ((fp_user = fopen("./user.txt", "r")) == NULL || (fp_password = fopen("./password.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    // 从文件里获取账号和密码
    while (1)
    {
        // 如果是NULL,用户姓名读取结束
        if ((fgets(buf_name, sizeof(buf_name), fp_user)) == NULL)
        {
            break;
        }

        // 如果是NULL,密码读取结束
        if ((fgets(buf_password, sizeof(buf_password), fp_password)) == NULL)
        {
            break;
        }
    }
    buf_name[strlen(buf_name) - 1] = '\0'; // 将回车换成 '\0
    buf_password[strlen(buf_password) - 1] = '\0';

    // 输入用户名和密码
    printf("请输入用户名:");
    scanf("%s", input_name);
    getchar();

    printf("请输入密码:");
    scanf("%s", input_password);
    getchar();

    // 判断是否相等
    if (strcmp(buf_name, input_name) == 0 && strcmp(buf_password, input_password) == 0)
    {
        printf("登录成功\n");
        return 0;
    }
    printf("用户名或密码错误,请重新输入\n");
    return -1;
}

// 判空
int link_empty(ManagePtr person_ptr)
{
    return person_ptr->next == NULL; // 如果头指针为空,则表示该链表为空,返回1;
}

// 创建管理视图
void create_view()
{
    printf("\t\t======1.创建/初始化管理表\n");
    printf("\t\t======2.录入人员信息\n");
    printf("\t\t======3.按位置插入人员信息\n");
    printf("\t\t======4.输出所有人员信息\n");
    printf("\t\t======5.通过姓名查找人员信息\n");
    printf("\t\t======6.通过姓名删除人员信息\n");
    printf("\t\t======7.导出所有人员信息到文件内\n");
    printf("\t\t======8.打印文件信息\n");
    printf("\t\t======9.按照姓名将通讯录排序\n");
    printf("\t\t======10.获取链表长度\n");
    printf("\t\t======11.统计性别\n");
    printf("\t\t======12.返回上级菜单\n");
    printf("\t\t======13.销毁管理表\n");
    printf("\t\t======0.退出\n");
}

// 创建人员管理链表
ManagePtr link_person_create()
{
    ManagePtr person_ptr = (ManagePtr)malloc(sizeof(Manage)); // 在堆区申请空间

    // 判断逻辑
    if (person_ptr == NULL)
    {
        printf("人员管理表创建失败\n");
        return NULL;
    }

    // 链表初始化
    person_ptr->len = 0;
    person_ptr->next = NULL;
    printf("人员管理表创建成功\n");
    putchar(10);
    return person_ptr;
}

// 申请人员信息结点
ManagePtr link_apply_node(Person person)
{
    ManagePtr p = (ManagePtr)malloc(sizeof(Manage));

    // 判断逻辑
    if (p == NULL)
    {
        printf("结点创建失败\n");
        return NULL;
    }
    p->person = person;
    p->next = NULL;
    return p;
}

// 头删
int link_delete_head(ManagePtr person_ptr)
{
    // 判断逻辑
    if (NULL == person_ptr || link_empty(person_ptr))
    {
        printf("头删失败\n");
        return -1;
    }

    ManagePtr q = person_ptr->next; // 保存要删除的节点

    // 执行头删逻辑
    person_ptr->next = q->next;
    free(q);

    person_ptr->len--;
    return 0;
}

// 头插插入人员信息
int link_insert_person(ManagePtr person_ptr, Person person)
{
    // 判断逻辑
    if (person_ptr == NULL)
    {
        printf("插入失败\n");
        return -1;
    }

    // 申请一个新的结点
    ManagePtr p = link_apply_node(person);
    p->next = person_ptr->next;
    person_ptr->next = p;
    person_ptr->len++;
    printf("插入成功\n");
    return 0;
}

// 遍历人员信息
int link_printf_person(ManagePtr person_ptr)
{
    // 判断逻辑
    if (NULL == person_ptr)
    {
        printf("遍历失败,链表不存在或已被销毁,请检查!\n");
        return -1;
    }

    ManagePtr q = person_ptr->next;

    // 循环链表
    while (q)
    {
        printf("%s\t%s\t%s\t%s\n", q->person.id, q->person.name, q->person.gender, q->person.telephone);
        q = q->next;
    }
    putchar(10);
    return 0;
}

// 按位置查找人员结点
ManagePtr link_search_person_pos(ManagePtr person_ptr, int pos)
{
    // 判断逻辑
    if (NULL == person_ptr || pos < 0 || pos > person_ptr->len)
    {
        printf("查找失败\n");
        return NULL;
    }

    // 通过位置查找结点
    ManagePtr q = person_ptr;
    for (int i = 0; i < pos; i++)
    {
        q = q->next;
    }

    // 返回结点
    return q;
}

// 按位置插入人员信息
int link_insert_person_pos(ManagePtr person_ptr, int pos, Person person)
{
    if (NULL == person_ptr || pos < 0 || pos > person_ptr->len)
    {
        printf("插入失败,您输入的位置不对,或者链表不存在,请检查!\n");
        printf("\n");
        return -1;
    }

    // 申请一个新的结点
    ManagePtr p = link_apply_node(person);

    // 查找前驱结点
    ManagePtr q = link_search_person_pos(person_ptr, pos - 1);

    p->next = q->next;
    q->next = p;
    person_ptr->len++;
    printf("插入成功\n");
    return 0;
}

// 通过姓名查找人员信息
int link_search_name(ManagePtr person_ptr)
{
    // 判断逻辑,链表是否存在
    if (NULL == person_ptr)
    {
        printf("查找失败\n");
        return -1;
    }

    // 输入人员姓名
    char search_name[30] = {0};
    printf("请输入你需要查找的人员信息的姓名:");
    scanf("%s", search_name);
    getchar();

    ManagePtr q = person_ptr->next;

    // 循环比较输入的内容与存储在链表里面的内容,是否相等
    while (q)
    {
        if (strcmp(q->person.name, search_name) == 0)
        {
            // 如果相等,就输出这个人的姓名
            printf("编号\t姓名\t性别\t电话\n");
            printf("%s\t%s\t%s\t%s\n", q->person.id, q->person.name, q->person.gender, q->person.telephone);
            printf("\n");
            return 0;
        }
        q = q->next;
    }

    // 如果q为NULL,则表示表中没有这个人,返回查找失败信息
    if (q == NULL)
    {
        printf("查无此人\n");
        printf("\n");
        return -1;
    }
}

// 通过人名删除信息
int link_delete_name(ManagePtr person_ptr)
{
    // 判断逻辑
    if (NULL == person_ptr)
    {
        printf("删除失败\n");
        return -1;
    }

    // 输入人员姓名
    char delete_name[30] = {0};
    printf("请输入你需要删除的人员信息的姓名:");
    scanf("%s", delete_name);
    getchar();

    // 查找链表中是否有该人员,如果有,则删除

    ManagePtr p = person_ptr; // 记录头指针
    ManagePtr L = p->next;
    ManagePtr temp = NULL; // 定义一个交换指针

    while (L)
    {
        // 如果查找到了,就删除该结点
        if (strcmp(L->person.name, delete_name) == 0)
        {
            temp = L; // 记录要删除的结点
            p->next = L->next;
            free(temp);
            person_ptr->len--;
            printf("删除成功\n");
            return 0;
        }

        // 循环后移节点
        p = p->next;
        L = L->next;
    }

    // 程序执行至此,表示没有找到该人员姓名
    printf("没有此人,无需删除\n");
    printf("\n");
    return -1;
}

// 导出所有人员信息到文件内
void link_export_person(ManagePtr person_ptr)
{
    char huiche[10] = {'\n'};
    char t[10] = {'\t'};

    // 判断逻辑
    if (NULL == person_ptr)
    {
        printf("导出失败\n");
        return;
    }

    FILE *fp_person = NULL;
    // 判断文件是否成功打开
    if ((fp_person = fopen("./person_information.txt", "w+")) == NULL)
    {
        perror("fopen error");
        return;
    }

    ManagePtr p = person_ptr->next; // 记录头指针

    while (p)
    {
        // 把链表里面的内容依次输入到文件中
        fputs(p->person.id, fp_person);
        fputs(t, fp_person); // 自动格式化一下
        fputs(p->person.name, fp_person);
        fputs(t, fp_person);
        fputs(p->person.gender, fp_person);
        fputs(t, fp_person);
        fputs(p->person.telephone, fp_person);
        fputs(huiche, fp_person); // 自动换行
        p = p->next;
    }

    // 关闭文件
    fclose(fp_person);

    printf("导出数据成功\n");
    return;
}

// 打印文件信息
void file_show()
{
    FILE *fp_person = NULL;
    char buf[30] = {0}; // 定义一个容器用来接收读取到的内容
    // 以只读的形式打开文件
    if ((fp_person = fopen("./person_information.txt", "r")) == NULL)
    {
        perror("fopen error"); // 输出错误信息
        return;
    }

    printf("文件中的数据如下所示:\n");

    // 从文件中获取数据
    while ((fgets(buf, sizeof(buf), fp_person)) != NULL)
    {
        printf("%s", buf);
    }

    printf("\n输出成功\n");
    return;
}

// 按照姓名将通讯录排序
void link_person_sort_name(ManagePtr person_ptr)
{
    // 判断逻辑
    if (NULL == person_ptr || link_empty(person_ptr))
    {
        printf("排序失败\n");
        return;
    }

    ManagePtr prev = person_ptr;
    // 记录数据
    ManagePtr p = person_ptr->next;

    Person temp;   //定义一个结构体,用来存储交换的数据

    // 执行排序逻辑
    for (int i = 1; i < person_ptr->len; i++)
    {
        for (int j = 0; j < person_ptr->len - i; j++)
        {
            if (strcmp(p->person.name, p->next->person.name) > 0)
            {
                // 交换三步曲
                temp = p->person;
                p->person = p->next->person;
                p->next->person = temp;
            }
            p = p->next;
        }
        p = prev->next;
    }

    printf("升序排序成功\n");
    return;
}


//统计人员总人数(链表长度)
int link_len(ManagePtr person_ptr)
{
    return person_ptr->len;
}


//统计性别
void link_gender_statistics(ManagePtr person_ptr)
{
    int man = 0;     //男性计数器
    int woman = 0;   //女性计数器

    //判断逻辑
    if(NULL == person_ptr || link_empty(person_ptr))
    {
        printf("统计失败\n");
        return ;
    }

    ManagePtr p = person_ptr->next;

    while(p)
    {
        if(strcmp(p->person.gender,"男") == 0)
        {
            man++;
        }
        else if(strcmp(p->person.gender,"女") == 0)
        {
            woman++;
        }
        p = p->next;
    }
    
    printf("统计完毕\n");
    printf("男生一共有%d个,女生一共有%d个\n",man,woman);
    printf("\n");
    return ;
}

// 销毁管理表
void link_destroy(ManagePtr person_ptr)
{
    // 判断逻辑
    if (NULL == person_ptr)
    {
        printf("无需销毁\n");
        return;
    }

    // 执行头删
    while (!link_empty(person_ptr))
    {
        link_delete_head(person_ptr);
    }

    // 释放结点
    free(person_ptr);
    person_ptr = NULL;

    printf("释放链表成功\n");
    return;
}
//main.c
#include "link_list.h"
int main(int argc, char const *argv[])
{
    int n = 0, pos = 0, logsuccess = 1;
    int retval;
    int len = 0;
    
    ManagePtr person_ptr;
    Person person;

    // 登录视图
    while (logsuccess)
    {
        START:
        create_log_view();
        printf("请输入您的需求:");
        scanf("%d", &n);
        getchar();
        switch (n)
        {
        case 1:
            retval = register_user();
            break;

        case 2:
            retval = log_user();
            logsuccess = retval;
            break;

        case 3:
            goto END;
            break;

        default:
            break;
        }
    }

    // 管理试图
    while (1)
    {
        create_view();
        printf("请输入您需要实现的功能:");
        scanf("%d", &n);
        getchar();
        switch (n)
        {
        case 1:
            person_ptr = link_person_create();
            break;

        case 2:
            printf("请输入你需要插入的编号:");
            scanf("%s", person.id);
            getchar();

            printf("请输入你需要插入的姓名:");
            scanf("%s", person.name);
            getchar();

            printf("请输入你需要插入的性别:");
            scanf("%s", person.gender);
            getchar();

            printf("请输入你需要插入的电话:");
            scanf("%s", person.telephone);
            getchar();

            link_insert_person(person_ptr, person);
            break;

        case 3:
            printf("请输入你需要插入的位置:");
            scanf("%d",&pos);
            getchar();

            printf("请输入你需要插入的编号:");
            scanf("%s", person.id);
            getchar();

            printf("请输入你需要插入的姓名:");
            scanf("%s", person.name);
            getchar();

            printf("请输入你需要插入的性别:");
            scanf("%s", person.gender);
            getchar();

            printf("请输入你需要插入的电话:");
            scanf("%s", person.telephone);
            getchar();

            link_insert_person_pos(person_ptr, pos, person);
            break;

        case 4:
            printf("编号\t姓名\t性别\t电话\n");
            link_printf_person(person_ptr);
            break;

        case 5:
            link_search_name(person_ptr);
            break;

        case 6:
            link_delete_name(person_ptr);
            break;  

        case 7:
            link_export_person(person_ptr);
            break; 

        case 8:
            file_show();
            break;     

        case 9:
            link_person_sort_name(person_ptr);
            break;

        case 10:
            len = link_len(person_ptr);
            printf("表中一共有%d个人\n",len);
            printf("\n");
            break;

        case 11:
            link_gender_statistics(person_ptr);
            break;

        case 12:
            printf("已返回上级菜单\n");
            printf("\n");
            goto START;
            break;

        case 13:
            link_destroy(person_ptr);
            person_ptr = NULL;
            break;

        case 0:
            goto END;
            break;

        default:
            break;
        }
    }
END:
    printf("退出成功\n");
    return 0;
}

五、输出结果展示

1、成功将终端输入的用户姓名和密码分别存入到.txt文件中


2、登陆成功     &&    退出成功

如果用户名密码对不上,提示重新输入

直接退出


3、创建/初始化管理表成功


4、录入人员信息成功


5、按位置插入人员信息成功,插入位置不对会报错


6、输出所有人员信息成功


7、通过姓名查找人员信息成功


8、通过姓名删除人员信息成功

可以看出已经把张三从表里删除了


9、导出所有人员信息到文件内成功

成功输入进person_information.txt文件中


10、打印文件信息到终端上成功


11、按姓名将通讯录排序成功(实现的是升序排序)

可以看出已经成功根据姓名进行了升序排序


12、获取链表长度成功


13、统计性别数量成功


14、返回上级菜单成功


15、销毁链表成功


16、退出成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cpp学习记录03

结构体 定义&#xff1a;用户自定义符合数据类型&#xff0c;可以包含不同类型的不同成员。 //声明结构体 struct 结构体类型&#xff08;自己起名&#xff09; {成员1类型 成员1名称&#xff1b;。。。成员N类型 成员N名称&#xff1b;} 基本用法&#xff08;类似class&…

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

88年汉城奥运追忆:差距尤存,出路何在

&#xff08;35年前的文章&#xff0c;摘自1989年2月1日《大众日报》&#xff09; 差距尤存 出路何在 ——汉城奥运会后的思索 刘伟 一项调查表明&#xff1a;在当今中国中学生最喜爱的十本杂志中&#xff0c;竟没有一本是体育类杂志&#xff1b;在城市工人、干部、科技人员家…

搜索引擎项目(四)

SearchEngine 王宇璇/submit - 码云 - 开源中国 (gitee.com) 基于Servlet完成前后端交互 WebServlet("/searcher") public class DocSearcherServlet extends HttpServlet {private static DocSearcher docSearcher new DocSearcher();private ObjectMapper obje…

【前端/js】使用js读取本地文件(xml、二进制)内容

目录 说在前面FileReaderDOMParser文本文件二进制文件 说在前面 浏览器版本&#xff1a;Microsoft Edge 126.0.2 (正式版本) (64 位) FileReader MDNFileReader 接口允许 Web 应用程序异步读取存储在用户计算机上的文件&#xff08;或原始数据缓冲区&#xff09;的内容&#x…

Golang 高性能 Websocket 库 gws 使用与设计(一)

前言 大家好这里是&#xff0c;白泽&#xff0c;这期分析一下 golang 开源高性能 websocket 库 gws。 视频讲解请关注&#x1f4fa;B站&#xff1a;白泽talk 介绍 gws&#xff1a;https://github.com/lxzan/gws &#xff5c;GitHub &#x1f31f; 1.2k&#xff0c;高性能的 …

STM32(七):STM32指南者-通信实验

目录 一、基本概念通讯基本概念1、串行和并行2、同步通讯与异步通讯3、全双工、半双工、单工4、通讯速率 USART基本概念1、串口通讯基本概念2、物理层3、协议层4、指南者的串口USART I2C基本概念SPI基本概念 二、USART串口实验前期准备1、安装安装 USB 转串口驱动_CH3402、野火…

【中项】系统集成项目管理工程师-第5章 软件工程-5.1软件工程定义与5.2软件需求

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

代码随想录算法训练营day22 | 77. 组合、216.组合总和III 、17.电话号码的字母组合

碎碎念&#xff1a;加油 参考&#xff1a;代码随想录 回溯算法理论基础 回溯和递归是相辅相成的&#xff0c;只要有递归&#xff0c;就会有回溯。回溯通常在递归函数的下面。 回溯搜索到法的效率&#xff1a; 它其实是纯暴力的做法&#xff0c;不是一个高效的算法。 回溯法能…

将控制台内容输出到文本文件

示例代码&#xff1a; Imports System.IO Module Module1Sub Main()Dim fs As New FileStream("D:\Desktop\test\输出结果.txt", FileMode.Create, FileAccess.Write, FileShare.None)Dim sw As New StreamWriter(fs)Console.SetOut(sw)Console.SetError(sw)For i …

Spring 自定义集合实现策略

Spring 自定义集合实现策略 日常开发中&#xff0c;如果遇到复杂业务通常会用一个接口实现多个实现类。需要根据对应参数判断获取不同实现类。例如支付场景&#xff0c;根据选择支付方式&#xff0c;选择相应路由。如果实现类不多&#xff0c;通常会这样。如果实现类多了&…

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …

Linux:Linux进程控制

目录 1. 进程概念 1.1 并行和并发 2. 进程创建 2.1 fork()函数初识 2.2 写时拷贝 2.3 fork常规用法 2.4 fork调用失败的原因 3. 进程终止 3.1 进程场景 3.2 进程常见退出方法 4. 进程等待 4.1 进程等待必要性 4.2 进程等待的方法 4.2.1 wait方法&#xff1a; 4.…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

关于数据存储位置的一点知识

关于数据存储位置的一点知识

c++红黑树,插入公式

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近…

useRoute 函数的详细介绍与使用示例

title: useRoute 函数的详细介绍与使用示例 date: 2024/7/27 updated: 2024/7/27 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt.js中useRoute函数的详细用途与示例&#xff0c;展示了如何在组合式API中使用useRoute获取当前路由信息&#xff0c;包括动态参数、…

web服务器dns服务器配置服务

1.搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 server服务器&#xff1a; 创建 /share目录&#xff0c;并且编辑/etc/exports文件 更改目录权限为755&#xff1a; 755权限码的含义是&#xff1a; 文件所有者&#xff08;第一位数字7&…

Docker Desktop安装(通俗易懂)

1、官网 https://www.docker.com/products/docker-desktop/ 2、阿里云镜像 docker-toolbox-windows-docker-for-windows安装包下载_开源镜像站-阿里云 1. 双击安装文件勾选选项 意思就是&#xff1a; Use WSL 2 instead of Hyper-V (recommended) : 启用虚拟化&#xff0c;…

20240727生活沉思------------关于报考软考高级架构师

软考高级架构师 软考高级架构师 缴费 主要是报的千峰 1880元。 相对来说还算可以吧。。。其他也没给我机会选择啊 备考 我现在开始备考&#xff0c;考试时间2024年11月。 今天是正式开始7.27号。 给大家看看接下来我的课程安排&#xff1a; 额&#xff0c;还是满满当当的…