歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C鏈表和文件操作實戰--圖書管理系統

這個貌似是我們大一的C語言課程設計,當時是從網上下的代碼,然後修改了一下.現在想想好慚愧,哎我好想重新開始,以前自己的確失去了好多東西,希望今後的自己好好......

時間過的真快,現在都大三了,馬上也要滾蛋了,再滾蛋之前好好修煉內功.於是我又重新拾起了久違的C語言,用了幾天時間認真看完了Programming in c,個人覺得這本書講得真好,

收益亮多.回想起大一學的C語言,我們用的教材是學校自己編的,往事不堪回首啊....記得上學期我們學習數字信號處理,我麼用的也是學校自己編的書,當時上課最有特色的地方就是:我們那個老師每節課都要花好長時間糾正書裡的錯誤,他經常說的一句話是-還好當時我沒參加編寫這本書,不然還不被罵死.......

我始終想不明白的是有那麼多經典的好書,學校不用,非要自己去編那麼操蛋的書.這學期我們學習XML應用教材,當時老師說本來想用那本書的,覺得很好.最後學校不同意,理由竟是:那本是高職的書,我們是本科....我聽完淚流滿面啊.我們的大學,我們的老師,你們什麼時候才能不浮躁???

哎,本來我不想說什麼,但已經到這個地步了,就再多廢話幾句吧.我們學了微機原理,老師沒在課上編過.調試過一個程序,那麼經典的debug工具都不提...;我們學了計算機網絡,天天講各種包,老師從沒在課上用抓包軟件抓過一個包,分析過一個包...;我們學了組網技術,老師給我的模擬器不知道是哪一年的,ospf都不支持,天天說cisco,沒介紹過packettracer,  dynamips...淚流滿面啊,我們的學校很差,但真的差到這個地步了嗎? 老師們,你們每天都在想什麼了,能不浮躁嗎? 天天說上課學生不聽講,天天說上課人數少,為什麼呀?我們學生是有問題,但你們呢? 你們真的對得起你們拿的工資嗎?

哎,話多了.一個學生的牢騷而已....

stop,不說了,呵呵.

主要是想起了大一做的課程設計,所以自己動手做了下,不過我這個事簡化版,呵呵,溫故而知新.

  1. #include <stdio.h>   
  2. #include <string.h>   
  3. #include <stdlib.h>   
  4. #include <conio.h>   
  5. #define  books "f:\\books.txt"   
  6. #define booksbak  "f:\\booksbak.txt"   
  7. struct bookinfo  
  8. {  
  9.     char isbn[20];  
  10.     char title[30];  
  11.     char author[20];  
  12.     int count;  
  13. };  
  14.   
  15. struct book  
  16. {  
  17.     struct bookinfo onebook;  
  18.     struct book *next;  
  19. };  
  20.   
  21. struct book *searchBook ( struct book *listptr,char isbn[])  
  22. {  
  23.     while(listptr!=(struct book *)0)  
  24.         if (strcmp(listptr->onebook.isbn,isbn)==0)  
  25.             return listptr;  
  26.         else  
  27.             listptr=listptr->next;  
  28.         return (struct book *)0;  
  29. }  
  30.   
  31.   
  32. void MainSearchbook(struct book *firstptr)  
  33. {  
  34.     struct book *ptr;  
  35.     char isbnno[20];  
  36.     printf("請輸入ISBN:");  
  37.     scanf("%s",&isbnno);  
  38.     ptr=searchBook(firstptr,isbnno);  
  39.     if (ptr!=(struct book *)0)  
  40.     {  
  41.         printf("找到了!!!\n");  
  42.         printf("ISBN:%s\n",ptr->onebook.isbn);  
  43.         printf("Title:%s\n",ptr->onebook.title);  
  44.         printf("Author:%s\n",ptr->onebook.author);  
  45.     }  
  46.     else  
  47.         printf("sorry,not found!!!\n");  
  48. }  
  49.   
  50.   
  51.   
  52. int addBook(struct book *listptr,struct bookinfo note)  
  53. {  
  54.     while(listptr->next!=0)  
  55.         listptr=listptr->next;  
  56.     listptr->next=(struct book *)malloc(sizeof(struct book));  
  57.     listptr->next->onebook=note;  
  58.     listptr->next->next=0;  
  59.     return 0;  
  60.       
  61. }  
  62.   
  63. void MainAdd(struct book *listptr,FILE *fp)  
  64. {  
  65.     int ok;  
  66.     struct bookinfo note;  
  67.     printf("請輸入ISBN:");  
  68.     scanf("%s",¬e.isbn);  
  69.     printf("請輸入Title:");  
  70.     scanf("%s",¬e.title);  
  71.     printf("請輸入Author:");  
  72.     scanf("%s",¬e.author);  
  73.     ok=addBook(listptr,note);  
  74.     if (ok==0)  
  75.     {     
  76.         //將加入的圖書寫到文件中保存   
  77.         fprintf(fp,"\n%s %s %s %d",note.isbn,note.title,note.author,0);  
  78.         printf("添加圖書成功!!!\n");  
  79.     }  
  80.     else  
  81.         printf("添加圖書失敗!!!\n");  
  82. }  
  83.   
  84.   
  85. int removeBook(struct book *listptr,char isbn[])  
  86. {  
  87.     while(listptr->next!=(struct book *)0)  
  88.     {  
  89.         if (strcmp(listptr->next->onebook.isbn,isbn)==0)  
  90.         {  
  91.             listptr->next=listptr->next->next;  
  92.             return 0;  
  93.         }  
  94.         else  
  95.             listptr=listptr->next;  
  96.     }  
  97.           
  98.         return -1;  
  99. }  
  100.   
  101. void MainRemove(struct book *listptr,FILE *fp)  
  102. /************************************************************************/  
  103. /* 刪除書籍函數,通過ISBN刪除鏈表節點,同時刪除文件中對應信息              */  
  104. /* 刪除文件中一行,用的是笨方法,把需要的信息寫到新文件,刪除舊文件,重命名..*/  
  105. /************************************************************************/  
  106. {  
  107.     char isbnno[20];  
  108.     int ok;  
  109.     struct bookinfo onebook;  
  110.     printf("請輸入ISBN:");  
  111.     scanf("%s",&isbnno);  
  112.     ok=removeBook(listptr,isbnno);  
  113.     if (!ok)  
  114.     {  
  115.         FILE *fpbak;  
  116.         if ((fpbak=fopen(booksbak,"a+"))==NULL)  
  117.             printf("文件打開失敗!!!\n");  
  118.         fseek(fp,0,SEEK_SET);   //移到文件開始   
  119.         while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)  
  120.         {  
  121.             if (strcmp(onebook.isbn,isbnno)!=0)  
  122.             {  
  123.                 fprintf(fpbak,"%s %s %s %d\n",onebook.isbn,onebook.title,onebook.author,onebook.count);  
  124.             }  
  125.         }  
  126.         fclose(fp);  
  127.         fclose(fpbak);  
  128.         if (remove(books))   //刪除失敗返回非0   
  129.         {  
  130.             printf("刪除文件失敗!!!\n");  
  131.             return ;  
  132.         }  
  133.         else  
  134.             if (rename(booksbak,books))  //重命名失敗返回非0值   
  135.             {  
  136.                 printf("重命名失敗!!!\n");  
  137.                 return ;  
  138.             }  
  139.   
  140.         printf("刪除成功!!!\n");  
  141.     }  
  142.     else  
  143.         printf("查無此書!!!");  
  144. }  
  145.   
  146. int  choice(void)  
  147. {     
  148.     int c;  
  149.     printf("1.查看圖書\n");  
  150.     printf("2.添加圖書\n");  
  151.     printf("3.刪除圖書\n");  
  152.     printf("4.退出程序\n");  
  153.     printf("請選擇序號:");  
  154.     return c=getchar();  
  155.     //return c=getche();   
  156.     printf("\n\n");  
  157.   
  158. }  
  159.   
  160. int addEntry(FILE *fp,struct book *firstptr)  
  161. /************************************************************************/  
  162. /*        主要用來加載文件中存放的圖書信息                              */  
  163. /************************************************************************/  
  164.   
  165. {  
  166.     struct bookinfo onebook;  
  167.     while((fscanf(fp,"%s %s %s %d\n",&onebook.isbn,&onebook.title,&onebook.author,&onebook.count))!=EOF)  
  168.     {  
  169.         while(firstptr->next!=0)  
  170.             firstptr=firstptr->next;  
  171.         firstptr->next=(struct book *)malloc(sizeof(struct book));  
  172.         firstptr->next->onebook=onebook;  
  173.         firstptr->next->next=0;  
  174.     }  
  175.     return 0;  
  176.   
  177. }  
  178.   
  179.   
  180. int main(int argc,char *argv[])  
  181. {  
  182.     int ch;  
  183.     struct book first;  
  184.     strcpy(first.onebook.isbn,"123456");  
  185.     strcpy(first.onebook.title,"Programming C");  
  186.     strcpy(first.onebook.author,"yhb");  
  187.     first.next=0;  
  188.     struct book *firstptr=&first;   //鏈表頭指針   
  189.     FILE *fp;  
  190.     if ((fp=fopen(books,"a+"))==NULL)  
  191.         printf("文件打開失敗!!!");  
  192.     addEntry(fp,firstptr);  
  193.     while(1)  
  194.     {  
  195.         system("CLS");   //清屏   
  196.         /************************************************************************/  
  197.         /*          想想這裡為什麼要清空緩沖區?                                 */  
  198.         /*由於上一次(choice函數)的getchar(),還有一個'\n'留在緩沖區....          */  
  199.         /*可以把這句話注釋掉看看,沒有這句話會遇到麻煩                           */  
  200.         /*如果不用fflush,可以將上面的getchar()換成getche()                      */  
  201.         /*比較getchar(),getch(),getche()......                                  */  
  202.         /************************************************************************/  
  203.         fflush(stdin);   
  204.         ch=choice()-48;  
  205.         switch (ch)  
  206.         {  
  207.         case 1:  
  208.             MainSearchbook(firstptr);  
  209.             break;  
  210.         case 2:  
  211.             MainAdd(firstptr,fp);  
  212.             break;  
  213.         case 3:  
  214.             MainRemove(firstptr,fp);  
  215.             break;  
  216.         case 4:  
  217.             printf("謝謝使用...\n");  
  218.             exit(0);  
  219.         default:  
  220.             printf("請輸入正確序號!");  
  221.         }  
  222.         system("PAUSE");  
  223.     }  
  224.     return 0;  
  225. }  

bookinfo結構體的count成員,本來是想做最近熱門圖書的, 通過用戶查看書籍,統計書籍浏覽的次數.發現更新文件中的數據很麻煩,於是就取消了.呵呵

books.txt裡面的數據大致如下所示:可以直接通過編輯books.txt增加書籍.

  1. 123 python yhb 2  
  2. 456 linux lwy 4  
  3. 789 c yl 5  

文件操作用fread,fwrite應該更方便點.

Copyright © Linux教程網 All Rights Reserved