連結串列可以解決很多實際問題,比如資料結構課程上講的多項式運算、求解約瑟夫問題,作業系統原理中的記憶體管理器實現等等。舉一個在Windows透過連結串列搜尋檔案的例項,程式碼如下(vc6.0中編譯透過)。
#include <stdio.h>
#include <windows.h>
struct DirList{
char table[256];
DirList *pNext;
};
DirList *first,*newlist,*last;
//加入資料夾連結串列
void AddList(char *list)
{
newlist=new DirList;
strcpy(newlist->table,list);
newlist->pNext=NULL;
//假如檔案連結串列為空,那麼第一個和最後一個節點都指向新節點
if(first==NULL)
first=newlist;
last=newlist;
}
//不為空,則原來最後一個節點指向新節點
else
last->pNext=newlist;
//查詢檔案,並把找到的資料夾加入資料夾連結串列
void FindFile(char *pRoad,char *pFile)
char FileRoad[256]={0};
char DirRoad[256]={0};
char FindedFile[256]={0};
char FindedDir[256]={0};
strcpy(FileRoad,pRoad);
strcpy(DirRoad,pRoad);
strcat(DirRoad,"\\*.*");
WIN32_FIND_DATA findData;
HANDLE hFindFile;
hFindFile=FindFirstFile(DirRoad,&findData);
if(hFindFile!=INVALID_HANDLE_VALUE)
do
if(findData.cFileName[0]==".")
continue;
//假如是資料夾,則假如資料夾列表
if(findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
strcpy(FindedDir,pRoad);
strcat(FindedDir,"\\");
strcat(FindedDir,findData.cFileName);
//加入資料夾列表
AddList(FindedDir);
memset(FindedDir,0x00,256);
//繼續查詢
}while(FindNextFile(hFindFile,&findData));
strcat(FileRoad,"\\");
strcat(FileRoad,pFile);
//查詢要查詢的檔案
hFindFile=FindFirstFile(FileRoad,&findData);
strcpy(FindedFile,pRoad);
strcat(FindedFile,"\\");
strcat(FindedFile,findData.cFileName);
//輸出查詢到的檔案
printf("%s\n",FindedFile);
memset(FindedFile,0x00,256);
int SeachFile(char *Directory,char *SeachFile)
DirList NewList;
strcpy(NewList.table,Directory);
NewList.pNext=NULL;
last=&NewList;
first=&NewList;
while(true)
DirList *Find;
//假如連結串列不為空,提取連結串列中的第一個節點,並把第一個節點指向原來第二個
if(first!=NULL)
//提取節點
Find=first;
//並把第一個節點指向原來第二個
first=first->pNext;
//在提取的節點的目錄下查詢檔案
FindFile(Find->table,SeachFile);
//為空則停止查詢
printf("檔案搜尋完畢\n");
return 0;
int main(int argc, char* argv[])
if (argc!=3) {
printf("程式名 檔案目錄 要搜尋的檔名\n");
SeachFile(argv[1],argv[2]);
執行效果如下,測試搜尋c:\windows目錄中的記事本程式notepad.exe。
連結串列可以解決很多實際問題,比如資料結構課程上講的多項式運算、求解約瑟夫問題,作業系統原理中的記憶體管理器實現等等。舉一個在Windows透過連結串列搜尋檔案的例項,程式碼如下(vc6.0中編譯透過)。
#include <stdio.h>
#include <windows.h>
struct DirList{
char table[256];
DirList *pNext;
};
DirList *first,*newlist,*last;
//加入資料夾連結串列
void AddList(char *list)
{
newlist=new DirList;
strcpy(newlist->table,list);
newlist->pNext=NULL;
//假如檔案連結串列為空,那麼第一個和最後一個節點都指向新節點
if(first==NULL)
{
first=newlist;
last=newlist;
}
//不為空,則原來最後一個節點指向新節點
else
{
last->pNext=newlist;
last=newlist;
}
}
//查詢檔案,並把找到的資料夾加入資料夾連結串列
void FindFile(char *pRoad,char *pFile)
{
char FileRoad[256]={0};
char DirRoad[256]={0};
char FindedFile[256]={0};
char FindedDir[256]={0};
strcpy(FileRoad,pRoad);
strcpy(DirRoad,pRoad);
strcat(DirRoad,"\\*.*");
WIN32_FIND_DATA findData;
HANDLE hFindFile;
hFindFile=FindFirstFile(DirRoad,&findData);
if(hFindFile!=INVALID_HANDLE_VALUE)
{
do
{
if(findData.cFileName[0]==".")
continue;
//假如是資料夾,則假如資料夾列表
if(findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(FindedDir,pRoad);
strcat(FindedDir,"\\");
strcat(FindedDir,findData.cFileName);
//加入資料夾列表
AddList(FindedDir);
memset(FindedDir,0x00,256);
}
//繼續查詢
}while(FindNextFile(hFindFile,&findData));
}
strcat(FileRoad,"\\");
strcat(FileRoad,pFile);
//查詢要查詢的檔案
hFindFile=FindFirstFile(FileRoad,&findData);
if(hFindFile!=INVALID_HANDLE_VALUE)
{
do
{
strcpy(FindedFile,pRoad);
strcat(FindedFile,"\\");
strcat(FindedFile,findData.cFileName);
//輸出查詢到的檔案
printf("%s\n",FindedFile);
memset(FindedFile,0x00,256);
}while(FindNextFile(hFindFile,&findData));
}
}
int SeachFile(char *Directory,char *SeachFile)
{
DirList NewList;
strcpy(NewList.table,Directory);
NewList.pNext=NULL;
last=&NewList;
first=&NewList;
while(true)
{
DirList *Find;
//假如連結串列不為空,提取連結串列中的第一個節點,並把第一個節點指向原來第二個
if(first!=NULL)
{
//提取節點
Find=first;
//並把第一個節點指向原來第二個
first=first->pNext;
//在提取的節點的目錄下查詢檔案
FindFile(Find->table,SeachFile);
}
//為空則停止查詢
else
{
printf("檔案搜尋完畢\n");
return 0;
}
}
return 0;
}
int main(int argc, char* argv[])
{
if (argc!=3) {
printf("程式名 檔案目錄 要搜尋的檔名\n");
return 0;
}
SeachFile(argv[1],argv[2]);
return 0;
}
執行效果如下,測試搜尋c:\windows目錄中的記事本程式notepad.exe。