1.问题描述
掌握线性表的基本操作,如建立、查找、插入和删除等。
定义一个包含学生信息(学号,姓名,成绩)的链表,使其具有如下功能:
1.1根据指定学生个数,逐个输入学生信息;
1.2逐个显示学生表中所有学生的相关信息;
1.3根据姓名进行查找,返回此学生的学号和成绩;
1.4根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
1.5给定一个学生信息,插入到表中指定的位置;
1.6删除指定位置的学生记录;
1.7统计表中学生个数。
2.需求分析
2.1根据指定学生个数,逐个输入学生信息;
2.2逐个显示学生表中所有学生的相关信息;
2.3根据姓名进行查找,返回此学生的学号和成绩;
2.4根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
2.5给定一个学生信息,插入到表中指定的位置;
2.6删除指定位置的学生记录;
2.7统计表中学生个数。
3.概要设计
3.1选择的数据结构为线性表
3.2储存方式为链式存储。链表中对信息的增添和删除相对顺序表会更简便。
3.3用结构体定义学生信息,定义链表,初始化链表(带头结点的单链表),分别定义所需功能的函数,在定义一个Function函数实现以上操作的提示
3.4用switch将这些操作进行联系
4.详细设计(4.1-4.11为子函数和结构体,4.12为主函数部分)
4.1用结构体定义学生信息student(字符数组型的学号和姓名,整型的成绩)
4.2定义结构体链表LinkList(定义一个学生类型的结点的数据域,定义结构体类型的结点的指针域)
4.3链表的初始化,用InitList函数构造一个空的链表,生成一个新的结点作为头结点,用头指针L指向头结点,将头结点的指针域设置为空
4.4定义GetElem函数,用于输入学生在表中位置让指针指向当前学生信息
4.5定义Search函数,使其完成根据名字查找,返回其在链表中的序号。依次遍历各个表中元素,当name通输入姓名相同时,输出该学生的各项信息
4.6定义ListInsert函数,实现在第i个位置插入学生信息。先判断插入的位置是否合法,让原有的p指针指向第i-1的位置,生成新的结点型指针s,指向要插入i位置元素的数据域,让s指针的next指向p的next域,再让p的next指向s
4.7定义ListDelete函数,使其完成在顺序表中删除i位置的学生信息。判断插入的位置是否合法,让原有的p指针指向第i-1的位置,生成新的结点型指针q,指向要删除的i位置元素的数据域,让p的next域指向q的next域将要删除的值返回给e以便显示输出,释放掉p
4.8定义ListEmpty函数,判断链表是否为空,if头指针L的next域为NULL及空
4.9定义ListLength函数,获取链表长度,定义一个结构体类型指针p,让p指向首元结点,若不为空及让“计时器”Length+1,然后p指向下一个结点,循环历遍链表中元素
4.10定义TraveList函数,用于显示所有学生信息,依次输出学生姓名,学号,成绩
4.11定义一个Function函数,不需返回值,是以上操作的提示作用
4.12主函数部分声明一个顺序表和四个学生,定义一个重要的变量choose,用于选择触发要执行的操作,调用function函数,按相应的1-9数字就会调用相应的功能
5.源代码
#include<stdio.h>
#include
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define MAX 100

typedef struct STU{
char name[20];
char no[8];
int price;
}Student;

typedef struct LNode{
Student data;
struct LNode *next;
}LNode,LinkList;
int InitList(LinkList &L) // 构造空链表 L
{
L=(struct LNode
)malloc(sizeof(struct LNode));
L->next=NULL;
return 1;
}

//初始化(带头结点的单链表)

//判断链表是否为空
int ListEmpty(LinkList L){
if(L->next=NULL){
return 1;//链表为空
}else{
return 0;//链表非空
}
}

//获取链表长度
void ListLength(LinkList L){
int length=0;
struct LNode *p;
p=L->next;
while§{
p=p->next;
length++;
}
printf(“学生个数共:%d\n”,length);
}

//遍历链表
void TraveList(LinkList L){
struct LNode *p;
p=L->next;
printf(“学生信息表如下:\n”);
while§{
printf(“姓名:%s 学号:%s 成绩:%d”,p->data.name,p->data.no,p->data.price);
printf("\n");
p=p->next;
}
}
int GetElem(LinkList L,int i,Student &e) // 访问链表,找到 i位置的数据域,返回给 e
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i) return 0;
e=p->data;
return 1;
}

int Search(LinkList L,char str[],Student &e) // 根据名字查找
{
LinkList p;
p=L->next;
while§
{ //printf("%d\n",strcmp(p->data.name,str));
//printf("%s %s\n",p->data.name,str);
while(!strcmp(p->data.name,str)==0){
p=p->next;
}
if(strcmp(p->data.name,str)==0){
e=p->data;
return 1;
p=p->next;
}
return 0;
}}

//插入操作
int ListInsert(LinkList &L,int location,Student &e){//在链表L的location位置插入元素e
struct LNode *p;
int j=0;
p=L;
while(p&&j<location-1){
p=p->next;
++j;
}
if(!p||j>location-1){
return 0;
}
struct LNode *s;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}

//删除操作
int ListDelete(LinkList &L,int location,Student &e){
//删除L中location位置的元素,并用e返回其值
struct LNode *p;
int j=0;
p=L;
while(p->next&&j<location-1){
p=p->next;
++j;
}
if(!(p->next)||j>location-1){
return 0;
}
struct LNode *q;
q=new LNode;
q=p->next;
p->next=q->next;
e=q->data;
delete q;
return 1;
}

//尾插法创建单链表
void CreateList(LinkList &L,int n){
L=new LNode;
L->next=NULL;
struct LNode *r;
r=L;
printf(“请输入学生信息:\n”);
for(int i=0;i<n;i++){
struct LNode *p;
p=new LNode;
printf(“请输入第%d个学生姓名:\n”,i+1);
printf(“请输入姓名:”);
scanf("%s",&p->data.name);
printf(“请输入学号:”);
scanf("%s",&p->data.no);
printf(“请输入成绩:”);
scanf("%d",&p->data.price);
p->next=NULL;
r->next=p;
r=p;
}
}
void Output(Student e)
{
printf(“姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n”,e.name,e.no,e.price);
}

void function(){
printf("-------------------------------");
printf("\n1.初始化学生信息表\n");
printf(“2.创建学生信息表\n”);
printf(“3.显示所有学生信息\n”);
printf(“4.输入姓名显示学生信息\n”);
printf(“5.输入学生位置显示相关信息\n”);
printf(“6.插入操作\n”);
printf(“7.删除操作\n”);
printf(“8.统计学生人数\n”);
printf(“9.退出\n”);
printf("-------------------------------\n");
}
int main(){

LinkList L;
int choose=-1;
while(choose!=0){
function();
printf(“请选择操作:\n”);
scanf("%d",&choose);
switch(choose){
case 1:{
if(InitList(L)){
printf(“学生信息表初始化成功!\n”);
}else{
printf(“学生信息表初始化失败!\n”);
}
break;
}
case 2:{
printf(“请输入学生个数:\n”);
int n;
scanf("%d",&n);
CreateList(L,n);
printf(“学生信息表创建成功!\n”);
break;
}
case 3:{
printf(“所有学生信息如下:\n”);
TraveList(L);
break;
}
case 4:{
char s[20];
cout<<“请输入要查找的学生姓名:”;
cin>>s;
Student b;
if(Search(L,s,b))
//printf("%s %s %d\n",b.name,b.no,b.price);
printf(“姓名:%-20s\n学号:%-10s\n成绩:%d\n”,b.name,b.no,b.price);
else
cout<<“对不起,查无此人”;
puts("");
break;
}
case 5:{
cout<<“请输入要查询的位置:”;
int id1;
cin>>id1;
Student c;
GetElem(L,id1,c);
printf(“姓名:%-20s\n学号:%-10s\n成绩:%d\n”,c.name,c.no,c.price);
break;
}
case 6:{
printf(“请输入插入的学生位置和相关信息:\n”);
int location;
scanf("%d",&location);
Student stu;
printf(“请输入姓名:”);
scanf("%s",stu.name);
printf(“请输入学号:”);
scanf("%s",stu.no);
printf(“请输入成绩:”);
scanf("%d",&stu.price);

if(ListInsert(L,location,stu)){printf("插入成功!\n");
}else{printf("插入失败!\n");
}
//TraveList(L);
break;

}
case 7:{
printf(“请输入要删除的学生信息的位置:\n”);
int location;
scanf("%d",&location);
Student stu;

if(ListDelete(L,location,stu)){printf("删除成功!\n");printf("删除的元素值是:\n");printf("姓名:%-20s\n学号:%-10s\n成绩:%d\n",stu.name,stu.no,stu.price);TraveList(L);
}else{printf("删除失败!\n");
}
//TraveList(L);
break;

}
case 8:{
ListLength(L);
break;
}
case 9:{
printf(“退出成功!\n”);
return 0;
}
}
}
}

链表的基本操作——学生信息管理表相关推荐

  1. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

  2. c语言程序设计报告链表,c语言程序设计报告链表实现学生信息管理.docx

    C语言课程设计报告 链表实现学生信息管理 一.课程设计目标 C语言课程设计的目的是通过课程设计的综合训练,培养学生实际分析问题.编程和动手能力,最终目标是通过这种形式,帮助学生系统掌握该门课程的主要内 ...

  3. 学生信息管理单链表实现(c语言)

    这次将前几天发的顺序表改为单链表实现,总体上也很简单,只是增加了指针域,代码奉上: #include <stdio.h> #include<malloc.h> #include ...

  4. 学生信息管理(顺序表)(数据结构入门)

    要求: 自己设计学生基本信息表 具备功能:创建.清空.销毁.插入.删除.按值查找.更新某人信息.指定位置查找.遍历. 详解我是没有了,可以看这里 瞎写的,欢迎纠错 #include <iostr ...

  5. android学生信息管理系统PPT讲解,基于Android的学生信息管理及沟通系统的设计与实现毕业论文+选题表+开题报告+设计源码+答辩PPT...

    摘   要 近年来,随着移动互联网和电子信息技术的迅猛发展,使用Android技术开发的手机软件越来越多.人们已经从电脑中解放出来,可以采用更简巧的设备--手机,进行娱乐,工作. 本文通过对Andro ...

  6. 链表c++语言 解析,C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数 ...

  7. js实现学生信息表案例--详细教程

    目录 一.页面展示 二.代码分析 三. 全部代码 一.页面展示 二.代码分析 html和css的样式 属于基本操作,分析只讲 js开始 说明: 这个案例,减少了dom操作,采取操作数据的形式,增加和删 ...

  8. 【java毕业设计】基于javaEE+SSH+SQL Server的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统

    基于javaEE+SSH+SQL Server的学生信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+SQL Server的学生信息管理系统设计与实现,文章 ...

  9. 链表的基本操作(C/C++)

    文章目录 前言 一.单链表定义 二.单链表的基本操作 1.遍历操作 2.链表长度 3.链表查找 4.链表插入 5.头插入法(创建链表) 6.尾插法(创建链表) 7.删除结点 8.链表释放 三.循环链表 ...

  10. 实践hibernate的应用——struts2+hibernate的简单学生信息管理

    struts2+hibernate的简单学生信息管理,没有用很好的界面,目的主要是为了实践一下hibernate框架的学习,深入了解hibernate框架. 下面是项目的目录: 配置文件hiberna ...

最新文章

  1. 解决数据库读写分离(转)
  2. 【转】 Android中退出程序的提示框
  3. 深度学习新星:GANs的基本原理、应用和走向
  4. IT规划的企业应用实践(10)研究的范围和限制
  5. 基于cmake28来编译安装mysql服务配置解析
  6. 学习、积累、交流-IC设计高手的成长之路
  7. 扎哈遗作:北京大兴机场,耗资800亿,被英国《卫报》评为新世界七大奇迹!...
  8. 美观大气!一款基于 Spring Boot 开发 OA 开源产品
  9. VK Cup 2018 Round 2: B. Three-level Laser(二分)
  10. 使用预编译库PREBUILT LIBRARY官方说明
  11. hugo部署到Githut Pages
  12. Office 365组命名策略 - 补充
  13. 【java学习】String字符串
  14. C++:Leetcode-滑动窗口-904.水果成篮
  15. 浅析IDC行业的前景
  16. Bugku逆向-游戏过关
  17. 系统盘下system32下的文件说明
  18. 毫米波雷达模块在自动驾驶系统中的关键功能
  19. 湖南电信分公司客服中心提升服务质量的对策研究
  20. <Java>根据身高体重计算BMI指数

热门文章

  1. 广东2022年下半年系统集成项目管理工程师上午真题及答案解析
  2. 关于idea,双击选中问题
  3. unity package 包下载不下来
  4. BIM族库下载——Revit家用电器族库
  5. HDU 3642 Get The Treasury ( 线段树 求长方体体积并 )
  6. python贪心算法几个经典例子_贪心算法及示例,Python
  7. 在线 JSON 格式化校验工具
  8. [网络结构]DenseNet网络结构
  9. pingfang css,前端项目,引入PingFang SC字体
  10. mnist数据集下载及使用