C语言:单链表删除学生信息,增加学生信息(简易版)
假设用户都是正常的,不会输入一些乱七八糟的东西。
功能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语言:单链表删除学生信息,增加学生信息(简易版)的更多相关文章
- C语言——单链表初始化、求表长、读表元素、插入元素
头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...
- C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
- c语言-单链表(二)
继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...
- c语言单链表实现
/************************************************************************* > File Name: singleLin ...
- C语言—单链表
单链表操作:读取,插入和删除 #include "stdafx.h" #include <string.h> #include <stdio.h> #inc ...
- 单链表删除(Delete)或者去除(Remove)节点面试题总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76061004冷血之心的博客) 关于单链表反转的多种形式请参见本博文 ...
- C语言单链表的实现
// // main.c // gfhjhgdf // // Created by chenhao on 13-12-23. // Copyright (c) 2013年 chenhao. A ...
- 零基础玩转C语言单链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...
- c语言-单链表(一)
定义节点: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 细节说明,PNode 就代表struct Node* ,上面的表单是 ...
- C语言单链表简单实现(简单程序复杂化)
PS: goto还是很好玩的. #include <stdio.h> #include <stdlib.h> typedef struct _node{ int value; ...
随机推荐
- N次剩余小记
前言 上周在 51nod 交了一些3.4级的题目,然后发现没有写过1级题, 就找到了一道 51nod 1014 \(X^2 \bmod P\) 的题目,当然这题虽然是暴力,但也可以用二次剩余做. 我就 ...
- 网站优化之robots.txt
本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 在查询favicon.ico相关的资料时,无间中看到了robots.tx ...
- OpenHarmony社区运营报告(2023年12月)
• 截至2023年12月22日,OpenAtom OpenHarmony(简称"OpenHarmony")社区累计超过6700名贡献者,产生26.9万多个PR,2.4万多个St ...
- MySQL 8.0字符集校正
MySQL升级为8.0版本时,之前版本的字符集往往是不同的,需要校正. 执行下面的三个SQL语句的查询结果,可以从库.表.列三个层面对字符集进行校正. 库 select concat('alter d ...
- 批处理及有状态等应用类型在 K8S 上应该如何配置?
众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:h ...
- 豪鹫闲谈:IBM x3650 m4服务器安装centos6.4系统
豪鹫闲谈:IBM x3650 m4服务器安装centos6.4系统 2013-08-25 11:46:29 标签: IBM x3650 centos6.4 原创作品,允许转载,转载时请务必以超链接 ...
- js es6 Iterator
1.遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). 2.Iterator ...
- 报错ORA-01830: date format picture ends before converting entire input string
报错ORA-01830: date format picture ends before converting entire input string 原语句 select to_char(to_da ...
- 从0到1使用Webpack5 + React + TS构建标准化应用
简介: 本篇文章主要讲解如何从一个空目录开始,建立起一个基于webpack + react + typescript的标准化前端应用. 作者 | 刘皇逊(恪语)来源 | 阿里开发者公众号 前言 本篇文 ...
- 如何可视化编写和编排你的 K8s 任务
简介: 通过任务调度 SchedulerX 来调度你的 K8s 任务,能够降低学习成本,加快开发效率,让你的任务失败可报警,出问题可排查,打造云原生可观测体系下的可视化 K8s 任务. 作者:学仁 ...