学生系统-双向链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
    char name[20];
    int age;
    struct Student* next;
    struct Student* prex;
};

struct Student* create_node(char name[20], int age) {
    struct Student* p;
    p = malloc(sizeof(struct Student));
    //初始化数据
    strcpy(p->name, name);
    p->age = age;
    p->next = NULL;
    p->prex = NULL;
}
void list_tail_insert(struct Student* header, struct Student* new) {
    struct Student* p = header;
    while (NULL != p->next) {
        p = p->next;
    }
    p->next = new;
    new->prex = p;
}
void add_student(struct Student* header) {
    char name[20];
    int age;
    printf("input your name:");
    scanf("%s", name);
    printf("input your age:");
    scanf("%d", &age);
    list_tail_insert(header, create_node(name, age));
}
int list_delete_node(struct Student* header, char name[20]) { //取得当前节点
    struct Student* p = header;
    //遍历所有的节点
    while (NULL != p->next) {
        p = p->next;
        //找到了对应要删除的数据了
        if (strcmp(p->name, name) == 0) {
            //(1)当前节点的下一个节点不为空
            if (p->next != NULL) {
                //那就把当前节点的prev节点指向要删除的这个节点的prev
                因为当前的prev节点保存的是要删除的上一个节点的指针
                p->next->prex = p->prex;
                //还要指定它的next节点
                p->prex->next = p->next;
                free(p);
            } else {
                p->prex->next = NULL;
                free(p);
            } //(2)当前节点的下一个节点为空
            printf("Delete successed!\n");
            return 0;
        }
    }
    printf("No finding the node,or node is deleted!\n");
    return -1;
}
void delete_student(struct Student* header) {
    char name[20];
    printf("input your delete name:");
    scanf("%s", name);
    list_delete_node(header, name);
}
void list_for_each(struct Student* header) {
    struct Student* p = header;
    while (NULL != p->next) {
        p = p->next;
        printf("%s\t", p->name);
        printf("%d\n", p->age);
    }
}

int main() {
    struct Student* header = create_node("", 0);
    while (1) {
        char choice;
        printf("please input a word(a:add,d:delete,s:show):\n");
        choice = getchar();
        switch (choice) {
        case 'a':
            add_student(header);
            break;
        case 'd':
            delete_student(header);
            break;
        case 's':
            list_for_each(header);
            break;
        case 'q':
            return 0;
        case '\n':
            break;
        default:
            break;
        }
    }
    return 0;
}

这段代码是用C语言编写的,主要功能是创建、删除和遍历一个链表,链表中的每个节点都表示一个学生,包括他们的名字和年龄。以下是对各个函数的具体解释:

create_node函数:创建新的节点,需要输入名字和年龄。该函数使用malloc为新节点分配内存,然后使用strcpy复制名字,将年龄赋值给新节点,最后将新节点的next和prex设置为NULL。
list_tail_insert函数:在链表的末尾插入新的节点。该函数首先遍历链表直到找到最后一个节点,然后将新节点插入到该节点之后,同时将新节点的prex指向该节点。
add_student函数:向链表中添加新的学生。首先获取用户输入的名字和年龄,然后使用create_node创建一个新的节点,最后使用list_tail_insert将新节点插入到链表的末尾。
list_delete_node函数:删除链表中的特定节点。该函数遍历链表,当找到名字与输入一致的节点时,会删除该节点。如果当前节点的next节点不为空,那么需要将当前节点的prex节点的next指向当前节点的next,同时将当前节点的next的prex指向当前节点的prex。如果当前节点的next为空,那么只需要将当前节点的prex的next设置为NULL。
delete_student函数:删除特定的学生。首先获取用户输入的名字,然后调用list_delete_node删除名字与输入一致的节点。
list_for_each函数:遍历链表并打印出每个学生的名字和年龄。

注意:这段代码没有处理错误输入的情况,例如当用户输入的名字超过20个字符时,程序可能会出现问题。另外,对于删除操作,如果输入的名字与链表中没有任何一个节点的名字一致,那么程序会输出"No finding the node,or node is deleted!",这可能不是预期的结果,可能需要进一步修改代码来处理这种情况。

Linux下运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值