1. 程式人生 > >用c語言連結串列寫的一個簡單的學生管理系統

用c語言連結串列寫的一個簡單的學生管理系統

在大學由於在學完c語言之後老師佈置了一個寫學生管理系統的課設我寫了一個簡單的學生管理 系統,話不多說,直接上原始碼。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char subject[6][20];  //用於儲存學科的名字
int Nsubject;         //用於儲存學科的數量
int Nstudent;         //用於儲存學生的數量
char filename[50];    //用於儲存檔案的名字
FILE *FP;             //檔案指標
typedef struct Student
{
    int studentid;     //儲存學號
    char studentname[10];//儲存學生姓名
    double studentscore[6];//儲存學生成績
    struct Student *next; //儲存下一個節點的地址
} Student;
Student *head=NULL;  //定義頭指標
void SaveData();     //此函式用於把連結串列中的資料儲存到檔案
void WriteData();    //此函式用於為新建立的檔案寫資料
void ReadData();     //此函式用於將檔案中的資料讀入連結串列中
void Openfile();     //此函式用於開啟一個檔案
void Append();       //此函式用於新增資料
void ModifyData(Student *p);//此函式用於修改學生的資料
Student* SearchByName();  /*此函式用於按學生姓名查詢並返回地址*/
Student* SearchById();    /*此函式用於按學生學號查詢並返回地址*/
void CreateFile();    /*此函式用於建立一個檔案*/
void Remove();        //此函式用於刪除檔案
void List();           //此函式用列出學生資訊
int Menu();          //選單
void ModifyStudentData();  //此函式用於查詢學生並修改此學生的資訊
void DeletedData();       //此函式用於刪除資料
int Quit();           //此函式用於退出系統
int main( )
{
  while(1)
  {

    switch(Menu())              //選擇函式,實現某種功能
    {
      case 0:if(Quit())return 0;break;
      case 1:Openfile();break;
      case 2:SearchById();break;
      case 3:SearchByName();break;
      case 4:CreateFile();break;
      case 5:Remove();break;
      case 6:Append();break;
      case 7:SaveData();break;
      case 8:DeletedData();break;
      case 9:List();break;
      case 10:ModifyStudentData() ;break;
    }

  }
    return 0;
}
/*此函式用於把連結串列中的資料寫入檔案*/
void SaveData()
{
  fclose(FP);
  FP=fopen(filename,"w");     //改變檔案的開啟方式
  fprintf(FP, "%d %d ",Nstudent,Nsubject);  //向檔案中寫入學生人數和學科數目
  for(int i=0;i<Nsubject;i++)        //有幾門學科執行幾次迴圈
  {
    fprintf(FP,"%s ",subject[i]);   //將學科名寫入檔案
  }
  Student *p;
  while(head)
  {
    if(head->studentid==0)  //學號為0是刪除標記
    {
      p=head->next;
      free(head);
      head=p;
    //  printf("__________________________\n");
      continue;
    }
    fprintf(FP,"%d %s ",head->studentid,head->studentname);//將學號和姓名寫入檔案
    for(int i=0;i<Nsubject;i++)
    {
      fprintf(FP,"%lf ",head->studentscore[i]);//按學科順序依次將分數寫入檔案
    }
    p=head->next;
    free(head);
    head=p;
  }
  fclose(FP);     //關閉檔案
  FP=NULL;
  head=NULL;
  printf("按任意鍵繼續\n");
  getchar();
  getchar();
}
/*此函式用於為新建立的檔案寫資料*/
void WriteData()
{
    printf("請輸入學生的人數:");
    scanf("%d",&Nstudent);
    printf("\n");
    printf("請輸入考試科目的數量:");
    scanf("%d",&Nsubject);
    printf("\n");
    for(int i=0;i<Nsubject;i++)    //有幾門學科迴圈幾次
    {
        printf("請輸入第%d門科目的名稱:",i+1);
        scanf("%s",&subject[i]);
        printf("\n");
    }
    Student *p,*p1;
    for(int i=0;i<Nstudent;i++)    //有幾名學生迴圈幾次
    {
        p=(Student*)malloc(sizeof(Student));      //動態分配記憶體
        printf("請輸入第%d名學生的學號:",i+1);
        scanf("%d",&p->studentid);
        printf("\n");
        printf("請輸入第%d名學生的姓名:",i+1);
        scanf("%s",&p->studentname);
        printf("\n");
        for(int j=0;j<Nsubject;j++)
        {
            printf("請輸入%s的成績:",subject[j]);
            scanf("%lf",&p->studentscore[j]);
            printf("\n");
        }
        if(head==NULL)      //如果頭指標為空指標將資料儲存在頭指標所指向的記憶體單元
        {
            head=p;
            p->next=NULL;
            //head->next=NULL;
            p1=head;
        }
        else
        {
           p1->next=p;
           p->next=NULL;
           p1=p1->next;
        }
    }
    printf("按任意鍵繼續\n");
    getchar();
    getchar();
    return;
}
/*此函式用於將檔案中的資料讀入連結串列中*/
void ReadData()
{
        if(FP==NULL)
        {
          printf("請開啟檔案,按任意鍵繼續");
          getchar();
          getchar();
          return;
        }
        fscanf(FP,"%d%d",&Nstudent,&Nsubject);  //從檔案中讀取學生的人數和學科的數量
        for(int i=0;i<Nsubject;i++)
        {
            fscanf(FP,"%s",&subject[i]);        //從檔案中讀取學科的名字
        }
        Student *p,*p1;
        for(int i=0;i<Nstudent;i++)
        {
            p=(Student*)malloc(sizeof(Student));      //動態分配記憶體
            fscanf(FP,"%d%s",&p->studentid,&p->studentname);
            for(int j=0;j<Nsubject;j++)
            {
                fscanf(FP,"%lf",&p->studentscore[j]);
            }
            if(head==NULL)      //如果頭指標為空指標將資料儲存在頭指標所指向的記憶體單元
            {
                head=p;
                head->next=NULL;
                p1=head;
            }
            else
            {
               p1->next=p;
               p->next=NULL;
               p1=p1->next;
            }
        }
        printf("按任意鍵繼續\n");
        getchar();
        getchar();
}
/*此函式用於開啟一個檔案*/
void Openfile()
{
    if(FP!=NULL)
    {
      printf("已有檔案開啟,請先儲存已開啟的檔案\n");
      printf("按任意鍵繼續\n");
      getchar();
      getchar();
    }
    printf("請輸入你要開啟的檔案的名字:");
    scanf("%s",&filename);
    FP=fopen(filename,"r");
    if(FP==NULL)
    {
        printf("此檔案不存在,按任意鍵繼續\n");
        getchar();
        getchar();
        return;
    }
        ReadData();     //呼叫此函式
        printf("學生的人數為:%d\n",Nstudent);
        printf("按任意鍵繼續\n");
        getchar();
}
/*此函式用於在連結串列後面新增資料*/
void Append( )
{
    if(FP==NULL)
    {
      printf("請開啟一個檔案,按任意鍵繼續\n");
      getchar();
      getchar();
      return ;
    }
        Student *p;
        Student *p1;
        p1=head;
       while(p1->next)
       {
           p1=p1->next;
       }
       printf("輸入要新增學生的人數:\n");
       int n;
       scanf("%d",&n);
       for(int i=0;i<n;i++)
       {    p=(Student*)malloc(sizeof(Student));
            printf("請輸入第%d名學生的學號:",++Nstudent);
            scanf("%d",&p->studentid);
            printf("\n");
            printf("請輸入第%d名學生的姓名:",Nstudent);
            scanf("%s",&p->studentname);
            printf("\n");
            for(int i=0;i<Nsubject;i++)
            {
              printf("請輸入%s的成績:",subject[i]);
              scanf("%lf",&p->studentscore[i]);
              printf("\n");
            }
            p1->next=p;
            p->next=NULL;
            p1=p1->next;
      }
      printf("按任意鍵繼續\n");
      getchar();
      getchar();
}
/*此函式用於修改學生的資料*/
void ModifyData(Student *p)
{
  printf("請輸入學生的新名字\n");
  scanf("%s",&p->studentname);
  printf("請輸入學生的新學號:\n");
  scanf("%d",&p->studentid);
  for(int i=0;i<Nsubject;i++)
  {
    printf("請輸入%s的新成績:\n",subject[i]);
    scanf("%lf",&p->studentscore[i]);
  }
}
/*此函式用於按學生姓名查詢*/
Student* SearchByName()
{
  if(FP==NULL)
  {
    printf("請開啟一個檔案,按任意鍵繼續\n");
    getchar();
    return NULL;
  }
    char name[10];
    printf("請輸入你要查詢學生的名字\n" );
    scanf("%s",&name );
    Student *p;
    p=head;
    while(p)   //當連結串列為空是結束迴圈
    {
      if(p->studentid==0)
      {
        p=p->next;
        continue;
      }
      if(!strcmp(p->studentname,name))   //比較兩個字元陣列,如果形同進入迴圈
      {
        printf("姓名:%s\n",p->studentname);
        printf("學號:%d\n",p->studentid);
        for(int i=0;i<Nsubject;i++)
        {
          printf("%s:%.2lf\n",subject[i],p->studentscore[i]);
        }
        printf("按任意鍵繼續\n");
        getchar();
        getchar();
        return p;
      }
      p=p->next;    //指向連結串列的下一個節點
    }
      printf("沒有查到這名學生\n");
      //printf("按任意鍵繼續\n");
      return p;
}
/*此函式用於按學生學號查詢*/
Student* SearchById()
{
  if(FP==NULL)
  {
    printf("請開啟一個檔案,按任意鍵繼續\n");
    getchar();
    return NULL;
  }
    int id;
    printf("請輸入你要查詢學生的學號\n" );
    scanf("%d",&id );
    Student *p;
    p=head;
    while(p)
    {
      if(p->studentid==0)  //學號為零是刪除標記
      {
        p=p->next;
        continue;
      }
      if(p->studentid==id)  //如果學號相同進入迴圈
      {
        printf("姓名:%s\n",p->studentname);
        printf("學號:%d\n",p->studentid);
        for(int i=0;i<Nsubject;i++)
        {
          printf("%s:%.2lf\n",subject[i],p->studentscore[i]);
        }
       printf("按任意鍵繼續\n");
        getchar();
        getchar();
        return p;
      }
      p=p->next;
    }
    printf("沒有查到這名學生\n");
    //printf("按任意鍵繼續\n");
    return p;
}
/*此函式用於建立一個檔案*/
void CreateFile()
{
  if(head!=NULL)
  {
    printf("還有資料未儲存,請儲存,按任意鍵繼續");
    getchar();
    return;
  }
  printf("請輸入要建立的檔案的名字:");
  scanf("%s",&filename);
  FP=fopen(filename,"w");
  WriteData();   //呼叫此函式

}
void Remove()//此函式用於刪除檔案
{
  printf("輸入要刪除的檔名\n");
  scanf("%s",&filename);
  remove(filename);        //刪除檔案
  printf("按任意鍵繼續\n");
  getchar();
  getchar();
}
void List()//此函式用列出學生資訊
{
  if(FP==NULL)
  {
    printf("請開啟檔案,按任意鍵繼續\n");
    getchar();
    getchar();
    return ;
  }
    Student *p;
    p=head;
    while(p)       //當連結串列為空是結束迴圈
    {
      if(p->studentid==0)
      {
        p=p->next;
        continue;
      }
      printf("學生姓名:%s\n",p->studentname);
      printf("學號:%d\n",p->studentid);
      for(int i=0;i<Nsubject;i++)
      {
        printf("%s:%.2lf\n",subject[i],p->studentscore[i]);
      }
      printf("+++++++++++++++++++++++++++++++++++++++++\n");
      p=p->next;
    }
    printf("按任意鍵繼續\n");
    getchar();
    getchar();
 }
 void ModifyStudentData()  //此函式用於查詢學生並修改此學生的資訊
 {
   int a;
   Student *p;
   printf("\t1按學號查詢\n");
   printf("\t2按姓名查詢\n");
   scanf("%d",&a);
   if(a==1)
   {
     p=SearchById();  //呼叫此函式並返回查詢到資料的連結串列節點地址
     ModifyData(p);   //執行此函式,修改此節點上的資料
   }
   else
   {
     p=SearchByName(); //呼叫此函式並返回查詢到資料的連結串列節點地址
     ModifyData(p);     //執行此函式,修改此節點上的資料
   }
   printf("按任意鍵繼續\n");
   getchar();
   getchar();
 }
 int Menu()//選單
 {
     system("cls");
     printf("\n\n\n\n\n");//輸入回車,形成格式;
     printf("\t\t\t|...........學生管理系統..............|\n");
     printf("\t\t\t|1.開啟檔案\n");
     printf("\t\t\t|2.按學號查詢學生\n");
     printf("\t\t\t|3.按姓名查詢學生\n");
     printf("\t\t\t|4.建立檔案\n");
     printf("\t\t\t|5.刪除檔案\n");
     printf("\t\t\t|6.新增資料\n");
     printf("\t\t\t|7.儲存\n");
     printf("\t\t\t|8.刪除學生資訊\n");
     printf("\t\t\t|9.列出學生資訊\n");
     printf("\t\t\t|10.修改學生資訊\n");
     printf("\t\t\t|0.退出\n");
     printf("\t\t\t|.....................................|\n");
     int choice;
     if(scanf("%d",&choice)!=1||choice<0||choice>10)
     {
         printf("請輸入0~10任意一個數字\n");
    }
     else
    {
     return choice;
   }
 }
 void DeletedData()       //此函式用於刪除資料
 {
   Student *p;
   ///p1=(Student*)malloc(sizeof(Student));
   printf("\t1按學號查詢\n");
   printf("\t2按姓名查詢\n");
   int a;
   scanf("%d",&a);
   if(a==1)
     p=SearchById();
   else
     p=SearchByName();
     if(p==NULL)
     {
       printf("按任意鍵繼續\n");
       getchar();
       getchar();
       return;
     }
     printf("是否確認刪除?y/n\n");
     char b[1];
     scanf("%s",&b);
     if(b[0]=='y'||b[0]=='Y')
     {
       p->studentid=0;
       Nstudent--;
     }

 printf("按任意鍵繼續\n");
 getchar();
 getchar();
 }
 int Quit()    //此函式用於退出操作;
{
  if(FP!=NULL)
  {
    printf("還有檔案未儲存請先儲存檔案\n");
    printf("按任意鍵繼續\n");
    getchar();
    getchar();
    return 0;
  }
  else
  return 1;
}

相關推薦

c語言連結串列一個簡單學生管理系統

在大學由於在學完c語言之後老師佈置了一個寫學生管理系統的課設我寫了一個簡單的學生管理 系統,話不多說,直接上原始碼。 #include<stdio.h> #include<stdlib.h> #include<string.h> char

一步一步教你從零開始C語言連結串列---構建一個連結串列

為什麼要學習連結串列? 連結串列主要有以下幾大特性: 1、解決陣列無法儲存多種資料型別的問題。 2、解決陣列中,元素個數無法改變的限制(C99的變長陣列,C++也有變長陣列可以實現)。 3、陣列移動元素的過程中,要對元素進行大範圍的移動,很耗時間,效率也不高。

連結串列實現一個簡單學生操作管理系統C語言

#include <stdio.h> #include <math.h> #include <string.h> #include <malloc.h> #include <stdlib.h> #def

從零開始的c語言連結串列學習 001--建立一個簡單基礎的連結串列

因為各種原因,儘管c語言期末考也拿了八十多分,卻仍然對連結串列處在完全甍逼的狀態,以至於之後的資料結構課聽天書,實驗課做不出來,於是決定重學一波連結串列的知識,特此記錄筆記 001—建立一個簡單的連結串列 1.1 認識連結串列 所謂連結串列,一言蔽之就是一連串帶

C語言連結串列簡單教程

筆者作為一名C語言的初學者,在剛接觸連結串列時,幾乎找不到教程能用很通俗易懂的語言去講解連結串列。大多數時候找到的關於連結串列的教程,或許是生硬的塞給讀者一大段程式碼,或許是使用了一些過於專業的詞彙,對於萌新非常地不友好。這就是我寫這篇教程的原因。好吧,即使這篇教程會相對簡單

一個實用性很廣的C語言連結串列例項 [轉]

連結串列的c語言實現(一) 準備:動態記憶體分配 一、為什麼用動態記憶體分配 但我們未學習連結串列的時候,如果要儲存數量比較多的同類型或同結構的資料的時候,總是使用一個數組。比如說我們要儲存一個班級學生的某科分數,總是定義一個float型(存在0.5分)陣列: float

shell一個簡單的告警系統

shell用shell寫一個簡單的告警系統 創建目錄結構 mkdir -p /usr/local/sbin/mon/{bin,conf,shares,mail,log} mon //主目錄 bin //主程序目錄 shares //子程序目錄 mail //發郵件目錄 log //日誌目錄 程序主入

C語言連結串列(超詳細)

前言:之前學習連結串列的時候總會遇到一些問題 也看了好多人的文章感覺有些不是太實用 然後後來也是自己摸索才大概寫出來的. 在真正的開發中會把連結串列的增刪改查寫到函式裡 但是刪除有點麻煩 找了很多都是刪除第幾個 而不是刪除某個值對應的節點 讓我很難受 所以想寫一些連結串列的操作分享

使用C語言連結串列實現商品管理系統

#include <stdio.h> #include <stdlib.h> #include <windows.h> #define bool char #define true 1 #define false 0 #define NUM 1

5 種排序演算法--C語言連結串列

原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure/blob/master/sortIn5.c 包括: 氣泡排序 快速排序 選擇排序 插入排序 希爾排序 執行: 注意:

c語言連結MySQL資料庫出現Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

這個問題,困擾了我好幾天,最後終於解決了。首先,我用find命令找了半天,也只有/tmp/mysql.sock,當時我很崩潰啊,後來看到一篇文章,我忘了地址,讓我有感,於是解決了這個問題。 1、在/var/run/目錄下建立一個mysqld的資料夾(如果這個資料夾沒有的話)。 sudo

1870 Problem B C語言-連結串列排序

問題 B: C語言-連結串列排序 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 86  解決: 71 [提交][狀態][討論版][命題人:外部匯入] 題目描述 已有a、b兩個連結串列,每個連結

C語言連結串列的建立插入等綜合實戰

系本人原創,轉載請註明出處: 程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶, 先放上鍊表的結構體: typedef struct stud

C語言連結串列節點插入與刪除

線性表操作 順序表是我們資料結構中的基本儲存形式,現在給定一個順序表,有如下操作: Insert X Y:在順序表中X位置插入Y元素,遍歷輸出當前順序表的所有元素。 Delete X:刪除順序表中的X元素,如果有多個X元素,只刪除第一個X,遍歷輸出當前順序的所有

C語言連結串列:遍歷,頭插,尾插,中間插入;頭節點刪除,尾節點刪除,中間刪除的操作

/****************************************************************************************************************************************

C語言實現:輸入一個字元,則輸出它的大小或小寫字元。

題目: 用C語言實現:連續輸入一個大寫字元則輸出它的小寫字元;輸入它的小寫字元則輸出它的大寫字元;輸入數字則不輸出任何。 思路: 題目說輸入字元或數字,輸入的格式不一樣,所以不可以使用scanf()那麼可以用getchar()連續輸入多個字元. 既然是連續輸入,

C語言連結串列多項式的加法

6-3 Add Two Polynomials (20 point(s)) Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation

初學javaeeservlet一個簡單的登陸系統

使用 servlet編寫一個登陸網頁 首先第一步是將靜態網頁寫好,這裡面涉及一點html的知識 裡面核心的內容是一個input複選框的使用 <td class="controler"><input type="password" name="m

C語言連結串列的5種常見操作

C語言連結串列的5種常見操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第n個結點 求連結串列的中間結點 Ref typedef struct list{ int i

C語言 連結串列的建立,插入,刪除,列印

#include <stdio.h> #include <stdlib.h> #include <memory.h> //結構體定義 struct Node{ char name[10]; int score; s