數據結構(c語言)之學生信息管理系統


程序思維導圖

 

代碼表示(代碼參考:長春大學-牛言濤老師)

如有錯誤請指出歡迎交流

 
         
 
          
  1 #include<stdio.h>
  2 #include<malloc.h>//動態存儲分配函數頭文件 
  3 #include<math.h>//包含數學函數的文件 
  4 #include<string.h>//一個和字符串處理相關的頭文件 
  5 #include<process.h>//包含用於和宏指令的作用聲明與螺紋和過程一起使用的C標頭文件 
  6 #define ERROR 0 //宏定義 
  7 #define OK 1
  8 #define over -2
  9 #define ListInitSize 20
 10 #define ListIncrement 5
 11 #define Namelen 8
 12 #define Majorlen 20
 13 #define INIT_N 3 
 14 typedef int Status;        //自定義類型語句 Status i 等價於 int i
 15 typedef char StatusC;
 16 
 17 typedef struct{
 18     StatusC number[10];       //學號:081330385
 19     StatusC name[Namelen+1];  //姓名:郭靖
 20     StatusC gender;           //性別:男
 21     StatusC telephone[12];    //電話:15890377853
 22     StatusC qqNumber[13];     //QQ:485284320
 23     StatusC major[Majorlen+1];//專業:計算機科學與技術
 24 
 25 }Student;//類型為學生 
 26 
 27  typedef struct{
 28 
 29      Student *elem;  //存儲空間的基址
 30     Status length;  //當前長度
 31     Status listsize; //當前分配的存儲容量(以sizeof(Studnet)為單位)
 32  }Sqlist;
 33 
 34  //信息初始化,構造一個空的線性表
 35  Status InitList(Sqlist &l){
 36 
 37      l.elem=(Student *)malloc(ListInitSize*sizeof(Student));
 38      //申請LIST_INIT_SIZE個大小為整型(Student)字節的空間,
 39      //把空間指針給L.elem 
 40      if(!l.elem)exit(over);
 41      //判斷l中的數據成員elem是否為0,為0即執行if下面語句 
 42      l.length=0;
 43      //賦值 
 44      l.listsize=ListInitSize;
 45      return OK;
 46  }
 47 
 48 //插入記錄
 49 Status ListInsert(Sqlist &l,Status i,Student s){
 50 
 51     Student *newbase;
 52     if(i<1||i>l.length+1)
 53        return ERROR;//i值不合法
 54     if(l.length>=l.listsize)//當前存儲空間已經滿了,增加分配空間
 55     {
 56        newbase=(Student*)realloc(l.elem,(
 57        ListInitSize+ListIncrement)*(sizeof(Student)));
 58       /*
 59         先釋放原來L.elem所指內存區域,並按照
 60         (LIST_INIT_SIZE+ListIncrement)*sizeof(Student)
 61         的大小重新分配空間其中ListIncrement為20, 
 62         同時將原有數據從頭到尾拷貝到新分配的內存區域,
 63         並返回該內存區域的首地址。即重新分配存儲器塊。 
 64        */
 65        if(!newbase)exit(over);
 66        // 判斷newbase是否為0,為0即執行if下面語句 
 67        l.elem=newbase;
 68        //賦值 
 69        l.listsize+=ListIncrement;
 70     }
 71     for(Status j=l.length;j>=i;j--)
 72        l.elem[j]=l.elem[j-1];
 73        //賦值 
 74        l.elem[i-1]=s;
 75        l.length++;
 76        return OK;
 77 }
 78 
 79 //打印輸出線性表中的信息
 80 void print(Sqlist &l){
 81 
 82     if(l.length==0)
 83       printf("空表,無任何記錄!\n\n");
 84       printf("學號   姓名   性別   手機號   QQ   專業\n");
 85       printf("******************************\n");
 86 
 87     for(Status i=0;i<l.length;i++){
 88 
 89         printf("%-10s   %-8s",l.elem[i].number,l.elem[i].name);
 90         //輸出學好 姓名 
 91         if(l.elem[i].gender=='m')printf("");
 92         //判斷語句 
 93         else printf("");
 94         printf("%14s  %9s  %10s",l.elem[i].telephone,l.elem[i].qqNumber,l.elem[i].major);
 95         //輸出電話號碼 qq號碼  專業 
 96         printf("\n");
 97     }
 98     printf("------------------------------\n");
 99 }
100 
101 //打印輸出線性表中指定學生的信息
102 void print_single(Student s){
103 
104      printf("學號     姓名   性別   手機號   QQ   專業\n");
105      printf("******************************\n");
106         printf("%-10s   %-8s",s.number,s.name);
107         //輸出學好 姓名 
108         if(s.gender=='m')printf("");
109         else printf("");
110         printf("%14s  %9s  %10s",s.telephone,s.qqNumber,s.major);
111         //輸出電話號碼  qq號碼  專業 
112         printf("\n");
113         printf("------------------------------\n");
114 }
115 
116 //接受鍵盤輸入信息
117 void ScanIn(Sqlist &l){
118 
119     StatusC a[2];
120     Status i;
121     printf("\t 您選擇插入一條學生記錄\n");
122     do{
123         Student s;
124         printf("\t 請輸入學號:");
125         scanf("%s",s.number);
126         printf("\t 請輸入姓名(<=%d個字符):",Namelen);
127         scanf("%s",s.name);
128         
129         printf("\t 請輸入電話號碼:");
130         scanf("%s",s.telephone);
131         printf("\t 請輸入QQ號:");
132         scanf("%s",s.qqNumber);
133         printf("\t 請輸入專業:");
134         scanf("%s",s.major);
135         printf("\t 請輸入性別:(m:男,f:女)");
136         scanf("%*c%c",&s.gender);
137         printf("\t 請輸入你要插入的位置(1<=i<=%d):",l.length+1);
138         scanf("%d",&i);
139         ListInsert(l,i,s);
140         printf("\t 您想繼續插入記錄嗎?(y/n)\t");
141         scanf("%s",a);
142 
143     }while(strcmp(a,"y")==0||strcmp(a,"Y")==0);
144     //調用strcmp函數 
145 }
146 
147 //刪除通訊中第i條記錄
148 Status ListDelete(Sqlist &l,int i,Student s){
149 
150     Status j;
151     if(i<1||i>l.length)return ERROR;
152     //判斷 
153     else{
154 
155         s=l.elem[i-1];
156         for(j=i;j<=l.length;j++)l.elem[j-1]=l.elem[j];
157         l.length--;
158         return OK;
159     }
160 }
161 
162 //按照升序排列
163 void SortorderAscend(Sqlist &l){
164 
165     system("cls");//清空前面的信息之輸出下面信息 
166     Student s; 
167     for(Status i=0;i<l.length-1;i++)
168       for(Status j=0;j<l.length-i-1;j++){
169           //循環比較大小 ,排列順序 
170         if(strcmp(l.elem[j].number,l.elem[j+1].number)>0){
171             //strcmp() 以二進制的方式進行比較,不會考慮多字節或寬字節字符;
172             //用來比較字符串(區分大小寫) 
173             s=l.elem[j];
174             l.elem[j]=l.elem[j+1];
175             l.elem[j+1]=s;
176         }
177     }
178     printf("*****按照升序排序成功!******\n\n");
179 }
180 
181 //判斷姓名是否相同
182 Status EqualName(Student s1,Student s2){
183 
184     if(strcmp(s1.name,s2.name))return ERROR;
185     //比較兩個字符串是否相同 
186     else return OK;
187 }
188 
189 //定位某個元素
190 int LocateElem(Sqlist l,Student s,Status(*compare)(Student,Student)) {
191 
192     Status i=1;
193     Student *p=l.elem;
194     while(i<=l.length&&!compare(*p++,s))i++;
195     if(i<=l.length)
196       return i;
197       //定位元素的位置 
198     else
199       return 0;
200 }
201 
202 //按照姓名查找
203 void searchName(Sqlist l,Status(*equal)(Student,Student)){
204 
205     system("cls");//清空前面的信息之輸出下面信息 
206     Student s;
207     Status j;
208     StatusC a[2];
209     do{
210         printf("\t 請輸入你要查找的學生的姓名:");
211         scanf("%s",s.name);
212         j=LocateElem(l,s,equal);
213         if(!j)printf("沒有查找到你所要查找的學生記錄!\n");
214         else print_single(l.elem[j-1]);
215         printf("\t 您想繼續查找嗎?(y/n)\t");
216         scanf("%s",a);
217 
218     }while(strcmp(a,"y")==0||strcmp(a,"Y")==0);
219 }
220 
221 //修改姓名
222 void ModifyName(Sqlist &l,Status(*equal)(Student,Student)){
223 
224     system("cls");//清空前面的信息之輸出下面信息 
225     Student s;
226     Status j;
227     StatusC number_new[10],name_new[Namelen+1],gender_new,
228     telephone_new[12],qqNumber_new[13],major_new[Majorlen+1];
229     StatusC a[2];
230     do{
231         printf("\t 請輸入你要更改的學生的姓名:");
232         scanf("%s",s.name);
233         j=LocateElem(l,s,equal);
234         if(!j)printf("沒有查找到你所要查找的學生記錄!\n");
235         else {
236 
237             print_single(l.elem[j-1]);
238             Status  isOrNo=1;
239             printf("\n修改通訊錄:1 學號,2 姓名,3 性別,4 電話,5 QQ號,6 專業,    0 取消\n") ;
240             while(isOrNo){
241 
242                 printf("--------------------------\n");
243                 printf("請選擇需要修改的屬性序號:");
244                 scanf("%d",&isOrNo);
245                 switch(isOrNo){
246 
247                     case 1:
248                         printf("請輸入更改后的學號:");
249                         scanf("%s",number_new);
250                         strcpy(l.elem[j-1].number,number_new);
251                         break;
252                       case 2:
253                         printf("請輸入更改后的姓名:");
254                         scanf("%s",name_new);
255                         strcpy(l.elem[j-1].name,name_new);
256                         break;
257                       case 3:
258                         printf("請輸入更改后的性別:");
259                         scanf("%*c%c",&l.elem[j-1].gender);
260                         break;
261                       case 4:
262                         printf("請輸入更改后的電話:");
263                         scanf("%s",telephone_new);
264                         strcpy(l.elem[j-1].telephone,telephone_new);
265                         break;
266                       case 5:
267                         printf("請輸入更改后的QQ號:");
268                         scanf("%s",qqNumber_new);
269                         strcpy(l.elem[j-1].qqNumber,qqNumber_new);
270                         break;
271                       case 6:
272                         printf("請輸入更改后的專業:");
273                         scanf("%s",major_new);
274                         strcpy(l.elem[j-1].major,major_new);
275                         break;
276 
277                 }
278             }
279             printf("\n****更改后該條記錄變為****\n\n");
280             print_single(l.elem[j-1]);
281         }
282         printf("您想繼續修改嗎?(y/n)\t");
283         scanf("%s",a);
284     }while(strcmp(a,"y")==0||strcmp(a,"Y")==0);
285 }
286 
287 //主菜單
288 void menu(){
289 
290     system("cls");//清空前面的信息之輸出下面信息 
291     printf("\t*********************\n");
292     printf("\t**歡迎使用學生通訊錄管理系統**\n");
293     printf("\t*********************\n");
294     printf("\t**請選擇如下操作,輸入序號**\n");
295     printf("\t  0:退出系統\n");
296     printf("\t  1:將初始學生記錄插入線性表\n");
297     printf("\t  2:顯示線性表中所有內容\n");
298     printf("\t  3:向線性表中增加一條記錄\n");
299     printf("\t  4:從線性表中刪除一條記錄\n");
300     printf("\t  5:按照姓名修改一條記錄\n");
301     printf("\t  6:按照姓名查找一條記錄\n");
302     printf("\t  7:按照學號升序排列通訊錄\n");
303     printf("\t*********************\n");
304     printf("\t  您想進行什么操作,請選擇\n");
305 
306 }
307 
308 //主函數
309 int main(){
310 
311     Sqlist l;
312     Status i,select; //select 變量標記用戶的選擇
313     if(InitList(l)!=OK)printf("\n\t線性表初始化失敗!\n");
314     Student s[INIT_N]={{"081404327","馬東",'m',"13729947569","87384747" ,"機械工程"},
315         {"081404527","李東",'m',"13729985469","84786747" ,"軟件工程"},
316         {"081435797","馬西",'f',"12329947569","84735777" ,"通訊工程"}};
317     menu();
318     scanf("%d",&select);
319     while(select){
320         switch(select){
321             case 1: //初始化數據
322                  system("cls");//清空前面的信息之輸出下面信息 
323                   for(i=0;i<INIT_N;i++){
324 
325                       if(ListInsert(l,i+1,s[i])!=OK)
326                          printf("\t初始化數據失敗!\n");
327 
328                   }
329                   if(i==INIT_N)printf("\t初始化數據成功\n\n");
330                   print(l);
331                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
332                 break;
333             case 2://顯示線性表中的記錄
334                 system("cls");//清空前面的信息之輸出下面信息 
335                 print(l);
336                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
337                 break;
338             case 3://接受鍵盤輸入,並把記錄插入到線性表中
339                 system("cls");//清空前面的信息之輸出下面信息 
340                 ScanIn(l);
341                 system("cls");//清空前面的信息之輸出下面信息 
342                 print(l);
343                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
344                 break;
345             case 4://刪除通訊錄中某條信息
346                 system("cls");//清空前面的信息之輸出下面信息 
347                 Student *s2=l.elem;
348                 print(l);
349                 printf("您想刪除第幾條通訊錄1~%d:\n",l.length);
350                 int k;
351                 scanf("%d",&k);
352                 Student de_s;
353                 system("cls");//清空前面的信息之輸出下面信息 
354                 if(ListDelete(l,k,de_s)==OK){
355                     print(l);
356                     printf("\t%-6s 已經刪除成功!\n",de_s.name);
357                 }
358                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
359                 break;
360             case 5://按照姓名修改一條記錄
361                 ModifyName(l,EqualName);
362                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
363                 break;
364             case 6://按照姓名查找記錄
365                 searchName(l,EqualName);
366                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
367                 break;
368             case 7://按照學好升序排列
369                 system("cls");//清空前面的信息之輸出下面信息 
370                 SortorderAscend(l);
371                 print(l);
372                 printf("\n輸入0:退出,輸入11:返回主菜單\t");
373                 break;
374             case 11://返回主菜單
375                 menu();
376                 break;
377         }
378         scanf("%d",&select);
379     }
380     return 0;
381 
382 
383 }

 

 
          

 

 
 
         

 

 
        

結果顯示

主菜單

將初始學生信息插入線性表中

讀取線性表中信息

插入一條學生信息

刪除一條學生信息

更改學生信息

查找學生信息

將學生信息排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM