C語言檔案讀取並寫入連結串列
阿新 • • 發佈:2019-01-09
C語言沒啥要逼逼的,直接上程式碼,用心體會
#include "stdio.h" #include "stdlib.h" /***************************** 連結串列節點結構體 ****************************/ typedef struct link_node { int ID; char name; int Yuwen; int Shuxue; int Yingyu; int Dili; int Shengwu; struct link_node *next; }node; /***************************** 向控制檯輸出連結串列的各個節點值 ****************************/ void dispaly(node *head) { node *p; p = head; if (!p) //如果head指標為空說明連結串列為空 { printf("\n連結串列為空!\n\n"); } else { printf("\n連結串列的各個節點的值為:\n"); while (p) //迴圈將各個節點值輸出 { p = p->next;//第一是垃圾值 跳過 printf("%d %c %d %d %d %d %d\n",p->ID, p->name, p->Yuwen, p->Shuxue, p->Yingyu, p->Dili, p->Shengwu);//列印 } } } /****************************************** 找到要插入的上一個節點位置,實際就是連續插入在尾部 *********************************************/ node *find(node *head,int i) { int j = 1; node *p = head; if (i < 1) //節點從第一個開始 為0說明沒有節點 連結串列為空 返回NULL { printf("\n連結串列長度要大於零\n\n"); return NULL; } while (p&&i!=j) //迴圈判斷直到找到目標節點 { p = p->next; j++; } return p;//返回找到的目標節點 } /****************************************** 插入節點,找到要插入的位置後插入帶資料的節點 *********************************************/ node *insert(node *head, int ID,char name,int Yuwen,int Shuxue,int Yingyu,int Dili,int Shengwu,int i) { node *p, *q; q = find(head, i); if (!q&&i!=0) //對find的結果進行判斷,同時對i輸入的值判斷 { printf("找不到第%d個節點,無法插入資料\n",i); } else { p = (node*)malloc(sizeof(node));//例項化節點,分配空間 p->ID = ID; //將檔案讀出來的值賦值給節點的資料域 p->name = name; p->Yuwen = Yuwen; p->Shuxue = Shuxue; p->Yingyu = Yingyu; p->Dili = Dili; p->Shengwu = Shengwu; if (i == 0) //如果是空連結串列 就把這個節點作為頭指標指向的節點 { p->next = head; head = p; } else //如果不是空連結串列就正常代換指標域 { p->next = q->next; q->next = p; } } return head;//返回修改後的連結串列頭指標 } /***********主函式*************/ void main() { //連結串列初始化 node *head,*s; head = (node*)malloc(sizeof(node)); //例化 //檔案讀取 FILE *fp; int i = 0; int j = 0; int ID[9], YW[9], SX[9], YY[9], DL[9], SW[9];//接收檔案讀出來的資料 char name[9]; //char locationfile[80];//檔案路徑 //char ch; //printf("請輸入檔案絕對路徑:"); //scanf("%s", locationfile); fp = fopen("test.txt","r");//開啟檔案 if (fp == NULL) //判斷是否正常開啟檔案 { printf("讀取檔案失敗\n\n"); exit(0); } else { printf("讀取檔案成功\n\n"); } for (i = 0; i <= 9;i++) //按照檔案裡的資料格式 迴圈的讀入每一行的資料,並存入相應的陣列快取中 { fscanf(fp,"%d %c %d %d %d %d %d\n",&ID[i],&name[i],&YW[i],&SX[i],&YY[i],&DL[i],&SW[i]); } //ch= fgetc(fp); fclose(fp);//操作檔案結束必須關閉檔案指標 for (j = 0; j <9; j++)//將數組裡的資料打印出來看看是否正確 { printf("%d %c %d %d %d %d %d\n", ID[j], name[j], YW[j], SX[j], YY[j], DL[j], SW[j]); } for (int m = 1; m <= 9; m++)//迴圈呼叫連結串列插入函式,將陣列值寫入連結串列中 { s = insert(head, ID[m-1], name[m-1], YW[m-1], SX[m-1], YY[m-1], DL[m-1], SW[m-1], m); } dispaly(s);//將連結串列的各個節點值打印出來 }