操作系統——文件物理結構模擬代碼實現

文件物理結構模擬

順序文件

邏輯上連續的文件信息依次存放在若干連續的物理塊中。

鏈接文件

邏輯上連續的文件信息依次存放在不連續的物理塊中,各個塊之間通過指針連接,便形成鏈接文件。

索引文件

邏輯上連續的文件一次存放在若干不連續的物理塊中,系統建立索引表,將所有文件按照邏輯順序存放在其中形成索引文件。

 

代碼中索引文件並沒有實現建立索引表,只是在打印中將地址信息打印了一下,索引表和鏈接文件在代碼結構上採用了相同的結構,都是鏈接表的方式。

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章