C语言链表实现学生信息管理系统 - 代码优化与问题解析
C语言链表实现学生信息管理系统 - 代码优化与问题解析
这篇文章将介绍如何使用C语言链表实现一个简单的学生信息管理系统,并对代码进行优化和问题解析,帮助你更好地理解链表的使用和避免常见的错误。
代码示例c#include <stdio.h>#include <stdlib.h>#include <string.h>
typedef struct { char gender[100]; char number[100]; char no[100]; char address[100]; char name[100];} student;
typedef struct node { student date; struct node *next;} node, *linklist;
linklist creatlist() { // 创建头结点 linklist L = (linklist)malloc(sizeof(node)); L->next = NULL;
int n;    printf('请输入输入的学生数量:');    scanf('%d', &n);
// 使用尾插法插入节点    linklist tail = L;     for (int i = 0; i < n; i++) {        linklist p = (linklist)malloc(sizeof(node));        printf('请输入学号:');        scanf('%s', p->date.no);        printf('姓名:');        scanf('%s', p->date.name);        printf('性别:');        scanf('%s', p->date.gender);        printf('联系电话:');        scanf('%s', p->date.number);        printf('家庭住址:');        scanf('%s', p->date.address);
    // 将新节点插入到尾部        tail->next = p;        tail = p;        printf('
'); } tail->next = NULL; // 设置最后一个节点的next指针为NULL printf('———————————————————————————— '); return L;}
void dellist(linklist L) { char s[100]; printf('请输入要注销的学生的学号:'); scanf('%s', s);
linklist p = L;    linklist q = L->next;     while (q != NULL && (strcmp(q->date.no, s) != 0)) {        p = q;        q = q->next;    }
if (q != NULL) {        p->next = q->next;        free(q);        printf('注销成功
'); } else { printf('注销失败,请确认学号是否输入正确 '); } printf('———————————————————————————— ');}
void findlist(linklist L) { char fd[100]; printf('请输入要查找学生的学号:'); scanf('%s', fd);
linklist p = L->next;     while (p != NULL && strcmp(p->date.no, fd) != 0) {        p = p->next;    }
if (p != NULL) {        printf('学号:%s
姓名:%s 性别:%s 联系电话:%s 家庭住址:%s ', p->date.no, p->date.name, p->date.gender, p->date.number, p->date.address); printf('查找成功 '); } else { printf('查找失败,请确定学号是否输入正确 '); } printf('———————————————————————————— ');}
void addlist(linklist L) { linklist p = (linklist)malloc(sizeof(node)); printf('请输入新增学生的信息 '); printf('请输入学号:'); scanf('%s', p->date.no); printf('姓名:'); scanf('%s', p->date.name); printf('性别:'); scanf('%s', p->date.gender); printf('联系电话:'); scanf('%s', p->date.number); printf('家庭住址:'); scanf('%s', p->date.address);
// 使用头插法插入新节点    p->next = L->next;     L->next = p; 
printf('增加成功
'); printf('———————————————————————————— ');}
int main() { linklist L; printf('请输入学生信息以创建链表 '); L = creatlist();
int n;    while (1) {        printf('操作成功,请选择你需要进行的下一步操作:1.退出;2.注销学生信息;3.查找学生信息;4.增添学生信息
'); scanf('%d', &n);
    switch (n) {            case 1:                printf('退出成功
'); printf('———————————————————————————— '); return 0; case 2: dellist(L); break; case 3: findlist(L); break; case 4: addlist(L); break; default: printf('输入有误,请重新输入! '); } } return 0;}
代码优化和问题解析
- 
头结点的处理: 在链表的操作中,使用头结点可以简化代码逻辑。例如,在删除和查找节点时,不需要单独处理头结点的情况。在上述代码中,
creatlist,dellist,findlist和addlist函数都进行了相应的修改,以正确处理头结点。 - 
内存泄漏: 在原代码中,
dellist,findlist和addlist函数在使用malloc分配内存后,没有及时释放,导致内存泄漏。在优化后的代码中,在使用完节点后,使用free函数释放了节点占用的内存空间。 - 
代码逻辑: 在原代码的
main函数中,用户输入的选择只在第一次循环时有效,之后的操作都会重复执行第一次的选择。在优化后的代码中,将用户输入的选择放在了循环内部,每次循环都会询问用户需要进行的操作。 - 
代码风格: 使用更清晰的变量名和注释,可以提高代码的可读性和可维护性。
 
总结
通过对代码进行优化和问题解析,我们可以看到,一个简单的学生信息管理系统可以通过链表来实现,但在实际开发过程中,需要注意链表的操作细节,避免内存泄漏等问题,同时也要注意代码风格,提高代码质量。
原文地址: https://www.cveoy.top/t/topic/SFR 著作权归作者所有。请勿转载和采集!