[問題] 結構‧檔案‧鏈結串列
建立鏈結串列:
鏈結串列中,每個節點有兩個成員,第一個成員用來存放資料,第二個成員用來儲存指向下一個節點的指標,宣告方式如下:
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
Programming 近期熱門文章
PTT數位生活區 即時熱門文章