用C语言写一个链表储存学生信息

题目

已知学生基本信息由学号(长整型)、姓名(字符数组)、性别(字符型)、年龄(整型)组成。编程实现:建立一个结点按学号顺序存储学生信息的单向链表,并实现依据学号对链表的添加、修改、删除和检索功能;添加新结点后,应继续保持结点按学号顺序的链接方式。分别定义函数实现链表的初始化、链表的打印输出、以及在链表中添加、修改、删除和检索节点的功能。

基本思路

建立单向链表,存储学生数据,用不同函数实现上述功能,在主函数中调用函数进行操作。

代码实现

定义结构体类型存储信息

struct STUDENT_NODE {
    long int id;
    char name[MAX_LEN];
    char sex;
    int  age;
    // 指针指向下一个结点,用以形成链表
    struct STUDENT_NODE* next;
};
//定义结构体:存储单向链表
struct STUDENT_LINK {
    struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;

在主函数中定义struct STUDENT_LINK类型的变量用于储存链表

STUDENT_LINK * L,H;
    L = &H;

编写建立链表的函数,(并且初始化)

void iniStudentLink(STUDENT_LINK* L)    //初始化学生链表
{
    Node* tail= NULL;
    L->top = NULL;
    Node* q;
    q = (Node*)malloc(sizeof(Node));
    scanf("%ld", &q->id);
    getchar();
    while (q->id != 0)
    {
        scanf("%s %c %d", q->name, &q->sex, &q->age);
        if (L->top == NULL)
        {
            L->top = q;
            L->top->next = NULL;
        }
        if (tail != NULL)//tail为开辟节点
        {
            tail->next = q;
        }
        tail = q;
        tail->next = NULL;
        q = (Node*)malloc(sizeof(Node));
        scanf("%ld", &q->id);
        getchar();
    }
}

输出链表

void ShowALL(STUDENT_LINK* L)     // 从头到尾,输出当前所有的同学信息
{
    Node* p;
    p = L->top;
    if (p == NULL)
        printf("empty!\n");
    for (p = L->top; p != NULL; p = p->next)
        printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}

清空学生信息

void clearStudentLink(STUDENT_LINK* L)  //清空学生链表
{
    Node* p;
    while (L->top)
    {
        p = L->top;//p指向头节点后的第一个节点
        L->top = p->next;//删除节点p
        free(p);//释放节点p的空间
    }
}

判断学生的信息是否存在

int isExist(STUDENT_LINK* L, long int id)  // 判断该学号的学生信息是否存在
{
    Node* p;
    p = L->top;
    while (p)
    {
        if (p->id == id)
            return 1;
        p = p->next;
    }
    return 0;
}

添加一个新的学生的信息

int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一个新同学的信息
{
    Node* temp = L->top;//创建临时节点
    while (temp->next != NULL)
    {
        temp = temp->next;
    }
    Node* p = (Node*)malloc(sizeof(Node));//创建新节点
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    //向链表中插入节点
    p->next = temp->next;
    temp->next = p;
    return 0;
}

任意修改学生的信息

int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根据学号,修改该同学的信息
{
    Node* p = L->top;
    while (p->id != id)
    {
        p = p->next;
    }
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    return 0;
}

任意删除学生的信息

int Delete(STUDENT_LINK* L, long int id)     // 根据学号,从链表中删除该同学的信息
{
    Node* p1, * p2, * temp;
    if (isExist(L, id))
    {
        if (id == L->top->id)          /*删除的是首元结点*/
        {
            temp = L->top;
            L->top = L->top->next;            /*解除首元节点与链表的连接*/
            free(temp);            /*释放该结点的内存*/
        }
        else
        {
            p2 = L->top;
            p1 = p2->next;
            while (p1->id != id)
            {
                p2 = p1;
                p1 = p1->next;
            }

            temp = p1;
            p2->next = p1->next;
            free(temp);
        }
    }
    else
        printf("%ld not found\n", id);
    return 0;
}

检索学生的信息

int Search(STUDENT_LINK* L, long int id)  // 根据学号,输出显示该同学信息
{
    if (isExist(L, id))
    {
        Node* p = L->top;
        while (p->id != id)
        {
            p = p->next;
        }
        printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
    }
    else
        printf("%ld not found\n", id);
    return 0;
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LEN 5
struct STUDENT_NODE {
    long int id;
    char name[MAX_LEN];
    char sex;
    int  age;
    // 指针指向下一个结点,用以形成链表
    struct STUDENT_NODE* next;
};
//定义结构体:存储单向链表
struct STUDENT_LINK {
    struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;
void iniStudentLink(STUDENT_LINK* L);    //初始化学生链表
void clearStudentLink(STUDENT_LINK* L);  //清空学生链表
int isExist(STUDENT_LINK* L, long int id);  // 判断该学号的学生信息是否存在
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age); //添加一个新同学的信息
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age);  // 根据学号,修改该同学的信息
int Delete(STUDENT_LINK* L, long int id);    // 根据学号,从链表中删除该同学的信息
int Search(STUDENT_LINK* L, long int id);  // 根据学号,输出显示该同学信息
void ShowALL(STUDENT_LINK* L);      // 从头到尾,输出当前所有的同学信息

int main()
{
    STUDENT_LINK * L,H;
    L = &H;
    int age;
    char sex;
    char name[MAX_LEN];
    long int id;

    iniStudentLink(L);
    printf("此时学生信息表为:\n");
    ShowALL(L);

    printf("输入添加的id:\n");
    scanf("%ld", &id);
    getchar();
    printf("输入添加同学的数据:\n");
    scanf("%s %c %d", name, &sex, &age);
    getchar();
    Add(L, id, name, sex, age);
    printf("添加后:\n");
    ShowALL(L);

    printf("输入修改的id:\n");
    scanf("%ld", &id);
    getchar();
    printf("输入修改后的信息:\n");
    scanf("%s %c %d", name, &sex, &age);
    getchar();
    Modify(L, id, name, sex, age);
    printf("修改后:\n");
    ShowALL(L);

    printf("输入删除的id:\n");
    scanf("%ld", &id);
    getchar();
    Delete(L, id);
    printf("删除之后:\n");
    ShowALL(L);

    printf("输入查找的id:\n");
    scanf("%d", &id);
    getchar();
    printf("该学生的信息为:\n");
    Search(L, id);

    printf("清除所有信息!\n");
    clearStudentLink(L);
    printf("清除后的信息表为:\n");
    ShowALL(L);
    return 0;
}
void iniStudentLink(STUDENT_LINK* L)    //初始化学生链表
{
    Node* tail= NULL;
    L->top = NULL;
    Node* q;
    q = (Node*)malloc(sizeof(Node));
    scanf("%ld", &q->id);
    getchar();
    while (q->id != 0)
    {
        scanf("%s %c %d", q->name, &q->sex, &q->age);
        if (L->top == NULL)
        {
            L->top = q;
            L->top->next = NULL;
        }
        if (tail != NULL)//tail为开辟节点
        {
            tail->next = q;
        }
        tail = q;
        tail->next = NULL;
        q = (Node*)malloc(sizeof(Node));
        scanf("%ld", &q->id);
        getchar();
    }
}
void ShowALL(STUDENT_LINK* L)     // 从头到尾,输出当前所有的同学信息
{
    Node* p;
    p = L->top;
    if (p == NULL)
        printf("empty!\n");
    for (p = L->top; p != NULL; p = p->next)
        printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}
void clearStudentLink(STUDENT_LINK* L)  //清空学生链表
{
    Node* p;
    while (L->top)
    {
        p = L->top;//p指向头节点后的第一个节点
        L->top = p->next;//删除节点p
        free(p);//释放节点p的空间
    }
}
int isExist(STUDENT_LINK* L, long int id)  // 判断该学号的学生信息是否存在
{
    Node* p;
    p = L->top;
    while (p)
    {
        if (p->id == id)
            return 1;
        p = p->next;
    }
    return 0;
}
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一个新同学的信息
{
    Node* temp = L->top;//创建临时节点
    while (temp->next != NULL)
    {
        temp = temp->next;
    }
    Node* p = (Node*)malloc(sizeof(Node));//创建新节点
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    //向链表中插入节点
    p->next = temp->next;
    temp->next = p;
    return 0;
}
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根据学号,修改该同学的信息
{
    Node* p = L->top;
    while (p->id != id)
    {
        p = p->next;
    }
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    return 0;
}
int Delete(STUDENT_LINK* L, long int id)     // 根据学号,从链表中删除该同学的信息
{
    Node* p1, * p2, * temp;
    if (isExist(L, id))
    {
        if (id == L->top->id)          /*删除的是首元结点*/
        {
            temp = L->top;
            L->top = L->top->next;            /*解除首元节点与链表的连接*/
            free(temp);            /*释放该结点的内存*/
        }
        else
        {
            p2 = L->top;
            p1 = p2->next;
            while (p1->id != id)
            {
                p2 = p1;
                p1 = p1->next;
            }

            temp = p1;
            p2->next = p1->next;
            free(temp);
        }
    }
    else
        printf("%ld not found\n", id);
    return 0;
}
int Search(STUDENT_LINK* L, long int id)  // 根据学号,输出显示该同学信息
{
    if (isExist(L, id))
    {
        Node* p = L->top;
        while (p->id != id)
        {
            p = p->next;
        }
        printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
    }
    else
        printf("%ld not found\n", id);
    return 0;
}

原文地址:https://www.cnblogs.com/Xloading/p/12105645.html

时间: 2024-08-11 05:05:23

用C语言写一个链表储存学生信息的相关文章

用C语言写一个“事件”的模拟程序

源:用C语言写一个“事件”的模拟程序 Example.c //定义一个函数指针 func int (*func) (void); //调用该函数相当于触发了事件. //该事件触发后,会检查函数指针func是否为NULL,如果不为NULL,说明该指针已被赋值(相当于该事件被注册). //如果事件已被注册,则执行之. void fireTheEvent() { if(func != NULL) { func(); } } void registerTheEvent(int (*function) (

用 Swift 语言写一个地图坐标弹跳动画

模仿“一号专车”写一个坐标图标弹跳动画,实现效果如下:(录制有点闪小心狗眼) 分析这个动画如下:1.easeIn或者linear被抬高约30像素2.被弹性放下 然后开始了狗血的 Swift animation 之旅. 注意:因为我刚刚开始学习 iOS 开发,动画亦是刚刚接触,下面的方式仅仅是为了完成需求,下面的文章并没有解释动画实现的细节,也不太可能是实现这个需求的最好方式,仅仅是“实现了”而已,只作为一个参考.我还会继续探索里面的细节,以后在博客里更新. 第一步,实现 先抛开那些蛋疼的物理效果

使用python实现一个简单的学生信息管理系统

最近公司搬办公室,杂七杂八的事情比较多,又碰上业务要上线了...很多事情堆到一起来做,导致最近没什么时间学习,写博客.前两天胜利日放假,把以前用java写的学生信息管理系统用python重新写了一遍,以便于帮助python的学习. 好了,废话不多说,首先进行需求分析,下面是我根据需求画的系统结构图: 纯手工制图.....画的不好敬请谅解.从上图来看,整个系统分为main,add,delete,change,select,sort,io,print共八个模块,实现了对学生信息的增删改查排的功能,将

【C项目】 文件,结构体,链表,排序, 学生信息管理系统

1.密码登录: 2.通过键盘输入学生信息,包括学生学号.姓名.成绩: 3.将输入的信息保存到指定文件中: 4.从文件中读取学生信息: 5.显示全部学生信息: 6.按学生总分进行降序排序: 7.删除学生信息: 8.查找学生信息,可以通过学号查找,也可以通过姓名查找: 9.统计学生信息,统计出最高分和学生人数: 10.退出系统: 源代码: [email protected]:~$ cat main.c  #include<stdio.h> #include<stdlib.h> #inc

用Java实现一个简单的学生信息管理系统

public class Student { private String no; //学号(长度为6位) private String name; //姓名 private String idCard; //证件号(18位) private int sex; //性别(男(1)/女(0)) private int age; //年龄(1-100) public Student(){} public Student(String no, String name, String idCard, i

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这时候加上一篇. 在此之前,我们先谈一下我要说的一些基本知识: ①函数参数为什么是双指针? 我们先写一下这么一个程序: # include<stdio.h>void Gai(int m){ m=5;}int main(void){ int a=1; Gai(a); printf("%d\n&

用html语言写一个功课表

今天在网上看了一个关于html的教程,主要是讲表格,看完之后觉得有必要上机试试,于是就写了下面的一段代码. <!DOCTYPE html><!--貌似5.0的可以这样写,课本的声明老长老长了--> <html> <head> <title>功课表</title> <meta http-equiv="Content-Type" content="text/html; charset=GB2312&qu

用C语言写一个函数返回参数二进制中1的个数

首先,给出正确的C语言代码如下: #include <stdio.h> int count_one_bits(unsigned int value) { int count =0; while(value) { if(value%2==1) { count++; } value=value/2; } return count; } int main() { unsigned int num=0; int ret=0; scanf("%d",&num); ret=co

用语言写单链表

#pragma once #include<stdio.h> #include<assert.h> #include<malloc.h> #include<stdlib.h> typedef int DataType; typedef struct Node { DataType _data; // 数据 struct Node* _next; // 指向下一个节点的指针 }Node, *PLinkList; //typedef struct Node  N