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;
}
相关推荐
Lenyiin20 分钟前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长23 分钟前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己25 分钟前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
风尚云网27 分钟前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
Dola_Pan27 分钟前
C语言:数组转换指针的时机
c语言·开发语言·算法
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝1 小时前
C/C++内存管理
java·c语言·c++
qq_459730031 小时前
C 语言面向对象
c语言·开发语言
C++忠实粉丝1 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
EterNity_TiMe_2 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip