数据结构(C语言)-线性表ADT(顺序表)|创建学生结构体 实现学生信息管理

案例要求:

1.定义顺序表,实现顺序表的基本操作。

2.利用1实现学生信息管理(学生信息包括学号、姓名、年龄等),包括:

⑴插入学生信息,建立至少有五个学生信息的线性表。

⑵更新指定学号的学生姓名。

⑶查找指定学号的学生信息。

⑷输出所有学生信息。

⑸删除指定学号的学生信息。

注:其中的输入数据均来自于标准输入。

案例分析:

创建结构体


//学生类型

typedef struct {

 char sno[4];

 char sname[10];

 int sage;

 char sdept[3];

}StuType;

定义顺序表

typedef struct {

 ElemType* stu;

 int length;

 int listsize;

}List;

初始化列表

Status InitList(List& L)

{

 L.stu = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));

 if (!L.stu)exit(OVERFLOW);

 L.length = 0;

 L.listsize = LIST_INIT_SIZE;

 return OK;

}

功能实现

//插入学生信息

Status ListInsert(List& L, int i, ElemType e)

{

 if (i<1 || i>L.length + 1)

 {

  return ERROR;

 }

 L.length += 1;

 if (L.length > L.listsize)

 {

  ElemType* newbase;

  newbase = (ElemType*)realloc(L.stu, (L.listsize + LISTINCREMENT) * sizeof(ElemType));

  if (!newbase)exit(OVERFLOW);

  L.stu = newbase;

  L.listsize = LISTINCREMENT;

 }

 for (int t = L.length; t >= i; t--)

 {

  L.stu[t] = L.stu[t - 1];

 }

 L.stu[i - 1] = e;

 return 1;

}



//定位指定学生

Status LocateElem(List L, ElemType e, Status(*equal)(ElemType, ElemType))

{

 int i = 1;

 ElemType* p;

 p = L.stu;

 while (i <= L.length && equal(*p++, e)==ERROR){ i++; }

 if (i <= L.length)

 {

  return i;

 }

 else

 {

  return 0;

 }

}

Status equal(ElemType c1, ElemType c2)

{

 if (strcmp(c1.sno, c2.sno) == 0)

  return OK;

 else

  return ERROR;

}



//删除学生信息

Status ListDelete(List& L, int i, ElemType& e) {

 if (i<1 || i>L.length + 1) 

 {

  return 0;

 }

 i--;

 e = L.stu[i];

 for (int j = i; j <= L.length; j++) {

  L.stu[j] = L.stu[j + 1];

 }

 L.length--;

 return 1;

}





//获取指定学生信息

Status GetElem(List L, int i, ElemType& e)

{

 if (1 <= i && i <= ListLength(L))

 {

  e = L.stu[i - 1];

  return OK;

 }

 else

 {

  return ERROR;

 }

}



//学生信息赋值

Status PutElem(List& L, int i, ElemType e)

{

 if (L.stu != NULL)

 {

  if (i > L.length || i < 0)

  {

   return ERROR;

  }

  else

  {

   L.stu[i - 1] = e;

   return OK;

  }

 }

 else

 {

  return OVERFLOW;

 }

}





//遍历

Status visit(ElemType e)

{

 printf("%s\t%s\t%d\t%s\n", e.sno, e.sname, e.sage, e.sdept);

 return OK;

}

Status ListTraverse(List L, Status(*visit)(ElemType e)) {

 if (0 == L.length) return ERROR;

 for (int i = 0; i < L.length; i++) {

  visit(L.stu[i]);

 }

 return OK;

}

完整代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>




#define TRUE 1

#define FALSE 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;



//学生类型

typedef struct {

 char sno[4];

 char sname[10];

 int sage;

 char sdept[3];

}StuType;

typedef StuType ElemType;



#define OK 1

#define LIST_INIT_SIZE 100

#define ERROR -1

#define LISTINCREMENT 20



typedef struct {

 ElemType* stu;

 int length;

 int listsize;

}List;



//初始化列表

Status InitList(List& L)

{

 L.stu = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));

 if (!L.stu)exit(OVERFLOW);

 L.length = 0;

 L.listsize = LIST_INIT_SIZE;

 return OK;

}



//获取列表长度

Status ListLength(List L)

{

 return L.length;

}



//插入学生信息

Status ListInsert(List& L, int i, ElemType e)

{

 if (i<1 || i>L.length + 1)

 {

  return ERROR;

 }

 L.length += 1;

 if (L.length > L.listsize)

 {

  ElemType* newbase;

  newbase = (ElemType*)realloc(L.stu, (L.listsize + LISTINCREMENT) * sizeof(ElemType));

  if (!newbase)exit(OVERFLOW);

  L.stu = newbase;

  L.listsize = LISTINCREMENT;

 }

 for (int t = L.length; t >= i; t--)

 {

  L.stu[t] = L.stu[t - 1];

 }

 L.stu[i - 1] = e;

 return 1;

}



//定位指定学生

Status LocateElem(List L, ElemType e, Status(*equal)(ElemType, ElemType))

{

 int i = 1;

 ElemType* p;

 p = L.stu;

 while (i <= L.length && equal(*p++, e)==ERROR){ i++; }

 if (i <= L.length)

 {

  return i;

 }

 else

 {

  return 0;

 }

}

Status equal(ElemType c1, ElemType c2)

{

 if (strcmp(c1.sno, c2.sno) == 0)

  return OK;

 else

  return ERROR;

}



//删除学生信息

Status ListDelete(List& L, int i, ElemType& e) {

 if (i<1 || i>L.length + 1) 

 {

  return 0;

 }

 i--;

 e = L.stu[i];

 for (int j = i; j <= L.length; j++) {

  L.stu[j] = L.stu[j + 1];

 }

 L.length--;

 return 1;

}





//获取指定学生信息

Status GetElem(List L, int i, ElemType& e)

{

 if (1 <= i && i <= ListLength(L))

 {

  e = L.stu[i - 1];

  return OK;

 }

 else

 {

  return ERROR;

 }

}



//学生信息赋值

Status PutElem(List& L, int i, ElemType e)

{

 if (L.stu != NULL)

 {

  if (i > L.length || i < 0)

  {

   return ERROR;

  }

  else

  {

   L.stu[i - 1] = e;

   return OK;

  }

 }

 else

 {

  return OVERFLOW;

 }

}





//遍历

Status visit(ElemType e)

{

 printf("%s\t%s\t%d\t%s\n", e.sno, e.sname, e.sage, e.sdept);

 return OK;

}

Status ListTraverse(List L, Status(*visit)(ElemType e)) {

 if (0 == L.length) return ERROR;

 for (int i = 0; i < L.length; i++) {

  visit(L.stu[i]);

 }

 return OK;

}





void main()

{

 List L;

 ElemType stu, stu_tmp;

 int func, pos;



 if (!InitList(L))

 {

  printf("overflow!\n");

  exit(-1);

 }

 for (int j = 0;; j++)

 {

  printf("Please select the function:\n0--Exit\n1--insert student\n2--delete student\n3--update student name\n4--search student with sno\n5--show all student\n6--count the student\n Please input:");

  scanf_s("%d", &func);

  switch (func)

  {

  case 0:

   exit(1);

   break;

  case 1: //插入学生信息

   printf("sno: ");

   scanf_s("%s", &stu.sno,4);

   printf("sname: ");

   scanf_s("%s", &stu.sname,10);

   printf("sage: ");

   scanf_s("%d", &stu.sage);

   printf("sdept: ");

   scanf_s("%s", &stu.sdept,3);

   ListInsert(L, ListLength(L) + 1, stu);

   break;

  case 2://删除指定学号的学生信息

   printf("input the sno:");

   scanf_s("%s", &stu.sno,4);

   pos = LocateElem(L, stu, equal);

   if (pos > 0)

   {

    ListDelete(L, pos, stu); 

    pos = NULL;

   }

   else

    printf("The student is not exist!\n");

   break;

  case 3://更新指定学号的学生姓名

   printf("input the sno of the student to be updated:");

   scanf_s("%s", &stu.sno,4);

   pos = LocateElem(L, stu, equal); 

   if (pos > 0)

   {

    printf("input the new name:");

    scanf_s("%s", &stu.sname,10);

    GetElem(L, pos, stu_tmp);

    stu.sage = stu_tmp.sage;

    strcpy_s(stu.sdept, stu_tmp.sdept);

    PutElem(L, pos, stu);

    pos = NULL;

   }

   else

    printf("The student is not exist!\n");

   break;

  case 4://查找指定学号的学生信息

   printf("input the sno:");

   scanf_s("%s", &stu.sno,4);

   pos = LocateElem(L, stu, equal);

   if (pos > 0)

   {

    GetElem(L, pos, stu_tmp);

    printf("%s\t%s\t%d\t%s\n", stu_tmp.sno, stu_tmp.sname, stu_tmp.sage, stu_tmp.sdept);

    pos = NULL;

   }

   else

    printf("The student is not exist!\n");

   break;

  case 5: //输出所有学生信息

   ListTraverse(L, visit);

   break;

  case 6: //输出学生数量

   printf("The student count is %d\n", ListLength(L));

   break;

  }

 }

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来给你具介绍一下如何用线性顺序及多种查找方式实现学生宿舍管理系统的数据结构。 首先,我们需要定义两个结构,一个是学生信息结构,一个是宿舍信息结构。它们的定义如下: ```c++ struct Student { string name; // 学生姓名 string id; // 学生学号 int age; // 学生年龄 string gender; // 学生性别 string dormitory; // 学生所住宿舍号 }; struct Dormitory { string dormitory; // 宿舍号 string building; // 所在楼栋 int floor; // 所在楼层 int capacity; // 容纳人数 int occupied; // 已入住人数 }; ``` 接着,我们需要使用顺序来存储学生和宿舍信息。我们可以定义两个顺序,一个用来存储学生信息,一个用来存储宿舍信息。它们的定义如下: ```c++ const int MAXSIZE = 100; // 最大存储容量 struct StudentList { Student data[MAXSIZE]; // 存储学生信息的数组 int length; // 当前存储的学生数 }; struct DormitoryList { Dormitory data[MAXSIZE]; // 存储宿舍信息的数组 int length; // 当前存储的宿舍数 }; ``` 然后,我们需要实现多种查找方式,例如按学号查找学生信息、按宿舍号查找宿舍信息、按楼栋和楼层查找宿舍信息等等。这里我们以按学号查找学生信息为例,给出一个示例代码: ```c++ // 按学号查找学生信息 Student* SearchStudentByID(StudentList L, string id) { for (int i = 0; i < L.length; i++) { if (L.data[i].id == id) { return &L.data[i]; // 返回找到的学生信息 } } return nullptr; // 未找到学生信息 } ``` 最后,我们还需要实现插入学生信息、插入宿舍信息、删除学生信息、删除宿舍信息、修改学生信息、修改宿舍信息等功能。这些功能的具实现需要根据实际需求进行设计和实现。 以上就是用线性顺序及多种查找方式实现学生宿舍管理系统的数据结构的一个简单介绍,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值