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

功能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. #并查集#JZOJ 4223 旅游

    题目 多次询问有多少个无序点对\((x,y)\), 满足至少有一条最大边权\(\leq d\)的路径 分析 离线询问,用并查集加边,每次产生的贡献为\(2*siz[x]*siz[y]\) 代码 #in ...

  2. OpenHarmony 3.2 Beta多媒体系列——音视频播放gstreamer

      一. 简介 多媒体播放框架主要的实现在PlayerServer服务中,这个服务提供了媒体播放框架所需要的实现环境,继续跟踪代码分析发现,PlayerServer主要通过gstreamer适配层,对 ...

  3. C语言 05 变量与常量

    变量 变量就像在数学中学习的 x,y 一样,可以直接声明一个变量,并利用这些变量进行基本的运算,声明变量的格式为: 数据类型 变量名称 = 初始值;(其中初始值可以不用在定义变量时设定) = 是赋值操 ...

  4. pc=mobile+pad自适应布局:页面结构与打开方式

    pc=mobile+pad自适应布局 在这篇文章,咱们重点聊聊自适应布局的页面结构,以及打开页面的几种方式.关于pc=mobile+pad自适应布局的起源.概念.效果,参见文章:自适应布局:pc = ...

  5. 重新点亮linux 命令树————修改网络配置[十一四]

    前言 整理一下网络配置的修改. 正文 网络配置命令 ifconfig <接口> <ip地址> [netmask 子网掩码] ifup <接口> ifdown < ...

  6. 论文记载:A Survey on Traffic Signal Control Methods

    ABSTRACT 交通信号控制是一个重要且具有挑战性的现实问题,其目标是通过协调车辆在道路交叉口的移动来最小化车辆的行驶时间.目前使用的交通信号控制系统仍然严重依赖过于简单的信息和基于规则的方法,尽管 ...

  7. NodeJS安装cnpm

    介绍: NPM(Node Package Manager):Node的包管理器. CNPM(Chinese CPM):中国的NPM(国内使用,网速较快). 配置步骤 用npm安装cnpm npm in ...

  8. 腾讯音乐:说说Redis脑裂问题?

    Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会 ...

  9. node统计指定文件夹内代码行数

    1. 来源 想对于自己接触前端日常学习与思考的代码行数进行一个统计,看自己大约敲了多少代码 2.代码 const fs = require('fs') const path = require('pa ...

  10. 轻松复现一张AI图片

    轻松复现一张AI图片 现在有一个非常漂亮的AI图片,你是不是想知道他是怎么生成的? 今天我会交给大家三种方法,学会了,什么图都可以手到擒来了. 需要的软件 在本教程中,我们将使用AUTOMATIC11 ...