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

#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;

}

相关推荐
赵药师15 天前
Matlab信号与系统实验-实验三 连续时间信号的频域分析
开发语言·matlab·信号与系统·实验·函数的绘制matlab
HackerKevn21 天前
【上海大学计算机组成原理实验报告】七、程序转移机制
计算机组成原理·实验报告·实验
宇寒风暖24 天前
计算机网络(网络原理及应用)之路由器的基本配置(详细~)
学习·计算机网络·实验
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 个月前
数据结构 实验 1
c语言·数据结构·c++·线性表·实验
HackerKevn1 个月前
【上海大学计算机组成原理实验报告】六、内存系统实验
计算机组成原理·实验报告·实验
百奥创新2 个月前
ALZET渗透泵知识分享:使用时需要加满吗?
经验分享·科普·实验·注意事项·alzet渗透泵使用方法·alzet渗透泵灌装流程·alzet渗透泵可以加满吗
迷失的黑色精灵3 个月前
phpstudy搭建简单渗透测试环境upload-labs、DVWA、sqli-labs靶场
数据库·靶场·php·渗透·新手·实验
悟道子HD4 个月前
SQL 中: 索引的建立和删除
数据库·经验分享·sql·sqlserver·实验·索引的创建和删除·分析索引
程序源_hytz5 个月前
华南理工大学数字信号处理实验实验二源码(薛y老师)
信号处理·数字信号处理·dsp·华南理工大学·实验