假设用户都是正常的,不会输入一些乱七八糟的东西。

功能1:输出学生学号和成绩,用动态连链表来存放,继续存放学生信息的时候可以继续输入之前输入过的学号信息,打印的时候会分开打印(因为是简易版本,没有太完善)

功能2 :删除信息,用户输入要删除的学号的时候,如果这个学号在之前录入信息的时候录入了多次,比如说有两个学号都是2,那么在你输入要删除2这个学号的时候,会把所有学号为2的学生信息删除掉。

叨叨几句:因为找不到很好的办法去删除有多个相同学号的办法,所以我采用了每次删除了一个之后,要重新从单链表的头冲洗再寻找一次还有没有这个学号,如果有大佬知道更好的办法可以私信我哈~ 

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define PF(format, ...) printf(#format,##__VA_ARGS__) typedef struct Add_Student{//存放学生学号和成绩单链表 的单链表
long long stu_num;
int grade;
struct Add_Student *stu_Infor_next;
}student_InF; student_InF *delet_Room = NULL;//待删除的信息空间 void allocate_student(student_InF **);//分配学生存放信息空间 void PT(student_InF *student_Information); bool jude_put();//判断是否继续录入 void delete_infor(student_InF **student_Information);//删除信息 bool jude_delete(); //判断是否继续删除 int main(void)
{
student_InF *student_Information = NULL;//学生信息
while(1)
{
allocate_student(&student_Information);
if(!jude_put()) break;//判断是否继续录入
} PT(student_Information);
while(1)
{
delete_infor(&student_Information);//删除信息
PT(student_Information);
if(!jude_delete()) break;//判断是否继续删除信息
}
return 0;
} void allocate_student(student_InF **student_Information)//分配学生存放信息空间
{
student_InF *temp = NULL, *new_student_Infor;
temp = *student_Information;
new_student_Infor = (student_InF*)malloc(sizeof(student_InF));//动态分配内存空间
PF(请输入学生学号:);
scanf("%llu", &new_student_Infor->stu_num);
getchar();
PF(请输入学生成绩:);
scanf("%d", &new_student_Infor->grade);
getchar();
if(new_student_Infor == NULL)
{
PF(内存分配失败!);
exit(1);
} if(*student_Information == NULL)
{
*student_Information = new_student_Infor;
new_student_Infor->stu_Infor_next = NULL;//新空间的节点直接指向NULL
}
else
{
while(temp->stu_Infor_next != NULL)//找到信息尾部
{
temp = temp->stu_Infor_next;
}
temp->stu_Infor_next = new_student_Infor;
new_student_Infor->stu_Infor_next = NULL;
}
} void PT(student_InF *student_Information)
{
student_InF *temp;
temp = student_Information;
PF(学生信息如下:\n);
if(student_Information == NULL)
{
PF((空白)\n);
return;
}
while(1)
{
if(temp != NULL)
{
PF(学号:%llu 成绩:%d\n, temp->stu_num, temp->grade);
temp = temp->stu_Infor_next;//指向下一个待输出空间
}
else break;
}
} void delete_infor(student_InF **student_Information)//删除信息
{
long long num;
student_InF *current = *student_Information;//表示当前的在单链表标记的位置
student_InF *previous = NULL;//表示current前一个位置
bool jude = false; //判断用户输入的学号是否存在
PF(请输入你要删除的学号:);
scanf("%llu", &num);
getchar();//接收回车键
while(1)
{
if(current == NULL) //判断是否到尾部了
{
if(jude == false)
{
PF(不存在该学生学号!\n); }
break;
}
if(current != NULL && current->stu_num == num)
{
jude = true;//证明输入的学号存在
if(previous == NULL)//表示要删除的是第一个
{
(*student_Information) = (*student_Information)->stu_Infor_next;//直接把头改掉,因为要删除的是第一个学号
free(current);//释放要删除的信息
}
else
{
previous->stu_Infor_next = current->stu_Infor_next;//前一个的next指向当前的next ,当前的next也就是当前下一个信息区
free(current);//释放当前的信息区
}
current = *student_Information;//出去从头再次扫描一遍 看看是否还有重复的学号
}
previous = current;
if(current != NULL) current = current->stu_Infor_next;//标记位置不断往前推进 ,先判断是否到结尾了,没到结尾才能让位置向前
} } bool jude_delete()//判断是否继续删除
{
char ch;
PF(是否继续删除信息(Y/N):);
ch = getchar();
if(ch == 'N') return false;
else if(ch == 'Y')
{
return true;
}
} bool jude_put()//判断是否继续录入
{
char ch;
PF(是否继续录入(Y/N):);
ch = getchar();
if(ch == 'N') return false;
else if(ch == 'Y')
{
return true;
}
}

C语言:单链表删除学生信息,增加学生信息(简易版)的更多相关文章

  1. C语言——单链表初始化、求表长、读表元素、插入元素

    头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...

  2. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  3. c语言-单链表(二)

    继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...

  4. c语言单链表实现

    /************************************************************************* > File Name: singleLin ...

  5. C语言—单链表

    单链表操作:读取,插入和删除 #include "stdafx.h" #include <string.h> #include <stdio.h> #inc ...

  6. 单链表删除(Delete)或者去除(Remove)节点面试题总结

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76061004冷血之心的博客) 关于单链表反转的多种形式请参见本博文 ...

  7. C语言单链表的实现

    // //  main.c //  gfhjhgdf // //  Created by chenhao on 13-12-23. //  Copyright (c) 2013年 chenhao. A ...

  8. 零基础玩转C语言单链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

  9. c语言-单链表(一)

    定义节点: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 细节说明,PNode 就代表struct Node* ,上面的表单是 ...

  10. C语言单链表简单实现(简单程序复杂化)

    PS: goto还是很好玩的. #include <stdio.h> #include <stdlib.h> typedef struct _node{ int value; ...

随机推荐

  1. Qt设置窗口显示到扩展屏

    #include <QDesktopWidget> void Dialog::setDisplayPos() { QDesktopWidget *desktop = QApplicatio ...

  2. centos部署Django一:环境搭建

    前言: 参考文档: https://www.cnblogs.com/djangocn/p/9538551.html https://www.icode9.com/content-3-546765.ht ...

  3. MogDB/openGauss 开机自启动

    MogDB/openGauss 开机自启动 在 centos7.6 操作系统上设置 MogDB/openGauss 开机自启动,我们先来了解一下自定义服务的配置文件组成部分,共分为[Unit].[Se ...

  4. TensorFlow2数据类型

    1.1 数值类型 数值类型的张量是 TensorFlow 的主要数据载体,分为: 1.标量(Scalar) 单个的实数,如 1.2, 3.4 等,维度数(Dimension,也叫秩)为 0, shap ...

  5. vue3 快速入门系列 —— 组件通信

    vue3 快速入门系列 - 组件通信 组件通信在开发中非常重要,通信就是你给我一点东西,我给你一点东西. 本篇将分析 vue3 中组件间的通信方式. Tip:下文提到的绝大多数通信方式在 vue2 中 ...

  6. Java实现学生投票系统

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 代码 im ...

  7. 【Oracle】使用case when语句导致SQL查询速度很慢的情况

    [Oracle]使用case when语句导致SQL查询速度很慢的情况 很多时候会使用到case when语句去对SQL的多种情况进行处理,decode也用的多,但是通常decode会用在固定值的数据 ...

  8. Apsara Stack 技术百科 | 边缘场景智能云化,让云无处不在

    ​简介:在过去十年间,随着计算技术的发展和移动互联网的广泛普及,各行业对数据本地计算和智能分析的需求与日俱增,越来越多的应用场景被接入了终端设备,导致终端侧的数据陡然增长,中心节点的处理算力不堪重负. ...

  9. 【全观测系列】Elasticsearch应用性能监控最佳实践

    ​简介:本文介绍了应用性能监控的应用价值以及解决方案等. 1.什么是全观测? 要了解全观测,我们先看看传统运维存在哪些问题. 数据孤岛,分散在不同部门,分析排查故障困难: 多个厂商的多种工具,无法自动 ...

  10. [Gin] gin-jwt 中间件的请求流程与使用思路

    gin-jwt 中间件是对 jwt-go 的封装以适应 gin 框架.gin-jwt 对不同的请求流程有不同的 handler: 登录请求流程 是用 LoginHandler. 需要 jwt 令牌的后 ...