學生管理系統(通過順序表,獲取連續堆區空間實現)

將學生的信息,以順序表的方式存儲(堆區),并且實現封裝函數 :

1】順序表的創建,

2】判滿、

3】判空、

4】往順序表里增加學生信息、

5】遍歷學生信息

6】任意位置插入學生信息

7】任意位置刪除學生信息

8】修改學生信息

9】查找(按學生的學號查找)、

10】刪除重復學生信息

11】銷毀順序表

主函數main.c?

#include "stu.h"                                               
int main()                                                     
{                                                              int i;                                                     stu_p S = stu_create();                                    if(NULL == S)                                              return 0;                                              else                                                       {                                                          do                                                     {                                                      printf("1.添加學生信息\t");                        printf("2.遍歷學生信息\t");                        printf("3.插入學生信息\t");                        printf("4.刪除學生信息\n");                        printf("5.查找學生信息\t");                        printf("6.修改學生信息\t");                        printf("7.刪除重復信息\t");                        printf("8.退出信息系統\n");                        printf("請輸入選項:");                            scanf("%d", &i);                                   switch(i)                                          {                                                  case 1:stu_add(S);break;                           case 2:stu_show(S);break;                          case 3:stu_insert(S);break;                        case 4:stu_delet(S);break;                         case 5:stu_find(S);break;                          case 6:stu_change(S);break;                        case 7:stu_repeatdel(S);break;                     case 8:stu_free(S);printf("已退出\n");break;       default:printf("沒有這個選項,請重新選擇");        }                                                  }while(8 != i);                                        }                                                          return 0;                                                  
}                                                              

?功能函數stu.c

#include"stu.h"                                //申請順序表空間                               
stu_p stu_create()                             
{                                              //申請數據結構大小的堆空間                 stu_p S = (stu_p)malloc(sizeof(stu));      if(NULL == S)                              {                                          printf("申請順序表失敗");              return NULL;                           }                                          memset(S -> name, 0, sizeof(S -> name));   memset(S -> id, 0, sizeof(S -> id));       S -> len = 0;                              printf("申請順序表成功\n");                return S;                                  
}                                              //添加學生信息                                 
void stu_add(stu_p S)                          
{                                              if(stu_full(S))                            {                                          printf("滿\n");                        return;                                }                                          printf("請輸入學生姓名:");                 scanf("%s", S -> name[S -> len]);          printf("請輸入學生id:");                   scanf("%d", &S -> id[S -> len]);           S -> len++;                                stu_show(S);                               
}         
//位插信息                                         
void stu_insert(stu_p S)                           
{                                                  if(stu_full(S))                                {                                              printf("滿\n");                            return;                                    }                                              printf("請輸入要插入的位置:");                int in;                                        scanf("%d", &in);                              if(in > S -> len || in <= 0 || in > MAX)       {                                              printf("所選位置錯誤\n");                  return;                                    }                                              //將插入的位置空出來                           for(int i = S -> len; i >= in; i--)            {                                              S -> id[i] = S -> id[i - 1];               strcpy(S -> name[i], S -> name[i - 1]);    }                                              printf("請輸入學生姓名:");                     scanf("%s", S -> name[in - 1]);                printf("請輸入學生id:");                       scanf("%d", &S -> id[in - 1]);                 S -> len++;                                    stu_show(S);                                   
}                                                  //位刪信息                                       
void stu_delet(stu_p S)                          
{                                                if(stu_null(S))                              {                                            printf("空\n");                          return;                                  }                                            printf("請輸入要刪除的位置:");              int in;                                      scanf("%d", &in);                            if(in > S -> len || in <= 0)                 {                                            printf("所選位置錯誤\n");                return;                                  }                                            for(int i = in - 1; i < S -> len; i++)       {                                            S -> id[i] = S -> id[i + 1];             strcpy(S -> name[i], S -> name[i + 1]);  }                                            S -> len--;                                  stu_show(S);                                 
}                                                
//位改                                 
void stu_change(stu_p S)               
{                                      if(stu_null(S))                    {                                  printf("空\n");                return;                        }                                  printf("請輸入要修改的位置:");    int in;                            scanf("%d", &in);                  if(in > S -> len || in <= 0)       {                                  printf("所選位置錯誤\n");      return;                        }                                  printf("請輸入學生姓名:");         scanf("%s", S -> name[in - 1]);    printf("請輸入學生id:");           scanf("%d", &S -> id[in - 1]);     stu_show(S);                       
}                                      
//查找學生信息                                                                     
void stu_find(stu_p S)                                                             
{                                                                                  if(stu_null(S))                                                                {                                                                              printf("空\n");                                                            return;                                                                    }                                                                              printf("請輸入學生的ID:");                                                    int ID, i = 0;                                                                 scanf("%d", &ID);                                                              do                                                                             {                                                                              if(S -> id[i] == ID)                                                       {                                                                          printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]);        return;                                                                }                                                                          i++;                                                                       }while(i <= S -> len);                                                         printf("沒有這個學生\n");                                                      }                                                                                  
//刪重                                                           
void stu_repeatdel(stu_p S)                                      
{                                                                if(stu_null(S))                                              {                                                            printf("空\n");                                          return;                                                  }                                                            for(int i = 0; i < S -> len; i++)                            {                                                            //遍歷后面的值                                           for(int j = i + 1; j < S -> len; j++)                    {                                                        //重復的進行刪除                                     if(S -> id[i] == S -> id[j])                         {                                                    for(int k = j; k < S -> len; k++)                {                                                S -> id[k] = S -> id[k + 1];                 strcpy(S -> name[k], S -> name[k + 1]);      }                                                S -> len--;                                      j--;//對刪除后位置的值進行重新對比               }                                                    }                                                        }                                                            stu_show(S);                                                 
}                                                                //釋放堆空間                                                     
void stu_free(stu_p S)                                           
{                                                                free(S);                                                     S = NULL;                                                    
}                                                                
//判空                                                                  
int stu_null(stu_p S)                                                   
{                                                                       return 0 == S -> len;                                               
}                                                                       //判滿                                                                  
int stu_full(stu_p S)                                                   
{                                                                       return MAX == S -> len;                                             
}                                                                       //回顯順序表                                                            
void stu_show(stu_p S)                                                  
{                                                                       if(stu_null(S))                                                     {                                                                   printf("空\n");                                                 return;                                                         }                                                                   printf("——————————————\n");                                         for(int i = 0; i < S -> len; i++)                                   printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); printf("——————————————\n");                                         
}                                                                       

?功能函數頭文件stu.h

#ifndef __STU_H__
#define __STU_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX 8typedef struct student
{char name[MAX][24];int id[MAX];int len;
}stu, *stu_p;stu_p stu_create();
int stu_full(stu_p S);
int stu_null(stu_p S);
void stu_add(stu_p S);
void stu_show(stu_p S);
void stu_insert(stu_p S);
void stu_delet(stu_p S);
void stu_change(stu_p S);
void stu_find(stu_p S);
void stu_repeatdel(stu_p S);
void stu_free(stu_p S);
#endif                                   

?實現效果

申請順序表成功
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:1
——————————————
[1]姓名:1	ID:1
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:2
請輸入學生id:2
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:3
請輸入學生id:3
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:4
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:1	ID:4
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:5
請輸入學生的ID:4
[4]姓名:1	ID:4
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:6
請輸入要修改的位置:4
請輸入學生姓名:4
請輸入學生id:4
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:5
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:1
請輸入學生姓名:1
請輸入學生id:1
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
[6]姓名:1	ID:1
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:7
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
——————————————
1.添加學生信息	2.遍歷學生信息	3.插入學生信息	4.刪除學生信息
5.查找學生信息	6.修改學生信息	7.刪除重復信息	8.退出信息系統
請輸入選項:8
已退出

一個學生信息還可封裝在一個學生結構體中,使用順序結構體嵌套學生結構體。

此方法在一個學生的信息較多時可以使用,方便學生信息覆蓋時代碼的書寫。

?

  • 順序表

    • 順序存儲的線性表

    • 實現存儲的方式

      • 使用數組存儲元素,實現邏輯上相連,物理內存也相連

      • 使用malloc在堆區申請一片連續的空間,來存放邏輯相連的數據

    • 順序表的組成

      • 需要有一個能夠存儲數據元素的容器,可以是數組,也可以是連續的堆區空間

      • 還需有一個變量來記錄當前順序表的長度(存儲元素的個數)

    • 順序表的結構體原型

      • typedef struct sequence { int data[max];//元素 int len;//長度 }seq, *seq_p; //類型重定義結構體,結構體指針

      • 結構體使用.引出結構體變量 結構體指針使用->引出結構體變量

    • 順序表的相關函數操作

      • 創建順序表

        • 在堆區申請空間,返回給main使用

        • 函數返回值類型:順序表類型的指針

        • 函數名:符合命名規則

        • 參數列表:無

        • 注意事項

          • 申請堆區空間后,判斷是否成功

          • 申請成功后,需要將順序表的長度(為0)和數組初始化

      • 判滿

        • 函數功能

          • 判斷順序表存儲空間是否存滿,即len == max

        • 函數返回值

          • 邏輯判斷,存滿返回1,不滿返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

      • 判空

        • 函數功能

          • 判斷順序表是否為空(即len是否為0)

        • 函數返回值

          • 邏輯判斷,為空返回1,有元素返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

      • 數據存儲

        • 函數功能

          • 將數據存入順序表

        • 函數返回值

          • 邏輯值:成功返回1,失敗返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

        • 注意事項

          • 判斷順序表是否為滿

      • 遍歷

        • 函數的功能

          • 依次打印輸出順序表里的數據

        • 函數返回值

          • void

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

        • 注意事項

          • 判斷順序表是否為空

      • 按位置插入

        • 函數的功能

          • 輸入位置和數據存入數據表

        • 函數返回值

          • 邏輯值:成功返回1,失敗返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

          • 函數內部需要外部傳參插入位置和存入數據

        • 注意事項

          • 判斷順序表是否為滿

          • 插入位置是否合理

      • 按位置刪除

        • 函數的功能

          • 輸入位置將數據表中對應的數據刪除

        • 函數返回值

          • 邏輯值:成功返回1,失敗返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

          • 函數內部需要外部傳參刪除位置

        • 注意事項

          • 判斷順序表是否為空

          • 刪除位置是否合理

      • 修改數據

        • 函數的功能

          • 輸入位置將數據表中對應的數據修改

        • 函數返回值

          • 邏輯值:成功返回1,失敗返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

          • 函數內部需要外部傳參修改位置

        • 注意事項

          • 判斷順序表是否為空

          • 修改位置是否合理

      • 查找數據

        • 函數的功能

          • 輸入數據查找對應的數據的位置

        • 函數返回值

          • 找到返回位置,找不到返回0

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

          • 函數內部需要外部傳參數據

        • 注意事項

          • 判斷順序表是否為空

      • 去重

        • 函數的功能

          • 刪除重復數據

        • 函數返回值

          • void

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

        • 注意事項

          • 判斷順序表是否為空

      • 銷毀

        • 函數的功能

          • 釋放堆空間

        • 函數返回值

          • void

        • 函數名

          • 符合命名規則

        • 參數列表

          • 順序表(傳順序表的地址)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42625.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

0301STM32GPIO外設輸出

STM32GPIO外設輸出 STM32內部的GPIO外設GPIO簡介基本結構GPIO位結構輸入部分&#xff1a;輸出部分&#xff1a; GPIO八種工作模式浮空/上拉/下拉輸入模擬輸入開漏/推挽輸出復用開漏/推挽輸出 手冊寄存器描述GPIO功能描述外設的GPIO配置GPIO寄存器描述端口輸入數據寄存器端口輸出…

QT入門筆記-自定義控件封裝 30

具體代碼如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(還有反集也在)

一.定義 定義&#xff1a; 并查集是一種樹型的數據結構&#xff0c;用于處理一些不相交集合的合并及查詢問題&#xff08;即所謂的并、查&#xff09;。比如說&#xff0c;我們可以用并查集來判斷一個森林中有幾棵樹、某個節點是否屬于某棵樹等。 主要構成&#xff1a; 并查集…

PHP-實例-文件上傳

1 需求 2 basename 在 PHP 中&#xff0c;basename() 函數用于返回路徑中的文件名部分。如果路徑中包含了文件擴展名&#xff0c;則該函數也會返回它。如果路徑的結尾有斜杠&#xff08;/&#xff09;或反斜杠&#xff08;\&#xff09;&#xff0c;則 basename() 函數會返回空…

Android計算器界面的設計——表格布局TableLayout實操

目錄 任務目標任務分析任務實施 任務目標 使用TextView、Button等實現一個計算器界面&#xff0c;界面如圖1所示。 圖1 計算器界面效果圖 任務分析 界面整體使用表格布局&#xff0c;第一行使用一個TextView控件&#xff0c;橫跨4列&#xff0c;中間4行4列&#xff0c;最后一…

Laravel HTTP客戶端:網絡請求的瑞士軍刀

標題&#xff1a;Laravel HTTP客戶端&#xff1a;網絡請求的瑞士軍刀 Laravel的HTTP客戶端是一個功能強大的工具&#xff0c;它提供了一種簡潔、直觀的方式來發送HTTP請求。無論是與外部API集成&#xff0c;還是進行網絡數據抓取&#xff0c;Laravel的HTTP客戶端都能滿足你的需…

小紅書選品中心商家采集 小紅書商家電話采集軟件

可采集名稱銷量評分聯系方式等 需要有1000粉絲以上已實名認證過的小紅書達人才可以使用 以下是一個示例程序&#xff0c;可以用于批量獲取小紅書選品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop為源創建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切換到遠程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #刪除當前目錄下沒有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相關三個參數 thread reset 就可以默認 instance_number 需要單獨設置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代碼腳本文件&#xff1a;transformer.py。版本&#xff1a;1.9.1cu111。 首先查看《Torch中多頭注意力MultiheadAttention的中文注釋》解析&#xff1b; 最后查看下方transformer解析。 話不多說&#xff0c;看代碼吧&#xff01; import copy from typing imp…

Vue的學習之class與style綁定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的學習</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通過幾種不同的方式完成&#xff0c;但最常用的方法是使用find成員函數。std::map是一個基于鍵值對的關聯容器&#xff0c;其中每個元素都是一個鍵值對。鍵是唯一的&#xff0c;并且用于排序和快速查找。 使用find成員函數 find成員函數接受一個鍵作…

io流 多線程

目錄 一、io流 1.什么是io流 2.流的方向 i.輸入流 ii.輸出流 3.操作文件的類型 i.字節流 1.拷貝 ii.字符流 ?3.字符流輸出流出數據 4.字節流和字符流的使用場景 5.練習 6.緩沖流 1.字節緩沖流拷貝文件 2.字符緩沖流特有的方法 1.方法 2.總結 7.轉換流基本用法…

第2集《修習止觀坐禪法要》

請打開補充講表第一面&#xff0c;附表一、念佛攝心方便法。 我們前面講到修止&#xff0c;就是善取所緣境的相貌&#xff0c;然后心于所緣&#xff0c;專一安住&#xff1b;心于所緣&#xff0c;相續安住&#xff1b;達到心一境性的目的。 站在修學凈土的角度&#xff0c;他…

FastAPI+SQLAlchemy數據庫連接

FastAPISQLAlchemy數據庫連接 目錄 FastAPISQLAlchemy數據庫連接配置數據庫連接創建表模型創建alembic遷移文件安裝初始化編輯env.py編輯alembic.ini遷移數據庫 視圖函數查詢 配置數據庫連接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…

9、程序化創意

程序化創意 程序化創意&#xff08;Programmatic Creative&#xff09;是指通過自動化的方式制作并優化廣告創意&#xff0c;以提高廣告效果。針對不同受眾的多樣化需求&#xff0c;以及同一受眾在不同場景下的消費需求&#xff0c;程序化創意能夠自動生成個性化的精準創意&am…

《C語言》預處理

文章目錄 一、預定義符號二、#define定義常量三、#define定義宏四、宏更函數的對比五、#和##1、#運算符2、##運算符 一、預定義符號 C語言設置了一些預定義符號&#xff0c;可以直接使用&#xff0c;在預處理期間進行處理的。 __FILE__//進行編譯的源文件 __LINE__//文件當前的…

在網站存在漏洞的情況下強化安全防御

一、引言 網絡安全是一個持續的戰斗&#xff0c;尤其是在網站存在已知或未知漏洞的情況下。本文將探討如何在網站存在漏洞的情況下&#xff0c;采取有效措施進行安全防御。 二、理解漏洞 首先&#xff0c;我們需要理解網站的漏洞。這些可能包括SQL注入、跨站腳本&#xff08…

【數據結構與算法】插入排序

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;《數據結構與算法》 期待您的關注 ?

深入Laravel服務容器:構建靈活應用的秘訣

標題&#xff1a;深入Laravel服務容器&#xff1a;構建靈活應用的秘訣 Laravel框架的服務容器是一個強大的工具&#xff0c;它負責管理類的依賴關系和執行依賴注入&#xff08;DI&#xff09;。服務容器是Laravel依賴注入系統的核心&#xff0c;使得應用組件之間的耦合度降低&…