文件物理結構模擬
順序文件
邏輯上連續的文件信息依次存放在若干連續的物理塊中。
鏈接文件
邏輯上連續的文件信息依次存放在不連續的物理塊中,各個塊之間通過指針連接,便形成鏈接文件。
索引文件
邏輯上連續的文件一次存放在若干不連續的物理塊中,系統建立索引表,將所有文件按照邏輯順序存放在其中形成索引文件。
代碼中索引文件並沒有實現建立索引表,只是在打印中將地址信息打印了一下,索引表和鏈接文件在代碼結構上採用了相同的結構,都是鏈接表的方式。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
/*Sequential*/
int *arr;
int Size;
struct file_D
{
int Start;
int End;
int Data;
} file[100];
int Data_sum;
/*Linked*/
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
struct Linked_D
{
int Start;
int End;
int Data;
} link[100];
int Link_sum;
int createlist(LinkList & L)
{
LinkList p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->data = Size;
for(int i=Size-1; i>=0; i--)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = -1;
p->next = L->next;
L->next = p;
}
return 0;
}
void Linked_Create(LinkList & L)
{
Link_sum++;
cout<<"\nPlease input data:(integer)";
bool flag1=0;
bool flag2=0;
cin>>link[Link_sum].Data;
while(1)
{
cout<<"\nPlease input start location(0-"<<Size-1<<"):";
cin>> link[Link_sum].Start;
cout<<"\nplease input end location(0-"<<Size-1<<"):";
cin>> link[Link_sum].End;
if(link[Link_sum].End>=0&&link[Link_sum].End<Size&&link[Link_sum].End>=link[Link_sum].Start)
flag1=1;
/*檢測起始位置到結束位置的空間內是否存儲了數據*/
LinkList q;
q= L->next;
int j=1;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
int test = q->data;
if(test!=-1)
{
flag2=1;
break;
}
q=q->next;
j++;
}
if(flag1==1&&flag2==0)
break;
else
cout<<"\n****Input Error*****\n"<<endl;
}
/*將數據存入鏈表中*/
LinkList q;
q = L->next;
int j=0;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
q->data=link[Link_sum].Data;
q=q->next;
j++;
}
/*輸出*/
q = L->next;
while(q!=NULL)
{
cout<< q->data <<" ";
q = q->next;
}
}
void Linked_Delete(LinkList & L)
{
LinkList q;
int flag=0;
int i;
int delete_data;
cout<<"Please input the Delete data:";
cin>>delete_data;
/*是否存在刪除數據*/
for(i=1; i<=Link_sum; i++)
{
if(delete_data==link[i].Data)
{
flag=i;
break;
}
}
if(i>Link_sum)
cout<<"\nDelete Error\n"<<endl;
else
{
q= L->next;
int j=0;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
q->data=-1;
q=q->next;
j++;
}
cout<<"\nDelete Success\n"<<endl;
}
/*輸出*/
q = L->next;
while(q!=NULL)
{
cout<< q->data <<" ";
q = q->next;
}
}
void Link_output(LinkList & L)
{
LinkList q;
q = L->next;
cout<<"\n";
while(q!=NULL)
{
cout<< q->data <<" ";
q = q->next;
}
cout<<"\n";
}
void Linked()
{
LinkList L;
cout << "\nplease input the size:";
cin >> Size;
createlist(L);//創建鏈表,賦初值
while(1)
{
int flag=0;
int t;
cout<<"\n***********************"<<endl;
cout<<"1.Create File"<<endl;
cout<<"2.Delete File"<<endl;
cout<<"3.Show reveal bring out"<<endl;
cout<<"4.Exit"<<endl;
cout<<"***********************"<<endl;
cout<<"please input your choice:";
cin>>t;
switch(t)
{
case 1:
Linked_Create(L);
break;
case 2:
Linked_Delete(L);
break;
case 3:
Link_output(L);
break;
case 4:
flag=1;
break;
default:
break;
}
if(flag==1)
break;
}
free(arr);
}
/*Sequential*/
void Bring_out()
{
cout<<"\nAt Present Bring out:"<<endl;
for(int i=0; i<Size; i++)
{
if(i==0)
cout<<arr[i]<<" ";
else if(i%10==0)
cout<<arr[i]<<endl;
else
cout<<arr[i]<<" ";
}
}
void choice()
{
cout<<"-----FZJ-----"<<endl;
cout<<"*************"<<endl;
cout<<"1.Sequential"<<endl;
cout<<"2.Linked"<<endl;
cout<<"3.Indexes"<<endl;
cout<<"4.exit"<<endl;
cout<<"*************"<<endl;
}
void Sequential_Create()
{
bool flag1=0;
bool flag2=0;
Data_sum++;
cout<<"\nPlease input data:(integer)";
cin>>file[Data_sum].Data;
while(1)
{
cout<<"\nPlease input start location(0-"<<Size-1<<"):";
cin>> file[Data_sum].Start;
cout<<"\nplease input end location(0-"<<Size-1<<"):";
cin>> file[Data_sum].End;
if(file[Data_sum].End>=0&&file[Data_sum].End<Size&&file[Data_sum].End>=file[Data_sum].Start)
flag1=1;
for(int i=file[Data_sum].Start; i<=file[Data_sum].End; i++)
{
if(arr[i]!=-1)
{
flag2=1;
break;
}
}
if(flag1==1&&flag2==0)
break;
else
cout<<"\n****Input Error*****\n"<<endl;
}
for(int i=file[Data_sum].Start; i<=file[Data_sum].End; i++)
arr[i]=file[Data_sum].Data;
Bring_out();
}
void Sequential_Delete()
{
int flag=0;
int i;
int delete_data;
cout<<"Please input the Delete data:";
cin>>delete_data;
for(i=1; i<=Data_sum; i++)
{
if(delete_data==file[i].Data)
{
flag=i;
break;
}
}
if(i>Data_sum)
cout<<"\nDelete Error\n"<<endl;
else
{
for(int i=file[flag].Start; i<=file[flag].End; i++)
{
arr[i]=-1;
}
cout<<"\nDelete Success\n"<<endl;
}
Bring_out();
}
void Sequential()
{
cout << "\nplease input the size:";
cin >> Size;
arr = (int*)malloc(sizeof(int)*Size);
for(int i=0; i<Size; i++)
arr[i]=-1;
while(1)
{
int flag=0;
int t;
cout<<"\n***********************"<<endl;
cout<<"1.Create File"<<endl;
cout<<"2.Delete File"<<endl;
cout<<"3.Show reveal bring out"<<endl;
cout<<"4.Exit"<<endl;
cout<<"***********************"<<endl;
cout<<"please input your choice:";
cin>>t;
switch(t)
{
case 1:
Sequential_Create();
break;
case 2:
Sequential_Delete();
break;
case 3:
Bring_out();
break;
case 4:
flag=1;
break;
default:
break;
}
if(flag==1)
break;
}
free(arr);
}
void Indexes_Create(LinkList & L)
{
Link_sum++;
cout<<"\nPlease input data:(integer)";
bool flag1=0;
bool flag2=0;
cin>>link[Link_sum].Data;
while(1)
{
cout<<"\nPlease input start location(0-"<<Size-1<<"):";
cin>> link[Link_sum].Start;
cout<<"\nplease input end location(0-"<<Size-1<<"):";
cin>> link[Link_sum].End;
if(link[Link_sum].End>=0&&link[Link_sum].End<Size&&link[Link_sum].End>=link[Link_sum].Start)
flag1=1;
/*檢測起始位置到結束位置的空間內是否存儲了數據*/
LinkList q;
q= L->next;
int j=1;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
int test = q->data;
if(test!=-1)
{
flag2=1;
break;
}
q=q->next;
j++;
}
if(flag1==1&&flag2==0)
break;
else
cout<<"\n****Input Error*****\n"<<endl;
}
/*將數據存入鏈表中*/
LinkList q;
q = L->next;
int j=0;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
q->data=link[Link_sum].Data;
q=q->next;
j++;
}
/*輸出*/
q = L->next;
while(q!=NULL)
{
cout<< &q->data<<":"<< q->data <<" ";
q = q->next;
}
}
void Indexes_Delete(LinkList & L)
{
LinkList q;
int flag=0;
int i;
int delete_data;
cout<<"Please input the Delete data:";
cin>>delete_data;
/*是否存在刪除數據*/
for(i=1; i<=Link_sum; i++)
{
if(delete_data==link[i].Data)
{
flag=i;
break;
}
}
if(i>Link_sum)
cout<<"\nDelete Error\n"<<endl;
else
{
q= L->next;
int j=0;
while(j<link[Link_sum].Start)
{
q=q->next;
j++;
}
while(j<=link[Link_sum].End)
{
q->data=-1;
q=q->next;
j++;
}
cout<<"\nDelete Success\n"<<endl;
}
/*輸出*/
q = L->next;
while(q!=NULL)
{
cout<< &q->data<<":"<< q->data <<" ";
q = q->next;
}
}
void Indexes_output(LinkList & L)
{
LinkList q;
q = L->next;
cout<<"\n";
while(q!=NULL)
{
cout<< &q->data<<":"<< q->data <<" ";
q = q->next;
}
cout<<"\n";
}
void Indexes()
{
LinkList L;
cout << "\nplease input the size:";
cin >> Size;
createlist(L);//創建鏈表,賦初值
while(1)
{
int flag=0;
int t;
cout<<"\n***********************"<<endl;
cout<<"1.Create File"<<endl;
cout<<"2.Delete File"<<endl;
cout<<"3.Show reveal bring out"<<endl;
cout<<"4.Exit"<<endl;
cout<<"***********************"<<endl;
cout<<"please input your choice:";
cin>>t;
switch(t)
{
case 1:
Indexes_Create(L);
break;
case 2:
Linked_Delete(L);
break;
case 3:
Indexes_output(L);
break;
case 4:
flag=1;
break;
default:
break;
}
if(flag==1)
break;
}
free(arr);
}
int main()
{
bool flag=0;
int t;
int Data_sum=0;
while(1)
{
choice();
cout<<"please input your choice:";
cin>>t;
switch(t)
{
case 1:
Sequential();
break;
case 2:
Linked();
break;
case 3:
Indexes();
break;
case 4:
flag=1;
break;
default:
break;
}
if(flag==1)
break;
}
return 0;
}