其實,用鏈表與文件寫學生管理系統內容可分為兩大模塊:
模塊一:一個完整的創建、遍歷、添加、刪除、修改的鏈表;
模塊二:讀取/寫入數據到文件。
模塊一
一個鏈表,主要是malloc的正確使用。
定義一個帶有結構指針的結構體,用malloc()動態開辟一個該結構體大小的內存用來作為節點,儲存多個平行數據並且每動態開辟一個內存就要用這個內存里面的結構指針指向下一個開辟的內存(如果停止動態開辟內存,則需讓這個指針指向NULL,作為Programmer都知道指針的潛在危險)。這個節點數量需用循環控制。malloc原型是 void* 類型,但在這里需要強制轉換成結構類型使用。而且動態開辟內存不是每次都會成功,不成時mallco()會返回NULL,所以我們需要規范使用malloc()
1 typedef struct stu //定義結構體變量
2 {
3 ... //其他變量
4 struct stu* pnext; //結構體的內部指針
5 }STU; 6 STU* pNew 7 if(NULL == (pNew = (STU*)malloc(sizeof(STU)))) 8 /*請使用if來判斷,這是有必要的*/ 9 { 10 perror("error..."); 11 exit(1); 12 } 13 pNew->pnext = NULL; 14 .../*其它代碼*/ 15 free(pNew); 16 pNew = NULL;/*請加上這句*/
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
關於添加、刪除、修改需要對指針的靈活運用。
如果在頭部添加/刪除,則要注意head的移動;
在中間添加/刪除,則注意利用循環定位准確;
在尾部添加/刪除,則要注意新/末尾結構體里的pnext(結構指針)指向NULL。
模塊二
主要在於如何把鏈表寫進指定文件里和如何把文件里的內容如何讀取到鏈表里。
可直接單獨寫一個模塊函數用fprintf格式化向文件里寫入
1 void PrintToTxt()
2 { 3 STU* pTemp = pStu->pnext; //pStu為頭指針pTemp為移動指針 4 5 if ((fp = fopen("學生信息管理.txt", "w")) == NULL) //打開文件准備寫入 6 { 7 printf("cannot open this file!\n"); 8 _getch(); 9 return; 10 } 11 12 while (pTemp != NULL) //開始寫入,pTemp為NULL時停止寫入 13 { 14 fprintf(文件指針, "輸出格式", 附加參數列表); 15 pTemp = pTemp->pnext; 16 } 17 fclose(fp); 18 printf("out save!"); //寫入成功 19 exit(0); 20 }
但是若要從文件中讀取並且形成鏈表的形式,則需要先建立鏈表再從文件中讀取數據
1 void ScanfTxt()
2 { 3 pStu = (STU*)malloc(sizeof(STU)); //動態開辟內存,創建鏈表 4 pStu->pnext = NULL; 5 6 STU* pTemp = pStu; 7 STU* pNew = NULL; 8 9 if ((fp = fopen("學生信息.txt", "r")) == NULL) 10 { 11 printf("cannot open this file\n!"); 12 _getch(); 13 exit(0); 14 } 15 16 while (1) //讀取數據,直到數據為空是跳出 17 { 18 pNew = (STU*)malloc(sizeof(STU)); 19 pNew->pnext = NULL; 20 if (fscanf(文件指針, "格式字串符", 21 輸入列表)==EOF) 22 { 23 free(pNew); //釋放多余開辟的內存 24 break; 25 } 26 27 pTemp->pnext = pNew; 28 pTemp = pTemp->pnext; 29 } 30 fclose(fp); 31 32 } 33
這里並沒有用到fread和fwrite
fread、fwrite是對二進制文件進行以二進制形式讀寫,以字節位計算長度,按照指定的長度和次數讀取數據,遇到結尾或完成指定長度讀取后停止。對於向文件里寫入數據時所有字符都可以無效果的寫入,比如遇見換行符則直接寫入換行符並不會執行換行。
而fscanf、fprintf是從磁盤文件中讀取數據,可以是二進制,也可以是其他形式,並且進行格式化讀寫。比如遇見換行符則會執行換行讀寫並不會讀出或寫入換行符。
這里用fscanf、fprintf主要利用可進行換行、格式化讀寫。
