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

发布于:2024-04-22 ⋅ 阅读:(49) ⋅ 点赞:(0)

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