資料結構課程設計——學生資訊管理系統
程式區:
stud.h
#ifndef _TEST
#define _TEST
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(struct Student)
struct Student //學生資訊的結構體宣告
{
unsigned int num; //記錄學號
char grade[10]; //記錄年級
char name[20]; //記錄姓名
char born[20]; //記錄出生年月
char sex[10]; //記錄性別
char poli[20]; //記錄政治面貌
char phone[20]; //記錄聯絡電話
char addr[100]; //記錄家庭住址
struct Student *next; //指向下一個結構體的指標
};
//******************對各功能函式的宣告***************************
void show(); //顯示函式的宣告
struct Student *input(); //新建學生資訊的函式宣告
struct Student *insert(struct Student *head,struct Student *stu); //插入學生資訊的函式宣告
struct Student *del(struct Student *head); //刪除學生資訊的函式宣告
void alter(struct Student *head); //修改學生資訊的函式宣告
void search(struct Student *head,unsigned int num); //查詢學生資訊的函式宣告
void output(struct Student *head); //儲存學生資訊的函式宣告
#endif
stud.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include"stud.h"
extern struct Student *head = NULL;
extern unsigned int kg = 0;
void show()
{
int n,z = 1,k = 0;
char cho;
do
{
//***********顯示提示資訊**********
printf(" 學生資訊管理系統 \n");
printf(" \n");
printf(" 1.新建學生資訊 2.插入學生資訊 \n"); //顯示序號1的功能
printf(" \n"); //顯示序號2的功能
printf(" 3.刪除學生資訊 4.修改學生資訊 \n"); //顯示序號3的功能
printf(" \n"); //顯示序號4的功能
printf(" 5.查詢學生資訊 6.儲存學生資訊 \n"); //顯示序號5的功能
printf(" \n"); //顯示序號6的功能
printf(" 0.退出系統 \n"); //顯示序號0的功能
printf(" \n");
//********************************
printf(" 請輸入功能序號: "); //提示使用者輸入
while(!scanf("%d",&n)) //接受使用者輸入的功能序號,並且進行排錯
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin); //清空輸入緩衝區,通常是為了確保不影響後面的資料讀取
}
printf("\n"); //輸出回車
while((n < 0 || n > 6)) //對使用者輸入不能實現的功能序號進行處理
{
printf(" 抱歉,沒有此功能,請重新輸入功能序號: "); //提示使用者所輸入的功能序號系統不能進行處理
fflush(stdin);
while(!scanf("%d",&n)) //接收使用者重新輸入的功能序號
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin);
}
printf("\n"); //輸出回車
}
switch(n) //對使用者資訊進行功能函式的呼叫
{
case 0:
{
printf(" ");
if (k == 1) //對於沒有對資料進行存檔的情況進行對使用者提示以確認是否退出
{
printf("資料未儲存,是否退出? Y.是 N.否 請選擇: ");
fflush(stdin);
cho = getchar();
if (cho == 'y' || cho == 'Y')
{
z = 0;
printf(" ");
}
else if (cho == 'n' || cho == 'N')
{}
else
{
printf(" 無效輸入\n ");
system("pause");
}
}
else
{
z = 0;
}
break;
}
case 1:
{
head = input();
k = 1;
system("pause");
break;
}
case 2:
{
head = insert(head,NULL);
k = 1;
printf(" 成功插入學生資訊\n ");
system("pause");
break;
}
case 3:
{
head = del(head);
k = 1;
printf(" ");
system("pause");
break;
}
case 4:
{
alter(head);
break;
}
case 5:
{
if (head == NULL) k = 1;
search(head,0);
printf(" ");
system("pause");
break;
}
case 6:
{
k = 0;
output(head);
break;
}
}
}while(z == 1);
}
//***************************************************************
struct Student *input()
{
struct Student *p1,*p2; //尾插法
unsigned m,n,i;
FILE *read;
char filename[20];
head = NULL;
printf (" 請輸入學生人數: ");
while (!scanf("%u",&n)) //接收錄入學生資訊的人數,並對輸入有誤的進行排除
{
printf(" 輸入有誤,請重新輸入學生人數: ");
fflush(stdin);
}
if (n == 0) //對錄入人數為0的情況進行處理
{
printf(" 學生個數為0人,建立失敗\n ");
return (head);
}
head = p2 = p1 = (struct Student *) malloc (LEN); //開闢記憶體,用於生成連結串列
printf(" 學生個數為:%u個,請按照以下順序輸入\n",n); //對學生總數的提示,並且提示每個學生資訊的輸入順序
printf(" 學號、年級、姓名、出生年月、性別、政治面貌、聯絡電話、家庭住址\n"); //每個學生資訊的輸入順序
for(i = 0; i < n; i++)
{
printf(" 請輸入第%u個學生資訊!\n",i+1); //提示接下來要輸入第幾個學生的資訊
printf(" "); //格式調整,輸出三個空格
fflush(stdin);
while(!scanf("%d %s %s %s %s %s %s %s",&p2->num,p2->grade,p2->name,p2->born,p2->sex,p2->poli,p2->phone,p2->addr))
{
printf(" 輸入有誤,請重新輸入該學生資訊\n ");
fflush(stdin);
}
if (n == 1) //對錄入人數為1時的情況進行處理
{
p2->next = NULL;
}
else //對錄入人數大於1的情況進行錄入,並在錄入時進行排序,每錄入一位學生資訊就開闢一個記憶體空間,用於下一個學生的錄入
{
head = insert(head,p2);
p2 = (struct Student *) malloc (LEN);
}
}
printf(" 成功錄入學生資訊,並且學生資訊已經按學號從小到大排列\n");
printf(" 學生資訊如下: \n");
search(head,1); //以表格的形式顯示所錄入的學生資訊
printf(" ");
return head; //返回*head指標的地址
}
struct Student *insert(struct Student *head,struct Student *stu) //插入學生資訊功能函式定義
{
struct Student *p1,*p2;
if (stu == NULL) //對於傳入插入學生資訊為空時要求使用者輸入插入的學生資訊
{
printf(" 請按照學號、年級、姓名、出生年月、性別、政治面貌、聯絡電話、家庭住址的順序輸入\n "); //每個學生資訊的輸入順序
stu = (struct Student *) malloc (LEN);
while(!scanf("%d %s %s %s %s %s %s %s",&stu->num,stu->grade,stu->name,stu->born,stu->sex,stu->poli,stu->phone,stu->addr))
{
printf(" 輸入資訊有誤,請重新輸入\n");
fflush(stdin);
}
}
if (head == NULL) //對於連結串列為空的情況的處理
{
head = stu;
head->next = NULL;
}
else //在連結串列中插入學生資訊
{
p1 = p2 = head;
while(stu->num > p2->num && p1->next != NULL) //查詢適合位置的前一個學生
{
p2 = p1;
p1 = p1->next;
}
if (p2 == p1) //插入的學生正好為連結串列頭的情況
{
if (stu->num < p2->num) //插入在表頭前
{
head = stu;
stu->next = p2;
}
else //插入在表頭後
{
p2->next = stu;
stu->next = NULL;
}
}
else //插入的學生在連結串列中的情況
{
if (stu->num < p1->num) //插入到p1指向的學生前
{
p2->next = stu;
stu->next= p1;
}
else //插入到p1指向的學生後
{
p1->next = stu;
stu->next = NULL;
}
}
}
kg = 1;
return(head);
}
struct Student *del(struct Student *head) //刪除學生資訊的功能函式定義
{
unsigned int num,k;
struct Student *p1,*p2;
if (head == NULL) //對空連結串列刪除的情況處理
{
printf(" 沒有學生資訊,結束刪除\n");
return(head);
}
printf(" 請輸入要刪除的學生學號: "); //求使用者輸入要刪除的學生學號
while(!scanf("%u",&num)) //接收學生序號並進行排錯處理
{
printf(" 輸入有誤,請重新輸入學生序號: ");
fflush(stdin);
}
do
{
p1 = p2 = head;
while(num != p1->num && p1->next != NULL) //查詢刪除位置的前一個學生
{
p2 =p1;
p1= p1->next;
}
if (num == p1->num) //對滿足要求的學生進行刪除
{
if (num == p1->num)
{
if (p1->next == NULL && p1 == head) //對只有一個節點的連結串列進行刪除
{
free(p1);
head = NULL;
}
else if (p1->next == NULL) //刪除連結串列尾節點
{
free(p1);
p2->next = NULL;
}
else if (head == p1) //刪除表頭節點
{
head = p1->next;
free(p1);
}
else //刪除表中節點
{
p2->next = p1->next;
free(p1);
}
}
printf(" 成功刪除學生資訊\n"); //提示刪除成功資訊
}
else //找不到要刪除的學生時的提示
{
printf(" 找不到該同學資訊\n");
fflush(stdin);
}
if (head == NULL) //對空連結串列刪除時的處理
{
printf(" 沒有學生資訊,結束刪除\n");
return(head);
}
else //提示使用者刪除後是否繼續
{
printf(" 1.繼續刪除學生資訊\n");
printf(" 2.結束刪除\n");
printf(" 請選擇: ");
while(!scanf("%u",&k)) //接收使用者選擇
{
printf(" 輸入有誤,請重新輸入選擇的序號: ");
fflush(stdin);
}
if (k == 1) //選擇繼續
{
printf(" 請輸入要刪除的學生學號: ");
while(!scanf("%u",&num))
{
printf(" 輸入有誤,請重新輸入學生學號: ");
fflush(stdin);
}
}
else if (k != 2) //對於不是選擇2的繼續迴圈提示
{
k = 1;
}
}
}while(k == 1);
return(head); //返回表頭地址
}
void search(struct Student *head,unsigned int num) //查詢函式的定義
{
unsigned int cho,t = 0;
struct Student *p1;
if (head == NULL) //對查詢空連結串列時的操作
{
printf(" 沒有學生資訊,結束查詢\n");
return;
}
p1 = head;
if (num == 0) //當傳入實參 num = 0 需要接受使用者需要的查詢方式(個別或者全部),不等於0則可以直接查詢個別學生資訊
{
printf(" 1.查詢個別學生資訊\n");
printf(" 2.查詢全部學生資訊\n");
printf(" 請選擇: ");
while(!scanf("%u",&cho)) //對錯誤輸入資料的處理
{
printf(" 輸入有誤,請重新輸入序號: ");
fflush(stdin);
}
while(cho != 1 && cho != 2) //處理不能處理的功能序號
{
printf(" 抱歉,沒有此功能,請重新輸入功能序號: "); //提示不能處理的資訊,並要求使用者重新輸入功能序號
while(!scanf("%u",&cho)) //接收使用者重新輸入的功能序號
{
printf(" 輸入序號有誤,請重新輸入序號: ");
fflush(stdin);
}
printf("\n"); //輸出回車
}
}
else
{
cho = 1; //設定直接查詢個別學生的開關
}
if (kg == 1) //kg(全域性變數)為全部學生查詢的開關 kg = 1 開啟開關由下面直接進行全部學生查詢 kg = 0 關閉開關
{
cho = 2;
}
switch(cho) //查詢類別分支
{
case 1: //查詢個別學生
{
do
{
p1 = head;
if (num == 0 || t == 1)
{
printf(" 請輸入需要查詢的學生學號: ");
while(!scanf("%u",&num))
{
printf(" 輸入有誤,請重新輸入: ");
fflush(stdin);
}
t = 1; //開啟開關,該開關為查詢完畢後 num不能作為該分支的條件(因為以下的操作會改變num的值)而建立的,並且能夠實現當傳入num不等於0時,以下詢問使用者是否繼續的分支就不用執行了
}
else
{
cho = 2; //如果傳入的實參num不等於0 則該 DO WHILE 迴圈只做一次
}
while(p1->num != num) //查詢查詢學生學號
{
if (p1->next == NULL) break;
p1 = p1->next;
}
if (p1->num == num) //查詢成功一表格方式輸出該學生資訊
{
//***********************表格頭部設計************************
printf(" ┃學號┃年級┃ 姓名 ┃出生年月┃性別┃政治面貌┃ 聯絡電話 ┃ 家庭住址 ┃\n");
//**********************************************************
//****************表格主體設計以及資料輸出******************
printf(" ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);
//**********************************************************
//***********************表格頭部設計***********************
//*********************************************************
}
else //查詢不成功,提示使用者找不到該學生
{
printf(" 找不到該學生\n");
}
if (t == 1) //如果傳入的num=0,則此分支有效,詢問使用者是否繼續查詢
{
printf(" 1.繼續查詢\n");
printf(" 2.結束查詢\n");
printf(" 請選擇: ");
while(!scanf("%u",&cho)) //對輸入序號查錯,利用cho = 2時的情況跳出 DO WHILE 迴圈
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin);
}
}
}while (cho == 1);
break;
}
case 2: //查詢全部資訊
{
//***********************表格頭部設計************************
printf(" ┃學號┃年級┃ 姓名 ┃出生年月┃性別┃政治面貌┃ 聯絡電話 ┃ 家庭住址 ┃\n");
//**********************************************************
//****************表格主體設計以及資料輸出******************
while(p1 != NULL)
{
//intf(" ┣━━╋━━╋━━━━╋━━━━╋━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━┫\n");
printf(" ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);
p1 = p1->next;
}
//**********************************************************
//***********************表格頭部設計***********************
//**********************************************************
break;
}
}
if (kg == 1) kg = 0; //關閉查詢全部學生的開關,以便下一次使用
}
void alter(struct Student *head) //修改學生資訊的功能函式定義
{
struct Student *p1,*p2;
unsigned int num,cho,k,l=0;
if (head == NULL) //對空連結串列的處理
{
printf(" 沒有學生資訊,結束脩改\n ");
system("pause");
return;
}
printf(" 請輸入需要修改的學生學號: ");
while(!scanf("%u",&num)) //接受使用者輸入的學號並且進行查錯
{
printf(" 輸入學號有誤,請重新輸入: ");
fflush(stdin);
}
do
{
p2 = p1 = head;
while(p1->num != num) //查詢學生學號
{
if (p1->next == NULL)
break;
p2 = p1;
p1 = p1->next;
}
if (p1->num == num) //查詢成功
{
printf(" 已找到該學生,該學生的資訊為: \n");
search(head,num);
l = 0;
do
{
if (l == 0) //開關,當第一次迴圈時 l=0 執行 IF 語句
printf(" 選擇修改的內容\n");
else
printf(" 序號輸入錯誤,請重新選擇\n");
l = 1; //開啟開關,以在以下操作使用者輸入序號超出範圍時控制上面的分支語句,進而可以更好地向使用者提示資訊
printf(" 1.學號\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(" 請選擇序號: ");
fflush(stdin);
while(!scanf("%u",&cho)) //接受序號並查錯
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin);
}
}while(cho > 9 || cho < 1);
switch(cho) //對序號進行多分支處理
{
case 1:
{
printf(" 請輸入該學生改正的學號資訊: ");
while(!scanf("%u",&p1->num))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 2:
{
printf(" 請輸入該學生改正的年級資訊: ");
while(!scanf("%s",p1->grade))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 3:
{
printf(" 請輸入該學生改正的姓名資訊: ");
while(!scanf("%s",p1->name))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 4:
{
printf(" 請輸入該學生改正的出生年月資訊: ");
while(!scanf("%s",p1->born))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 5:
{
printf(" 請輸入該學生改正的性別資訊: ");
while(!scanf("%s",p1->sex))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 6:
{
printf(" 請輸入該學生改正的政治面貌資訊: ");
while(!scanf("%s",p1->poli))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 7:
{
printf(" 請輸入該學生改正的聯絡電話資訊: ");
while(!scanf("%s",p1->phone))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 8:
{
printf(" 請輸入該學生改正的家庭住址資訊: ");
while(!scanf("%s",p1->addr))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
case 9:
{
printf(" 請輸入該學生全部要改正的資訊: ");
while(!scanf("%u %s %s %s %s %s %s %s",&p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr))
{
printf(" 輸入改正資訊有誤,請重新輸入: ");
fflush(stdin);
}
break;
}
}
if (cho == 1 || cho == 9) //對修改過學號的學生進行重新排序
{
if (p1 == head) //當該學生在連結串列頭時,刪除連結串列頭節點
{
head = head->next;
}
else if (p1->next == NULL) //當該學生在連結串列尾時,刪除連結串列尾節點
{
p2->next = NULL;
}
else //當該學生在連結串列中時,刪除該學生對應的節點
{
p2->next = p1->next;
}
head = insert(head,p1); //利用插入學生資訊功能函式,進行該學生的重新排序
}
printf(" 修改成功,該學生改正後的資訊為: \n");
search(head,p1->num); //顯示以下修改後的學生資訊
//詢問使用者是否繼續
printf(" 1.繼續修改其他學生資訊\n");
printf(" 2.退出修改\n");
printf(" 請選擇: ");
while(!scanf("%u",&k)) //接受使用者輸入的序號,並進行排錯
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin);
}
if (k == 1) //接受下一次修改的學生學號
{
printf(" 請輸入需要修改的學生學號: ");
while(!scanf("%u",&num))
{
printf(" 輸入修改資訊有誤,請重新輸入: ");
fflush(stdin);
}
}
else if (k != 2) //排錯
{
printf(" 輸入有誤,請重新輸入\n");
}
}
else //查詢不到學生時要求使用者進行重新輸入學生序號
{
k = 1;
printf(" 找不到該學生資訊,請重新輸入需要修改的學生學號: ");
fflush(stdin);
while(!scanf("%u",&num)); //接受使用者重新輸入的學號並進行排錯
{
printf(" 輸入修改資訊有誤,請重新輸入: ");
fflush(stdin);
}
}
}while(k == 1);
printf(" ");
system("pause");
}
void output(struct Student *head) //儲存學生資訊到txt檔案功能函式
{
FILE *write;
char filename[20];
struct Student *p1,*p2;
unsigned int cho,n;
if (head == NULL) //對空連結串列進行處理
{
printf(" 沒有學生資訊,儲存失敗\n ");
system("pause");
return;
}
p1 = p2 = head;
printf(" 請輸入儲存的檔名(如save): ");
while(!scanf("%s",filename)) //接受檔名,並進行排錯(幾乎不會出現錯誤的現象,慎重而設)
{
printf(" 輸入的檔名有誤,請重新輸入:");
fflush(stdin);
}
strcat(filename,".txt"); //連結字尾名
write = fopen(filename,"w"); //以寫入方式開啟檔案
//詢問使用者用哪種方式儲存
printf(" 1.以表格形式儲存(不可重新錄入)\n");
printf(" 請按1進行確認 : ");
while(!scanf("%u",&cho)) //接受使用者輸入的序號並進行排錯
{
printf(" 輸入序號有誤,請重新輸入: ");
fflush(stdin);
}
while(cho < 1 || cho > 1) //對超出範圍的序號進行排錯
{
printf(" 輸入序號有誤,請重新輸入: ");
while(!scanf("%u",&cho))
{
printf(" 輸入序號有誤,請重新輸入: "); //對輸入錯誤的序號進行排錯
fflush(stdin);
}
}
if (cho == 1) //以表格形式儲存
{
//***********************表格頭部設計************************
fprintf(write," ┃學號┃年級┃ 姓名 ┃出生年月┃性別┃政治面貌┃ 聯絡電話 ┃ 家庭住址 ┃\n");
//**********************************************************
//****************表格主體設計以及資料輸出******************
while(p1 != NULL)
{
;
fprintf(write," ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr);
p1 = p1->next;
}
//**********************************************************
//***********************表格頭部設計***********************
//**********************************************************
}
fclose(write);
printf(" 儲存成功\n ");
system("pause");
}
main.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include"stud.h"
int main()
{
show(); //呼叫顯示功能函式
return 0;
相關文章
- 資料結構課程設計-宿舍管理系統資料結構
- 學生資訊管理系統課程設計
- 資料結構 課程設計 員工管理系統(C語言)資料結構C語言
- C++課程設計:學生資訊管理系統C++
- 航班資訊查詢和檢索系統-資料結構課程設計資料結構
- 【C語言課程設計】學生學籍管理系統C語言
- 資料庫課程設計-宿舍管理系統資料庫
- 大一課程設計:基於資料庫的學生資訊系統資料庫
- 資料庫課程設計—超市零售資訊管理系統(Python實現)資料庫Python
- 資料庫課設(校友錄資訊管理系統)資料庫
- 學生成績管理系統——課程設計報告
- OCP課程23:管理Ⅰ之資料庫體系結構資料庫
- 資料結構課程設計報告——暢通工程資料結構
- EasyUI+JavaWeb獎助學金管理系統[3]-資料庫結構設計UIJavaWeb資料庫
- 學生選題資訊管理系統
- javaweb課程設計之XXX管理系統JavaWeb
- 【C++課程設計】通訊錄管理系統C++
- 課程管理系統
- 20145216《資訊保安系統設計基礎》課程總結
- 資料庫課程設計資料庫
- Java之學生資訊管理系統升級版(資料庫程式設計)Java資料庫程式設計
- 【管理系統課程設計】美少女手把手教你後臺管理
- 作業系統課程設計感受作業系統
- 競拍系統設計和核心資料結構資料結構
- 【web】資料庫應用系統設計體系結構Web資料庫
- Java圖書管理系統,課程設計必用(原始碼+文件)Java原始碼
- 順通高校學生網上選課管理系統
- 20145227鄢曼君 《資訊保安系統設計基礎》課程總結
- 20145302張薇 《資訊保安系統設計基礎》課程總結
- 學生管理系統
- 關於學生選課管理系統的用例圖
- 我的學生資訊管理系統總結
- 學生資訊管理系統之SQL連結SQL
- 《資料庫系統原理》課程筆記資料庫筆記
- 職工資訊管理系統的設計
- 業務管理資訊系統通用設計
- CSDN學霸課表——軟體設計師、資訊系統監理師、資料庫系統工程師、系統分析師資料庫工程師
- Hadoop高階資料分析 使用Hadoop生態系統設計和構建大資料系統Hadoop大資料