[問題] 結構‧檔案‧鏈結串列

看板Programming作者時間13年前 (2012/01/25 20:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
建立鏈結串列: 鏈結串列中,每個節點有兩個成員,第一個成員用來存放資料,第二個成員用來儲存指向下一個節點的指標,宣告方式如下: struct node { int data; struct node *next; }; 功能需求如下: 讀取H5_1.txt,文件內容由整數與符號組成,數字以逗號(,)作為區隔,將數字存入鏈結串列中,由小到大排序串列中所有data成員(禁止使用QSRT函式)。1. 由H5_2.txt讀取出的數字插入鏈結串列,仍須保持由小到大排序,將插入結果與串列內容寫入H5_Add.txt;2. 插入後的鏈結串列中所有data成員出現在H5_3.txt則刪除該成員,將刪除後的串列內容寫入H5_Del.txt。形式如下: PS: H5_1.txt、H5_2.txt、H5_3.txt內容皆由整數與符號組成,此次作業禁止使用陣列,否則不給分。 範例: H5_1.txt 2,1 H5_2.txt 3,4 H5_3.txt 1 H5_Add.txt Data1:1 Data2:2 Data3:3 Data4:4 Node1: 22FEF0 Node2: 22FEF4 Node3: 22FEF8 Node4: 22FEFC H5_Del.txt Data1:2 Data2:3 Data3:4 Node1: 22FEF4 Node2: 22FEF8 Node3: 22FEFC 我想了很久以後寫了下列的程式碼,結果是可以成功印出H5_Add.txt,但是詭異的是每次印出來的位址都不一樣,至於H5_Del.txt則是會刪錯數字,到底是哪裡有問題?誰可以幫我看一下嗎? #include<stdio.h> #include<stdlib.h> struct node//定義結構node { int data;//資料成員 struct node *next;//鏈結成員,存放指向下一個節點的指標 }; typedef struct node NODE;//將struct node定義成NODE型態 NODE *INSERT,*first=NULL,*previous,*current;//宣告指向NODE型態的指標INSERT,first,previous,current,並將first設為起始指標 int main() { FILE *fptr1,*fptr2;//宣告指向檔案的指標fptr1,fptr2 fptr1=fopen("H5_1.txt","r");//用fptr1指向H5_1.txt,開啟H5_1.txt以供讀取 fptr2=fopen("H5_2.txt","r");//用fptr2指向H5_2.txt,開啟H5_2.txt以供讀取 int n;//宣告整數變數n char ch;//宣告字元變數ch while(fscanf(fptr1,"%d%c",&n,&ch)!=EOF)//判斷是否到達H5_1.txt的檔尾 sortedinsert(n);//呼叫sortedinsert()函數 while(fscanf(fptr2,"%d%c",&n,&ch)!=EOF)//判斷是否到達H5_2.txt的檔尾 sortedinsert(n);//呼叫sortedinsert()函數 outputadd();//呼叫outputadd()函數,將H5_Add.txt的數字由小到大排列,並依照順序印出數字位址 deletenode();//呼叫deletenode()函數 outputdel();//呼叫outputdel()函數,將H5_Del.txt的數字由小到大排列,並依照順序印出數字位址 fclose(fptr1);//關閉H5_1.txt fclose(fptr2);//關閉H5_2.txt return 0; } void sortedinsert(int i)//sortedinsert()函數 { INSERT=(NODE*)malloc(sizeof(NODE));//配置可存放NODE的記憶空間,並把INSERT指向它 INSERT->data=i;//將插入的data設為i INSERT->next=NULL;//將插入的節點的下一個節點指向NULL if(first==NULL)//如果第一個節點的值是NULL first=INSERT;//將第一個節點指向插入的節點 else if((INSERT->data)<(first->data))//如果插入的data小於第一個data { INSERT->next=first;//將插入節點的下一個節點指向第一個節點 first=INSERT;//將第一個節點指向插入的節點 } else//如果插入的data大於第一個data { previous=first;//將之前的節點指向第一個節點 current=first->next;//將現在的節點指向第一個節點的下一個節點 while(current!=NULL)//現在的節點不是NULL就執行以下迴圈 { if((INSERT->data)<(current->data))//如果插入的data小於現在的data break; else { previous=current;//將之前的節點指向現在的節點 current=current->next;//將現在的節點指向現在節點的下一個節點 } } INSERT->next=current;//將插入節點的下一個節點指向現在的節點 previous->next=INSERT;//將之前節點的下一個節點指向插入的節點 } } void outputadd()//outputadd()函數 { FILE *fptradd;//宣告指向檔案的指標fptradd fptradd=fopen("H5_Add.txt","w");//用fptradd指向H5_Add.txt,開啟H5_Add.txt以供寫入 current=first;//將現在的節點指向第一個節點 int j=1;//宣告整數變數j,並將j的初始值設為1 while(current!=NULL)//現在的節點不是NULL就執行以下迴圈 { fprintf(fptradd,"Data%d:%d\n",j,current->data);//依序印出第j個data的值 j++; current=current->next;//印完後就將現在的節點指向現在節點的下一個節點 } current=first;//重新將之前的節點指向第一個節點 j=1;//重新將j的初始值設為1 while(current!=NULL)//現在的節點不是NULL就執行以下迴圈 { fprintf(fptradd,"Node%d:%p\n",j,current);//依序印出第j個data的位址 j++; current=current->next;//印完後就將現在的節點指向現在節點的下一個節點 } fclose(fptradd);//關閉H5_Add.txt } void deletenode(int m)//deletenode()函數 { INSERT=(NODE*)malloc(sizeof(NODE));//配置可存放NODE的記憶空間,並把INSERT\ 指向它 INSERT->data=m;//將插入的data設為m INSERT->next=NULL;//將插入的節點的下一個節點指向NULL if(first==NULL)//如果串列是空的 return NULL;//回傳NULL else if((INSERT->data)==(first->data))//如果插入的data等於第一個data { first=first->next;//將第一個節點指向下一個節點 INSERT->next=first->next;//將插入節點的下一個節點指向第一個節點的下一個節點 } else { if(INSERT->next!=NULL) previous->next=current->next; else previous->next=NULL; } free(INSERT); } void outputdel()//outputdel()函數 { FILE *fptrdel;//宣告指向檔案的指標fptrdel fptrdel=fopen("H5_Del.txt","w");//用fptrdel指向H5_Del.txt,開啟H5_Del.txt以供寫入 current=first;//將現在的節點指向第一個節點 int k=1;//宣告整數變數k,並將k的初始值設為1 while(current!=NULL)//現在的節點不是NULL就執行以下迴圈 { fprintf(fptrdel,"Data%d:%d\n",k,current->data);//依序印出第k個data的值 k++; current=current->next;//印完後就將現在的節點指向現在節點的下一個節點 } current=first;//重新將之前的節點指向第一個節點 k=1;//重新將k的初始值設為1 while(current!=NULL)//現在的節點不是NULL就執行以下迴圈 { fprintf(fptrdel,"Node%d:%p\n",k,current);//依序印出第k個data的位址 k++; current=current->next;//印完後就將現在的節點指向現在節點的下一個節點 } fclose(fptrdel);//關閉H5_Del.txt } 我的觀念不熟,所以可能會有註解錯誤的地方,請各位高手不吝賜教! -- ※ Origin: 交大次世代(bs2.to) ◆ From: 218-160-191-13.dynamic.hinet.net
文章代碼(AID): #1F7-x-hc (Programming)
文章代碼(AID): #1F7-x-hc (Programming)