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;
}
相关推荐
XH华3 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__3 小时前
Web APIs学习 (操作DOM BOM)
学习
菜鸡中的奋斗鸡→挣扎鸡4 小时前
滑动窗口 + 算法复习
数据结构·算法
axxy20005 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
数据的世界016 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐6 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
Uu_05kkq6 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
1nullptr8 小时前
三次翻转实现数组元素的旋转
数据结构
OopspoO8 小时前
qcow2镜像大小压缩
学习·性能优化