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

功能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. #Manacher,并查集#洛谷 3279 [SCOI2013]密码

    题目 分析 这些回文长度可以提供相等或者不等的信息, 不等的直接连边强制不等,相等用并查集合并连通块, 但是这样判断是\(O(n^2)\),考虑这些回文长度当用Manacher求时, 所有的回文长度都 ...

  2. #分治NTT#CF1218E Product Tuples

    Codeforces 用 OGF 表示 \(F(B,x)\) 就是 \[\prod_{i=1}^n(1+(q-a_i)x) \] 直接分治 NTT 把 \([x^k]\) 也就是这一位的系数求出来就可 ...

  3. OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型.对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第 ...

  4. 简洁,快速的bv号转av号 c++实现

    加了一部分预处理,变得更高效了 继承自朋友这里 #include <iostream> #include <string> using namespace std; const ...

  5. C# Dictionary(数据字典)的基本用法

    C# Dictionary(数据字典)的基本用法 - Mr.Cat~ - 博客园 (cnblogs.com)   通常情况下,我们可以通过 int 类型的索引来从数组或者 List 集合中查询所需的数 ...

  6. Docker 14 Docker Compose

    概述 使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器. 然而微服务架构的应用系统一般包含若干个微服务,每个微服务 ...

  7. HarmonyOS数据管理与应用数据持久化(一)

      一. 数据管理概述 功能介绍 数据管理为开发者提供数据存储.数据管理能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全.可靠等管理机制. ● 数据存储:提供通用数据持久化能力,根据数据特 ...

  8. 重走py 之路 ——普通操作与函数(三)

    前言 本节主要介绍函数,但是函数是由操作组成的.那么就分为两部,一部分为操作一部分为函数. 正文 py世界中的操作. 操作 if: 在学习任何一门语言中,关系if,要关系另外一件事,那就是if是否只能 ...

  9. 10个常用的JS工具库,80%的项目都在用

    高手区别于普通人的重要一点是,他们善于利用工具,把更多的时间留给了规划和思考.写代码也是同样的道理,工具用好了,你就有更多的时间来规划架构和攻克难点.今天就给大家分享一下当前最流行的 js 工具库,如 ...

  10. 【Oracle】lpad与rpad函数,从左边对字符串使用指定的字符进行填充将1变成000001

    [Oracle]lpad&rpad函数,从左边对字符串使用指定的字符进行填充将1变成000001 lpad与rpad函数 顾名思义,lpad是从左边开始进行填充,rpad是从右边开始进行填充 ...