操作系统——文件物理结构模拟代码实现

文件物理结构模拟

顺序文件

逻辑上连续的文件信息依次存放在若干连续的物理块中。

链接文件

逻辑上连续的文件信息依次存放在不连续的物理块中,各个块之间通过指针连接,便形成链接文件。

索引文件

逻辑上连续的文件一次存放在若干不连续的物理块中,系统建立索引表,将所有文件按照逻辑顺序存放在其中形成索引文件。

代码中索引文件并没有实现建立索引表,只是在打印中将地址信息打印了一下,索引表和链接文件在代码结构上采用了相同的结构,都是链接表的方式。

#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;
}
发布了77 篇原创文章 · 获赞 7 · 访问量 9042

猜你喜欢

转载自blog.csdn.net/qq_41886231/article/details/103592034