DAY15:链表实现学生信息管理系统

要求功能:

  1. 创建学生信息表
  2. 头插法输入学生信息
  3. 尾插法输入学生信息
  4. 输出任意位置范围内的学生信息
  5. 头删法删除学生信息
  6. 尾删法删除学生信息
  7. 按位置添加学生信息
  8. 按位置删除学生信息
  9. 按位置修改学生信息
  10. 按位置查找学生信息
  11. 释放空间

今天有点累,懒得写注释了,其实思路都差不多,就是找到在操作,没什么太多区别

创建结构体

节点结构体

len:链表长度

data:节点数据

next:节点后继

cpp 复制代码
typedef struct Node {
    union {
        int data;
        int len;
    };
    struct Node* next;
} Node, *PNode;

创建链表

cpp 复制代码
PNode linklist_creat() {
    PNode p = (PNode) malloc(sizeof(Node));
    if(NULL == p){
        printf("创建失败!\n");
        return NULL;
    }
    p->len = 0;
    p->next = NULL;
    printf("创建成功!\n");
    return p;
}

头插法输入学生信息

cpp 复制代码
int linklist_head_insert(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    printf("请输入 %d 个数据:\n",num);
    for (int i = 0; i < num; ++i) {
        PNode temp = (PNode) malloc(sizeof(Node));
        scanf("%d",&temp->data);
        //头插
        temp->next = linklist->next;
        linklist->next = temp;
        //改变长度记录
        linklist->len++;
    }
    printf("头插 %d 个元素成功!\n",num);
    return 1;
}

尾插法输入学生信息

cpp 复制代码
int linklist_tail_insert(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    printf("请输入 %d 个数据:\n",num);
    PNode p = linklist;
    while (p->next != NULL){
        p = p->next;
    }
    for (int i = 0; i < num; ++i) {
        PNode temp = (PNode) malloc(sizeof(Node));
        scanf("%d",&temp->data);
        temp->next = NULL;
        p->next = temp;
        p = p->next;
        linklist->len++;
    }
    printf("尾插 %d 个元素成功!\n",num);
    return 1;
}

输出任意位置范围内的学生信息

cpp 复制代码
int linklist_output(PNode linklist, int out_begin, int out_end) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(out_begin > out_end){
        printf("输入顺序出错!\n");
        return 0;
    }
    if(out_begin < 1 || out_end > linklist->len){
        printf("输入不在链表范围内");
        return 0;
    }
    PNode temp = linklist->next;
    int count = 1;
    while (count < out_begin){
        temp = temp->next;
        count++;
    }
    for (int i = out_begin; i <= out_end; ++i) {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("\n");
    printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);
    return 1;
}

头删法删除学生信息

cpp 复制代码
int linklist_head_delete(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(num > linklist->len){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    for (int i = 0; i < num; ++i) {
        //创建删除指针
        PNode temp = linklist->next;
        //断开链接
        linklist->next = temp->next;
        //释放删除节点
        temp->next = NULL;
        free(temp);
        temp = NULL;
        linklist->len--;
    }
    printf("头删 %d 个元素完成!\n",num);
    return 1;
}

尾删法删除学生信息

cpp 复制代码
int linklist_tail_delete(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(num > linklist->len || num < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    for (int i = 0; i < num; ++i) {
        PNode temp = linklist;
        while (temp->next->next != NULL){
            temp = temp->next;
        }
        free(temp->next);
        temp->next = NULL;
        linklist->len--;
    }
    printf("尾删 %d 个数据成功!\n",num);
    return 1;
}

按位置插入学生信息

cpp 复制代码
int linklist_set_insert(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len + 1 || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置前面那个位置
    PNode temp = linklist;
    int count = 0;
    while (count < set){
        temp = temp->next;
        count++;
    }
    PNode new_node = (PNode) malloc(sizeof(Node));
    printf("请输入要插入的值:");
    scanf("%d",&new_node->data);

    new_node->next = temp->next;
    temp->next = new_node;
    linklist->len++;
    printf("插入新数据到 %d 位置成功\n",set);
    return 1;
}

按位置删除学生信息

cpp 复制代码
int linklist_set_delete(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置前面那个位置
    PNode temp = linklist;
    int count = 1;
    while (count < set){
        temp = temp->next;
        count++;
    }
    PNode p = temp->next;
    temp->next = p->next;
    free(p);
    linklist->len--;
    printf("删除 %d 位置的数据成功\n",set);
    return 1;
}

按位置修改学生信息

cpp 复制代码
int linklist_set_change(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置
    PNode temp = linklist->next;
    int count = 1;
    while (count < set){
        temp = temp->next;
        count++;
    }
    printf("当前值为: %d\n",temp->data);
    printf("请输入要修改的值:");
    scanf("%d",&temp->data);
    printf("修改成功!\n");
    return 1;
}

按位置查找学生信息

释放空间

cpp 复制代码
int linklist_free(PNode linklist) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    while (linklist->next != NULL){
        PNode p = linklist->next;
        linklist->next = p->next;
        p->next = NULL;
        free(p);
        p = NULL;
    }
    printf("释放成功!\n");
    return 1;
}

代码总和

cpp 复制代码
#include <stdio.h>
#include <malloc.h>

//节点结构体,len:链表长度,data:节点数据,next:节点后继
typedef struct Node {
    union {
        int data;
        int len;
    };
    struct Node* next;
} Node, *PNode;

PNode linklist_creat();

int linklist_free(PNode linklist);

int linklist_head_insert(PNode linklist, int num);

int linklist_tail_insert(PNode linklist, int num);

int linklist_output(PNode linklist, int out_begin, int out_end);

int linklist_head_delete(PNode linklist, int num);

int linklist_tail_delete(PNode linklist, int num);

int linklist_set_insert(PNode linklist, int set);

int linklist_set_delete(PNode linklist, int set);

int linklist_set_change(PNode linklist, int set);

int linklist_set_find(PNode linklist, int set);

int main(){
    PNode linklist;
    int chose;
    for (;;) {
        printf("请输入你的选择:");
        scanf("%d",&chose);
        if(chose == 0){
            printf("当前链表长度为:%-5d\n",linklist->len);
        } else if(chose == 1){
            //创建头节点
            linklist = linklist_creat();
        } else if(chose == 2){
            //头插
            int num;
            printf("请输入要头插节点的数量:");
            scanf("%d",&num);
            linklist_head_insert(linklist,num);
        } else if(chose == 3){
            //尾插
            int num;
            printf("请输入要尾插节点的数量:");
            scanf("%d",&num);
            linklist_tail_insert(linklist,num);
        } else if(chose == 4){
            //遍历链表
            int out_begin,out_end;
            printf("当前链表长度为:%-3d\n",linklist->len);
            printf("请输入要遍历的起始位置和结束位置:");
            scanf("%d %d",&out_begin,&out_end);
            linklist_output(linklist,out_begin,out_end);
        } else if(chose == 5){
            //头删
            int num;
            printf("请输入要头删的数量:");
            scanf("%d",&num);
            linklist_head_delete(linklist,num);
        } else if(chose == 6){
            //尾删
            int num;
            printf("请输入要尾删的数量:");
            scanf("%d",&num);
            linklist_tail_delete(linklist,num);
        }if(chose == 7){
            //任意位置插入
            int set;
            printf("请输入要插入的位置:");
            scanf("%d",&set);
            linklist_set_insert(linklist,set);
        }if(chose == 8){
            //任意位置删除
            int set;
            printf("请输入要删除的位置:");
            scanf("%d",&set);
            linklist_set_delete(linklist,set);
        }if(chose == 9){
            //任意位置修改
            int set;
            printf("请输入要修改的位置:");
            scanf("%d",&set);
            linklist_set_change(linklist,set);
        }if(chose == 10){
            //任意位置查找
            int set;
            printf("请输入要查找的位置:");
            scanf("%d",&set);
            linklist_set_find(linklist,set);
        }
        else if(chose == -1){
            //释放内存,指针指空
            linklist_free(linklist);
            free(linklist);
            linklist = NULL;
            break;
        }
        printf("\n");
    }


    return 0;
}

int linklist_set_find(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置
    PNode temp = linklist->next;
    int count = 1;
    while (count < set){
        temp = temp->next;
        count++;
    }
    printf("第 %d 个数据为 %d\n",set,temp->data);
    return 1;
}

int linklist_set_change(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置
    PNode temp = linklist->next;
    int count = 1;
    while (count < set){
        temp = temp->next;
        count++;
    }
    printf("当前值为: %d\n",temp->data);
    printf("请输入要修改的值:");
    scanf("%d",&temp->data);
    printf("修改成功!\n");
    return 1;
}

int linklist_set_delete(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置前面那个位置
    PNode temp = linklist;
    int count = 1;
    while (count < set){
        temp = temp->next;
        count++;
    }
    PNode p = temp->next;
    temp->next = p->next;
    free(p);
    linklist->len--;
    printf("删除 %d 位置的数据成功\n",set);
    return 1;
}

int linklist_set_insert(PNode linklist, int set) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(set > linklist->len + 1 || set < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    //找到set位置前面那个位置
    PNode temp = linklist;
    int count = 0;
    while (count < set){
        temp = temp->next;
        count++;
    }
    PNode new_node = (PNode) malloc(sizeof(Node));
    printf("请输入要插入的值:");
    scanf("%d",&new_node->data);

    new_node->next = temp->next;
    temp->next = new_node;
    linklist->len++;
    printf("插入新数据到 %d 位置成功\n",set);
    return 1;
}

int linklist_tail_delete(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(num > linklist->len || num < 1){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    for (int i = 0; i < num; ++i) {
        PNode temp = linklist;
        while (temp->next->next != NULL){
            temp = temp->next;
        }
        free(temp->next);
        temp->next = NULL;
        linklist->len--;
    }
    printf("尾删 %d 个数据成功!\n",num);
    return 1;
}

int linklist_head_delete(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(num > linklist->len){
        printf("输入长度超过链表长度!\n");
        return 0;
    }
    for (int i = 0; i < num; ++i) {
        //创建删除指针
        PNode temp = linklist->next;
        //断开链接
        linklist->next = temp->next;
        //释放删除节点
        temp->next = NULL;
        free(temp);
        temp = NULL;
        linklist->len--;
    }
    printf("头删 %d 个元素完成!\n",num);
    return 1;
}

int linklist_output(PNode linklist, int out_begin, int out_end) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    if(out_begin > out_end){
        printf("输入顺序出错!\n");
        return 0;
    }
    if(out_begin < 1 || out_end > linklist->len){
        printf("输入不在链表范围内");
        return 0;
    }
    PNode temp = linklist->next;
    int count = 1;
    while (count < out_begin){
        temp = temp->next;
        count++;
    }
    for (int i = out_begin; i <= out_end; ++i) {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("\n");
    printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);
    return 1;
}

int linklist_tail_insert(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    printf("请输入 %d 个数据:\n",num);
    PNode p = linklist;
    while (p->next != NULL){
        p = p->next;
    }
    for (int i = 0; i < num; ++i) {
        PNode temp = (PNode) malloc(sizeof(Node));
        scanf("%d",&temp->data);
        temp->next = NULL;
        p->next = temp;
        p = p->next;
        linklist->len++;
    }
    printf("尾插 %d 个元素成功!\n",num);
    return 1;
}

int linklist_head_insert(PNode linklist, int num) {
    if(NULL == linklist) return -1;
    printf("请输入 %d 个数据:\n",num);
    for (int i = 0; i < num; ++i) {
        PNode temp = (PNode) malloc(sizeof(Node));
        scanf("%d",&temp->data);
        //头插
        temp->next = linklist->next;
        linklist->next = temp;
        //改变长度记录
        linklist->len++;
    }
    printf("头插 %d 个元素成功!\n",num);
    return 1;
}

int linklist_free(PNode linklist) {
    if(NULL == linklist) return -1;
    if(linklist->len == 0){
        printf("链表为空!\n");
        return 0;
    }
    while (linklist->next != NULL){
        PNode p = linklist->next;
        linklist->next = p->next;
        p->next = NULL;
        free(p);
        p = NULL;
    }
    printf("释放成功!\n");
    return 1;
}

PNode linklist_creat() {
    PNode p = (PNode) malloc(sizeof(Node));
    if(NULL == p){
        printf("创建失败!\n");
        return NULL;
    }
    p->len = 0;
    p->next = NULL;
    printf("创建成功!\n");
    return p;
}
相关推荐
昂子的博客6 分钟前
基础数据结构——队列(链表实现)
数据结构
Chef_Chen7 分钟前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
幼儿园老大*2 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
2 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_2 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
~yY…s<#>2 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
啦啦右一3 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
霍格沃兹测试开发学社测试人社区3 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask