实验:数据结构(结构体在单链表中的增删改查)

ops/2024/9/24 16:29:17/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 学生信息结构体
struct Student {
    char name[50];
    char gender[10];
    int student_number;
    char hobbies[100];
    struct Student* next;
};

// 初始化一个空表
struct Student* initialize() {
    return NULL;
}

// 后插法插入学生信息
struct Student* insert(struct Student* head, char name[], char gender[], int student_number, char hobbies[]) {
    struct Student* new_student = (struct Student*)malloc(sizeof(struct Student));
    strcpy(new_student->name, name);
    strcpy(new_student->gender, gender);
    new_student->student_number = student_number;
    strcpy(new_student->hobbies, hobbies);
    new_student->next = NULL;

    if (head == NULL) {
        return new_student;
    }

    struct Student* current = head;
    while (current->next != NULL) {
        current = current->next;
    }
    current->next = new_student;
    return head;
}

// 根据学号对链表节点进行排序
struct Student* sort_by_student_number(struct Student* head) {
    // 使用冒泡排序
    int swapped;
    struct Student* ptr1;
    struct Student* lptr = NULL;

    if (head == NULL) {
        return NULL;
    }

    do {
        swapped = 0;
        ptr1 = head;

        while (ptr1->next != lptr) {
            if (ptr1->student_number > ptr1->next->student_number) {
                // 交换节点
                struct Student* temp = ptr1;
                ptr1 = ptr1->next;
                ptr1->next = temp;
                swapped = 1;
            }
            ptr1 = ptr1->next;
        }
        lptr = ptr1;
    } while (swapped);

    return head;
}

// 根据姓名或学号顺序插入新创建的学生信息
struct Student* insert_sorted(struct Student* head, char name[], char gender[], int student_number, char hobbies[]) {
    struct Student* new_student = (struct Student*)malloc(sizeof(struct Student));
    strcpy(new_student->name, name);
    strcpy(new_student->gender, gender);
    new_student->student_number = student_number;
    strcpy(new_student->hobbies, hobbies);
    new_student->next = NULL;

    if (head == NULL || student_number < head->student_number) {
        new_student->next = head;
        return new_student;
    }

    struct Student* current = head;
    while (current->next != NULL && current->next->student_number < student_number) {
        current = current->next;
    }
    new_student->next = current->next;
    current->next = new_student;
    return head;
}

// 根据学号删除学生信息
struct Student* delete_by_student_number(struct Student* head, int student_number) {
    if (head == NULL) {
        return NULL;
    }

    if (head->student_number == student_number) {
        struct Student* temp = head;
        head = head->next;
        free(temp);
        return head;
    }

    struct Student* current = head;
    while (current->next != NULL && current->next->student_number != student_number) {
        current = current->next;
    }

    if (current->next != NULL) {
        struct Student* temp = current->next;
        current->next = current->next->next;
        free(temp);
    }

    return head;
}

// 打印所有学生信息
void print_students(struct Student* head) {
    struct Student* current = head;
    while (current != NULL) {
        printf("姓名:%s,性别:%s,学号:%d,兴趣爱好:%s\n", current->name, current->gender, current->student_number, current->hobbies);
        current = current->next;
    }
}

int main() {
    struct Student* head = initialize();

    // 示例:插入学生信息
    head = insert(head, "张三", "男", 1001, "篮球");
    head = insert(head, "李四", "女", 1002, "音乐");
    // ... 插入更多学生信息

    // 排序
    head = sort_by_student_number(head);

    // 插入新学生信息
    head = insert_sorted(head, "王五", "男", 1003, "游泳");

    // 打印所有学生信息
    print_students(head);

    // 其他操作...

    return 0;
}


http://www.ppmy.cn/ops/7100.html

相关文章

数据可视化-ECharts Html项目实战(13)

在之前的文章中&#xff0c;我们深入学习ECharts动态主题切换和自定义ECharts主题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Html项…

公众号数量提升申请

一般可以申请多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

vueadminpro+vue2+eacharts el-tabs获取后端数据显示饼图并且是父子组件的方式2.0-饼图在一个页面分区域显示

我是引入了两个图表组件&#xff0c;大体和非2.0版本差不多&#xff0c;结论&#xff1a;根据变量显示图表数据&#xff0c;子组件2&#xff08;1和2一样就是保存数据字段不一样以及多了图表居中&#xff09; 看代码-父组件 <el-tab-pane label"饼状图" name&qu…

[论文笔记] megatron训练参数:dataloader_type

在深度学习中&#xff0c;dataloader_type参数通常控制着数据的加载、处理和输入到模型的方式。不同的dataloader可能会按照不同的策略处理数据集&#xff0c;这可以显著影响模型训练和评估的效果。具体来说&#xff0c;single和cyclic类型通常如此区别&#xff1a; Single Dat…

多个gradio服务实现负载均衡

背景 刚开始在一块GPU卡上部署了一个大模型服务&#xff0c;零星几个人在浏览器上访问倒也不需要考虑并发请求负载过高的问题&#xff0c;用gradio的queue排队机制也能应付过去。但最近体验的人多了&#xff0c;体验感就跟不上了。于是&#xff0c;增加了一块GPU&#xff0c;单…

OpenHarmony实战开发-如何实现防盗链应用功能。

介绍 目前许多网络图片资源有防盗链功能&#xff0c;需要在请求头中设置正确的Referer。本模块使用了第三方库imageknife&#xff0c;通过在请求头中添加Referer来获取防盗链图片功能。同时我们可以设置请求头中的其他参数&#xff0c;比如User-Agent来设置客户端&#xff0c;…

lua 光速入门

文章目录 安装注释字符串变量逻辑运算条件判断循环函数Table (表)常用全局函数模块化 首先明确 lua 和 js Python一样是动态解释性语言&#xff0c;需要解释器执行。并且不同于 Python 的强类型与 js 的弱类型&#xff0c;它有点居中&#xff0c;倾向于强类型。 安装 下载解释…

【Dubbo】Dubbo简单自定义链路传递traceId

需求 因为服务器内存不足&#xff0c;没有引入链路追踪的框架&#xff0c;项目使用到了Dubbo&#xff0c;所有通过self4j的MDC和Dubbo的RpcContext实现简单的traceId 的多服务模块的传递 解决思路 在第一个模块生成traceId(比如网关模块)&#xff0c;生成traceId&#xff0c…