book結(jié)構(gòu)體定義如下:
struct book //定義book結(jié)構(gòu)體 { int number; //編號(hào) char name[30];//書名 char category[10];//類別 char lentuser[12];//借書人的usernum int lent; //是否借出(已借為1,未借為0) int year; //借出時(shí)間——年 int month;//借出時(shí)間——月 int day;//借出時(shí)間——日 struct book *next; //一個(gè)指向book類型對(duì)象的指針};
library.txt截圖如下:
有疑問(wèn)的make_linklist()函數(shù)的代碼如下:
//從library.txt中讀取數(shù)據(jù)至鏈表 struct book *make_linklist() //這貨是條指針函數(shù),本質(zhì)就是段函數(shù)(在匯編程序里面函數(shù)就是code segment哈哈和 data segment并列的存在) //所以函數(shù)和數(shù)組都是差不多的東西,聲明函數(shù)或數(shù)組之后默認(rèn)會(huì)分配給他們一個(gè)指向他們首地址的指針 //而且這個(gè)指針的名字跟函數(shù)名/數(shù)組名一樣//make_linklist()的返回值是(struct book *)//(struct book *)就是指向類型為book的結(jié)構(gòu)體的指針{ struct book *head;//指針head現(xiàn)在可以指向任何類型為book的結(jié)構(gòu)體head = (struct book *)malloc(sizeof(struct book));//分配book結(jié)構(gòu)體大小的內(nèi)存, //并將這塊內(nèi)存按照book結(jié)構(gòu)體的大小劃分單元,//然后將這塊內(nèi)存的首地址賦值給指針變量head,即head為頭指針head->next = NULL; //將頭節(jié)點(diǎn)的指針域賦值為null,即初始化一個(gè)帶頭結(jié)點(diǎn)的單鏈表FILE *fp;//定義fp,一個(gè)指向文件類型的文件指針(FILE *)fp = fopen("library.txt", "r+");//告訴fp要指向的文件是library.txt (r+表示允許讀寫文件)//如果library.txt文件不存在 if (fp == NULL) fp = fopen("library.txt", "w+");// w+ ,如果文件已經(jīng)存在,將建立一個(gè)新文件覆蓋原文件(很缺德啊……),并且支持讀取。//此處用于創(chuàng)建library.txt文件 //如果檢測(cè)到library.txt為空 if (check_void_file() == 0) { printf("圖書數(shù)據(jù)庫(kù)為空!"); return head;//返回創(chuàng)建鏈表的頭指針,即返回整個(gè)鏈表,這樣就可以被其他地方所用了}//library.txt不為空struct book *p; p = head;//給p賦值為頭指針,即讓p指向頭節(jié)點(diǎn)char ch; while(!feof(fp))//當(dāng)文件指針fp沒(méi)有到達(dá)末尾,循環(huán)執(zhí)行從library.txt讀取數(shù)據(jù)到鏈表//(feof()用于檢測(cè)文件是否結(jié)束,如果沒(méi)有結(jié)束,返回值是0,結(jié)束了是1){ struct book *new_book_init; //指針new_book_init現(xiàn)在可以指向類型為book的任何結(jié)構(gòu)體new_book_init = (struct book *)malloc(sizeof(struct book));//分配book結(jié)構(gòu)體大小的內(nèi)存,并將這塊內(nèi)存按照book結(jié)構(gòu)體的大小劃分單元,//然后將這塊內(nèi)存的首地址賦值給指針變量new_book_init, //即new_book_init為頭指針 /*依序從fp指向的文件流中賦值給new_book_init指針指向的結(jié)構(gòu)體的成員,開始*///第一行 fscanf(fp, "%d", &new_book_init->number); ch = fgetc(fp);fscanf(fp, "%[^]%*c", new_book_init->name); //第二行 fscanf(fp, "%[^]%*c", new_book_init->category); //第三行 fscanf(fp, "%[^]%*c", new_book_init->buser);//第四行 fscanf(fp, "%d", &new_book_init->lent);ch = fgetc(fp); //吃空格,讓fp下移fscanf(fp, "%d", &new_book_init->year);ch = fgetc(fp); //吃空格,讓fp下移 fscanf(fp, "%d", &new_book_init->month); ch = fgetc(fp); //吃空格,讓fp下移 fscanf(fp, "%d", &new_book_init->day); ch = fgetc(fp); //吃換行,讓fp下移//不要忘了給結(jié)構(gòu)體內(nèi)的成員next指針賦值為null,不要讓next成為野指針 new_book_init->next = NULL;/*依序從fp指向的文件流中賦值給new_book_init指針指向的結(jié)構(gòu)體的成員,結(jié)束*/ p->next = new_book_init;p = p->next; } fclose(fp);return head; }
為啥需要定義指針p呢?直接將head = new_book_init
不可以嗎?