為啥從文件流中讀取數(shù)據(jù)到新鏈表,要求返回頭指針head,需要定義多一個(gè)臨時(shí)指針p ?

科技 未結(jié) 0 1583
jackiechan996#p
jackiechan996#p 2022-06-15 18:54

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不可以嗎?

相關(guān)標(biāo)簽:
回答
  • 消滅零回復(fù)
提交回復(fù)
最新問(wèn)題
多囊卵巢綜合癥能熬夜嗎 1
卵巢囊腫破裂怎么辦 1
裝飾的詳細(xì)解釋 2
不孕不育癥的檢查項(xiàng)目 1
家庭投影儀用什么牌子好? 5
如何評(píng)價(jià)堅(jiān)果S1超短焦激光家用投影儀 1
如何治不孕 1
極米堅(jiān)果把安卓里的miracast功能都去掉了!為了讓我們用樂(lè)投... 1
Sony Bravia的智能電視鏈接電腦主機(jī)如何鏈接聲音 1
關(guān)于720P和1080P家用投影機(jī)的選擇? 1
猜你喜歡
45歲還能做試管嗎,費(fèi)用與技術(shù)明細(xì)!
鎮(zhèn)江大家做試管花了多少錢?并非肯定!
預(yù)測(cè)預(yù)產(chǎn)期的計(jì)算軟件有哪些?
南京試管移植生化后如果身體條件允許可以當(dāng)月再做一次移植嗎?四招教你省錢!
在深圳不能懷孕可以做三代試管嬰兒?jiǎn)幔堪男╉?xiàng)目!
哈薩克斯坦第三代試管費(fèi)用能花多少錢?三代試管嬰兒費(fèi)用高嗎?
合肥生殖醫(yī)院私立比較好醫(yī)院以及價(jià)格,有幾家可以做三代?
十堰地區(qū)有哪些私立的機(jī)構(gòu)可以做試管技術(shù)?含具體花銷!
長(zhǎng)期月經(jīng)不調(diào),并且月經(jīng)稀少,會(huì)影響懷孕嗎?
FSH高能不能做試管嬰兒?收費(fèi)明細(xì)參考!
熱門文章
2025貴陽(yáng)能做三代試管的私立機(jī)構(gòu)介紹,認(rèn)準(zhǔn)這家少走彎路
中國(guó)做三代試管比較好的私人醫(yī)院Top10排行
深圳私立醫(yī)院試管機(jī)構(gòu)大全
做試管生孩子大概要多少錢?
南京私立三代試管嬰兒醫(yī)院預(yù)算
上海私立醫(yī)院成功率前10醫(yī)院都在這,全數(shù)優(yōu)勢(shì)對(duì)比
深圳私立醫(yī)院哪家三代試管成功率比較高?看看數(shù)據(jù)
泰國(guó)三代試管技術(shù)哪家強(qiáng)?醫(yī)院推薦!
上海能做三代試管的私立醫(yī)院名單匯總,一分鐘看完介紹
全數(shù)了解:泰國(guó)三代試管嬰兒技術(shù)的注意事項(xiàng)
廣告合作方 廣告申請(qǐng)