`
lw9956164
  • 浏览: 27209 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构之顺序表应用(学生管理系统)

阅读更多
写了这么久的理论实战一下吧。欢迎大家一起交流,很多朋友说数据结构很多疑问.那我把自己QQ放这吧,9956164.欢迎大家随时敲门。

数据结构教程 第七课  实验一  线性表的顺序存储实验

本课主题: 实验一线性表的顺序存储实验

教学目的: 掌握顺序表的定义及操作的C语言实现方法

教学重点: 顺序表的操作的C语言实现方法

教学难点: 顺序表的操作的C语言实现方法

实验内容:
利用顺序表完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。

实验要求:
在上机前写出全部源程序。

上一课,举了一个例子,主要实现了一个顺序表的相关操作,现在做个小小的实验,即实现一个小小的学生成绩管理系统。

需求如下:

用顺序表实现一个完成一个班级的一个学期的所有课程的管理:能够增加、删除、修改学生的成绩记录。

假设学生有学号id,班级名class_name,学期term, 性别sex,姓名name,语文chinese,英语english,数学maths等字段。

系统分析:

系统有增加,删除,修改,查找等操作,都放在一个主界面选择进行。

由于时间关系,暂时使用C/C++混编了。本来我是学java的干脆用类设计的。

后来想了想为方便大家观摩,学习。还是用面向过程好了,这样大家也方便!



源码如下(实现是在VC++6.0下编译通过):
// student.cpp : Defines the entry point for the console application.
/** 说明:本程序主要实现学生成绩管理的相关操作,如添加,删除,修改,查询等****
*****************************************************************************
*****************************************************************************/
#include "stdafx.h"
#include "iostream.h"
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
 
struct student
{  
  char term[10]; // 学期
  char  class_name[10]; // 班级名
  int id;  // 学号id
  char name[30]; // 姓名 
  char sex[2];  // 性别  
  float chinese; // 语文
  float  english; // 英语 
  float  maths; // 数学 
};
typedef struct student DataType; //  指定struct student为DataType
struct SeqList
{
 int MAXLENGTH;     // 顺序表中最大元素的个数
 int count;         // 存放线性表中元素的个数count <= MAXLENGTH
 DataType* element;  // element[0], element[1], ..., element[n - 1]存放线性表中的元素
}; 
typedef struct SeqList *MySeqList;  
// 初始化并创建空顺序表
MySeqList initSeqList(int m);
// 判断线性表是否为空
int isEmptySeqList(MySeqList mySeqList);
// 在顺序表中求某元素的下标
int locateSeqList(MySeqList mySeqList, int id);
// 在顺序表中修改值
int updateSeqList(MySeqList mySeqList, int id);
// 顺序表的插入(元素p之前插入)
int insertPreSeqList(MySeqList mySeqList, int p, DataType x);
// 顺序表的插入(元素p之后插入)
int insertNextSeqList(MySeqList mySeqList, int p, DataType x);
// 顺序表的删除(根据下标删除)
int deleteSeqList(MySeqList mySeqList, int p);
// 顺序表的删除(根据元素值删除)
int deleteSeqListByValue(MySeqList mySeqList, int id);
// 将顺序表表示的线性表逆置
int reverseSeqList(MySeqList mySeqList);
/*
* 删除线性表中所有值为x的值
* 我给出的算法,在一个线性表中实现,设置了2个游标
*/
int deleteAllVSeqList(MySeqList mySeqList, DataType x);
// 求出下标为i的元素的前驱和后继
int findPrePostSeqList(MySeqList mySeqList, int i, DataType &m, DataType &n);
// 顺序表实现部分:找出值为x的元素的前驱和后继的存储位置(即下标)
int locatePrePostSeqList(MySeqList mySeqList, DataType x, int &i, int &j); 
// 输出线性表的元素值
void printSeqList(MySeqList &mySeqList); 
// 根据学生id,输出线性表的元素值
void printSeqListById(MySeqList &mySeqList,int id);
// 在顺序表中修改值
int updateSeqList(MySeqList mySeqList, int id)
{
 int iRc = locateSeqList(mySeqList, id);
 if (iRc == -1)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
  
 cout<<"class name:";        
 cin>>mySeqList->element[iRc].class_name;
           
 cout<<"term: ";
 cin>>mySeqList->element[iRc].term;
 cout<<"学号: ";
 cin>>mySeqList->element[iRc].id;
 cout<<"name: ";
 cin>>mySeqList->element[iRc].name;
 cout<<"sex: ";
 cin>>mySeqList->element[iRc].sex; 
 cout<<"english: ";
 cin>>mySeqList->element[iRc].english; 
    
 cout<<"chinese: ";
 cin>>mySeqList->element[iRc].chinese; 
 cout<<"maths: ";
 cin>>mySeqList->element[iRc].maths;    
 
 return 1;
}
 
// 功能: 创建空顺序表
MySeqList initSeqList(int m)
{
 MySeqList mySeqList = (MySeqList)malloc(sizeof(struct SeqList)); // 分配内存空间
 if (mySeqList != NULL)
 {
  mySeqList->element = (DataType*)malloc(sizeof(DataType) * m);   // 为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为m的数组
  if (mySeqList->element)
  {
   mySeqList->MAXLENGTH = m;  // 如果创建了元素,MAXLENGTH为最大元素的个数
   mySeqList->count = 0;  // 空表长度为0
   return (mySeqList);
  }
  else
   free(mySeqList);        // 记得要手动释放空间,否则很容易产生内存泄漏
 }
 printf("内存空间不足,请关闭一些程序,然后再试!\n"); // 存储分配失败,提示空间不足
 return NULL;
} 
// 功能: 判断线性表是否为空
int isEmptySeqList(MySeqList mySeqList)
{
 return (mySeqList->count ==0);
} 
// 功能:在顺序表中求某元素的下标,没有查找到,则返回-1
int locateSeqList(MySeqList mySeqList, int id)
{ 
 for (int i = 0; i < mySeqList->count; ++i)
  if (mySeqList->element[i].id == id)             // 传入一个元素x,查找到后返回下标i
   return (i);
 return (-1);
} 
// 功能:顺序表的pos下标前面插入,插入成功返回1,失败返回0
int insertPreSeqList(MySeqList mySeqList, int pos, DataType x)
{
 ++mySeqList->count;
 if (mySeqList->count > mySeqList->MAXLENGTH)      // 溢出
 {
  --mySeqList->count;     
  printf("表产生了溢出!\n");
  return (0);
 }
 if (pos < 0 || pos >= mySeqList->count)         // 不存在下标为pos的元素
 {
  --mySeqList->count;
  printf("不存在指定下标!\n");
  return (0);
 } 
 for (int i = mySeqList->count - 1; i != pos; --i)
  mySeqList->element[i] = mySeqList->element[i - 1]; // 插入位置及之后的元素均后移一个位置
 mySeqList->element[i] = x;                          // 插入元素x
 return (1);
} 
// 功能:顺序表的pos下标后面插入,插入成功返回1,失败返回0
int insertNextSeqList(MySeqList mySeqList, int pos, DataType x)
{
 if (pos < 0 || pos >= mySeqList->count)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 ++mySeqList->count;
 if (mySeqList->count >= mySeqList->MAXLENGTH)
 {
  --mySeqList->count;
  printf("表产生了溢出!\n");
  return (0);
 }
 
 for (int i = mySeqList->count - 1; i != pos + 1; --i)
  mySeqList->element[i] = mySeqList->element[i - 1];  // 同样地,把pos+1插入位置及之后的元素均后移一个位置
 mySeqList->element[i] = x;                           // 插入元素x
 return (1);
} 
// 功能:顺序表的删除(根据下标删除)
int deleteSeqList(MySeqList  mySeqList, int pos)
{
 if (pos < 0 || pos >= mySeqList->count)      // 不存在下标为pos的元素,注意下标范围是从0到count-1
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 
 for (int i = pos; i < mySeqList->count - 1; ++i)
  mySeqList->element[i] = mySeqList->element[i + 1];   // 被删除元素之后的元素均前移一个位置
 --mySeqList->count;                                  // 元素个数减1
 return (1);
} 
// 功能:根据元素值删除,实现顺序表的删除
int deleteSeqListByValue(MySeqList mySeqList, int id)
{
 int pos = locateSeqList(mySeqList, id);
 if (pos == -1)
 {
  printf("不存在指定下标!\n");
  return (0);
 }
 deleteSeqList(mySeqList, pos);
 return (1);
} 
  
/*
* 功能:删除线性表中所有学生ID为x的值
*/
int deleteAllSeqListByValue(MySeqList mySeqList, int x)
{
 if (mySeqList->count == 0)
 {
  printf("该表为空!\n");
  return (0);
 }
 for (int i = 0; i != mySeqList->count; ++i)
 {
  
  if (mySeqList->element[i].id == x )
  {   
      deleteSeqListByValue(mySeqList,x);             // 删除x,删除后要将下标减少1
      i--;
  }
 }
 return (1);
}

/*
* 功能:删除线性表中所有值为x的值的另一种算法
* 
*/
int deleteAllVSeqList(MySeqList mySeqList, int x)
{
 if (mySeqList->count == 0)
 {
  printf("该表为空!\n");
  return (0);
 }
 int p = 0, q = 0;
 while (mySeqList->element[p].id != x && p != mySeqList->count - 1)  // 跳过开始不是x的元素
 {
  ++p;
  ++q;
 }
 for (; p != mySeqList->count - 1; ++p)                            // 遍历元素,不遍历最后一个元素(为了防止越界)
 {
  while (mySeqList->element[p].id == x && p != mySeqList->count - 1) // 如果元素是x,则游标p后移(用while处理多个x连续的情况)
  {
   ++p;
  }
  if (p != mySeqList->count - 1)
  {
   mySeqList->element[q] = mySeqList->element[p];
   ++q;
  }
 }
 if (mySeqList->element[mySeqList->count - 1].id != x)
 {
  mySeqList->element[q] = mySeqList->element[mySeqList->count - 1];
  ++q;
 }
 mySeqList->count = q;
 return (1);
} 
 
// 功能:找出值为x的元素的前驱和后继的存储位置(即下标)
int locatePrePostSeqList(MySeqList mySeqList, int x, int &i, int &j)
{
 int k = locateSeqList(mySeqList, x);
 if (k == -1)
  return (0);
 if (k == 0)
  i = -1;
 else
  i = k - 1;
 if (k == mySeqList->count - 1)
  j = -1;
 else
  j = k + 1;
 return (1);
} 
// 输出线性表的元素值
void printSeqList(MySeqList &mySeqList)
{
  
 for (int i = 0; i < mySeqList->count; ++i)  // 输出线性表的元素值
 {
   cout<< "学期:" << mySeqList->element[i].term << ",班级名:" << mySeqList->element[i].class_name    ;
   cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ;
   cout<< "语文:" << mySeqList->element[i].chinese<< ",英语:" << mySeqList->element[i].english << ",数学:" << mySeqList->element[i].maths ;
   cout<<endl;
 }
 cout << endl;
}
// 根据学生id,输出线性表的元素值
void printSeqListById(MySeqList &mySeqList,int id) 
{
  
 for (int i = 0; i < mySeqList->count; ++i)  // 输出线性表的元素值
 {
   if (id == mySeqList->element[i].id)
   {
     cout<< "学期:" << mySeqList->element[i].term << ",班级名:" << mySeqList->element[i].class_name;
     cout<< "学号:" << mySeqList->element[i].id << ",姓名:" << mySeqList->element[i].name << ",性别:" << mySeqList->element[i].sex ;
     cout<< "语文:" << mySeqList->element[i].chinese<< ",英语:" << mySeqList->element[i].english << ",数学:" << mySeqList->element[i].maths ;
     cout<<endl;
     break;
   }
 }
 
}
int main(int argc, char* argv[])
{
/*
 MySeqList mySeqList = initSeqList(20); // 初始化一个长20的表
 for (int i = 0; i < 20; ++i)           // 对表进行赋值
 {
  mySeqList->count++;                   // 对表进行赋值 
  mySeqList->element[i] = i;            // 对表进行赋值 
 }
*/
MySeqList mySeqList = initSeqList(20); // 初始化一个长20的表
L: 
   system("cls");
   cout<< "*********************学生成绩管理系统*****************"<<endl;
   cout<< "***************1.添加学生信息 2.查找学生信息**********"<<endl;
   cout<< "***************3.删除学生信息 4.修改学生信息**********"<<endl;
   cout<< "***************5.退出学生系统               **********"<<endl;
   int i;   
   cout<<"请选择一个操作(1-5):";
   cin>>i; 
   if (i == 1)
   {    
     mySeqList->count = 1;
  int iRc = 0;
  while(true&&mySeqList->count<20)
  {    
       cout<<endl<<"请输入要添加的学生成绩信息(输入*退出添加):"<<endl;  
    cout<<"class name:";    
    
    cin>>mySeqList->element[iRc].class_name;
          if (strcmp(mySeqList->element[iRc].class_name,"*") == 0) 
    {  
     mySeqList->count--;     // 此处要减1,请思考为什么要减1哦。
     goto L;
    }
           
       cout<<"term: ";
    cin>>mySeqList->element[iRc].term;
    cout<<"学号: ";
    cin>>mySeqList->element[iRc].id;
    cout<<"name: ";
    cin>>mySeqList->element[iRc].name;
       cout<<"sex: ";
    cin>>mySeqList->element[iRc].sex; 
       cout<<"english: ";
    cin>>mySeqList->element[iRc].english; 
    
        cout<<"chinese: ";
    cin>>mySeqList->element[iRc].chinese; 
        cout<<"maths: ";
    cin>>mySeqList->element[iRc].maths;   
          
    cout << "添加学生成绩信息成绩ok."<<endl;
          printSeqList(mySeqList);
          mySeqList->count++;
          iRc++;
  }
         
   }
   else if (i == 2)
   {
L4:
       cout<<"请输入要查找的学生ID:"<<endl;
    int  sid;
    cin>>sid;
    if (locateSeqList(mySeqList,sid) != -1) 
    {
     cout<<"查询学号为"<<sid<<"的学生成绩ok."<<endl;
           printSeqListById(mySeqList,sid);
    }
    else
    {
     cout<<"查询学生成绩error,可能不存在学号为"<<sid<<"的学生."<<endl;
    }
    int iopselect;
    cout<<endl<<"还要继续查询吗,按0返回主菜单,否则继续此操作?"<<endl;
    cin>>iopselect;
    if (iopselect == 0) 
     goto L ;
    else 
        goto L4;
   
   }
   else if (i == 3)
   {
L1:
       cout<<"请输入要删除的学生ID:"<<endl;
    int stu_id;
    cin>>stu_id;
    
       if (deleteSeqListByValue(mySeqList,stu_id) == 1) 
         cout<<"删除学生成绩ok."<<endl;
    else
   cout<<"删除学生成绩error."<<endl;
    printSeqList(mySeqList);
    int iop;
    cout<<endl<<"还要继续删除吗,按0返回主菜单,否则继续此操作?"<<endl;
    cin>>iop;
    if (iop == 0) 
     goto L ;
    else 
        goto L1;
   }
   else if (i == 4)
   {
L3:
    cout<<"请输入要修改的学生ID:"<<endl;
       int id;
    cin>>id;
    if(updateSeqList(mySeqList,id) ==1) 
         cout << "修改学生成绩信息成绩ok."<<endl;
    else
         cout << "修改学生成绩信息成绩error."<<endl;
       printSeqList(mySeqList);
    int iselect;
    cout<<endl<<"还要继续修改吗,按0返回主菜单,否则继续此操作?"<<endl;
    cin>>iselect;
    if (iselect == 0) 
     goto L ;
    else 
        goto L3;
   }
   else if (i == 5)
   {   
    system("cls");
    cout<<"你已经退出本系统,欢迎下次再使用."<<endl; 
   }
    
 return 0;
} 
分享到:
评论

相关推荐

    C语言数据结构顺序表 学生表 学生成绩管理系统.zip

    本项目以"C语言数据结构顺序表 学生表 学生成绩管理系统"为主题,涉及到的核心知识点包括顺序表、学生表的设计以及如何用C语言构建一个简单的学生成绩管理系统。 首先,我们来讨论“顺序表”。顺序表是一种基础的...

    数据结构—刘小晶—例2.7——用顺序表结构写的学生成绩管理系统

    刘小晶教授的"数据结构—例2.7"讲解了一个使用顺序表结构实现的学生成绩管理系统,这是一个典型的实际应用案例,有助于深入理解数据结构在实践中的应用。 首先,我们要明白什么是顺序表。顺序表是一种线性数据结构...

    基于顺序表的学生成绩管理系统

    总结,【基于顺序表的学生成绩管理系统】是一个结合了ASP编程技术、数据结构(顺序表)和Web设计原理的应用实例,它展示了如何利用这些技术来实现一个简单的成绩管理平台。尽管在大规模应用中可能会有性能瓶颈,但...

    C语言数据结构-顺序表版学生管理系统

    在本项目" C语言数据结构-顺序表版学生管理系统 "中,我们将聚焦于一种基础的数据结构——顺序表,以及如何利用C语言实现一个学生管理系统的具体应用。 顺序表是一种线性数据结构,它的特点是元素在内存中按顺序...

    数据结构课程设计图书信息管理系统报告(顺序表)(模板)

    数据结构课程设计报告——图书信息管理系统使用顺序表 在当今信息化时代,计算机技术的广泛应用已经成为了现代化社会的重要标志。尤其在图书馆管理领域,面对海量的读者信息、书籍信息以及复杂的借阅活动,高效的...

    数据结构(简易实现学生管理系统)

    总之,这个学生管理系统充分展示了数据结构在实际问题中的应用,通过合理选择和设计数据结构,能够有效地提高系统的性能和用户体验。从栈到链表,从队列到图,再到树和哈希表,每种数据结构都在解决特定问题时发挥了...

    (数据结构课程设计)学生成绩管理系统

    在本项目“(数据结构课程设计)学生成绩管理系统”中,主要涉及的是对学生信息进行管理,特别是成绩方面的处理。这个系统实现了基本的学生管理和成绩操作功能,包括学生信息的添加、删除以及成绩的排序等。下面我们...

    学生信息管理系统的顺序表实现

    ### 学生信息管理系统的顺序表实现 #### 案例背景与目标 在教育领域,班级不仅是学生学习和生活的基础单位,也是管理和组织教学活动的重要载体。因此,设计一个有效的班级管理系统对于提升学校的管理水平至关重要...

    学生管理系统利用顺序表实现

    总之,"学生管理系统利用顺序表实现"是一个很好的学习案例,它综合运用了C++的模版类、友元函数以及数据结构中的顺序表知识,帮助我们加深对C++语言特性的理解和应用。通过实践这样的项目,不仅可以提升编程技巧,还...

    链表与顺序表编写学生信息管理系统

    【链表与顺序表在学生信息管理系统中的应用】 在计算机科学中,数据结构是编程的基础,其中链表和顺序表是两种常见的数据结构。在设计一个学生信息管理系统时,这两种数据结构都扮演着重要的角色。本文将详细阐述...

    学生管理系统顺序表学生管理系统顺序表.doc

    学生管理系统顺序表是计算机科学和信息技术中的一种重要应用系统,它旨在帮助学校或教育机构对学生的信息进行管理和维护。本系统使用C语言编写,采用顺序表(Sequential List)数据结构来存储学生的信息。 顺序表是...

    链表学生管理系统-数据结构

    ### 链表学生管理系统的数据结构与功能实现 在计算机科学中,链表是一种常见的数据结构,用于存储和组织数据。本系统介绍了一个基于链表的学生管理系统的设计与实现,该系统可以用来管理学生的学号、姓名以及分数等...

    学生管理系统。数据结构

    《数据结构在学生管理系统中的应用》 数据结构是计算机科学中的一个重要分支,它研究如何有效地组织和存储数据,以便在需要时能快速访问和处理。在这个项目中,“学生管理系统”便是一个利用数据结构原理实现的实际...

    数据结构程序设计学生成绩管理系统

    通过实现这样的学生成绩管理系统,学生可以深入理解和掌握C语言的编程技巧,以及数据结构与算法的应用,为未来的学习和工作打下坚实的基础。同时,这也是一个很好的实践机会,可以锻炼解决问题和项目管理的能力。

    C语言——基于顺序表的学生信息管理系统(文件操作)

    在本项目中,我们探讨的是一个基于C语言实现的简单学生信息管理系统,它利用了数据结构中的顺序表概念,并涉及到文件操作。这个系统允许用户进行基本的学生信息存储、读取和管理,是学习C语言与数据结构相结合的一个...

    学生成绩管理系统c语言简单版数据结构课程设计

    【标题】"学生成绩管理系统c语言简单版数据结构课程设计"主要涵盖了两个核心主题:C语言编程和数据结构的应用。在C语言中实现一个学生成绩管理系统,可以帮助初学者理解如何利用编程语言来处理实际问题,特别是涉及...

    学生管理系统(数据结构)

    学生管理系统是一个典型的计算机应用系统,它涉及到了数据的组织、存储和处理,是数据结构课程设计中的一个重要实践项目。本系统在DOS命令环境下运行,充分展示了早期计算机系统中数据管理的机制。 一、数据结构...

    学生成绩管理的顺序表

    在本实验中,我们关注的是"学生成绩管理的顺序表",这涉及到一种基础的数据结构——顺序表。顺序表是一种线性数据结构,它的元素在内存中是连续存储的,就像数组一样。下面将详细讨论顺序表的概念、其特点以及在学生...

    c语言 学生信息管理系统-顺序表

    在计算机科学中,数据结构是程序设计的基础,而顺序表作为最基础的数据结构之一,被广泛应用于各种系统开发中。本项目是用C语言实现的一个学生信息管理系统,它利用顺序表来存储和管理学生数据,实现了包括插入、...

    数据结构(学生通讯录管理系统)

    数据结构在IT领域中扮演着核心角色,尤其是在开发复杂系统如学生通讯录管理系统时。这样的系统需要有效地存储和检索大量信息,例如学生的姓名、联系方式、班级等。在本项目中,“数据结构(学生通讯录管理系统)”...

Global site tag (gtag.js) - Google Analytics