File Structure Lab Programs -Part B


    File structure- PART-B 

                                                     PROGRAM-7

#include<fstream.h>
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<process.h>

void write_file()
{
char name[20][20],temp[20];
fstream f1("file1.txt",ios::out);
fstream f2("file2.txt",ios::out);
int i,j,m,n;
if((!f1)||(!f2))
{
cout<<"Unable to open the files!!\n";
exit(0);
}
cout<<"Enter the number of records in file 1: ";
cin>>m;
cout<<"Enter the names:\n";
for(i=0;i<m;i++)
cin>>name[i];
for(i=0;i<m-1;i++)
{
for(j=0;j<m-i-1;j++)
{
if(strcmp(name[j],name[j+1])>0)
{
strcpy(temp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
}
}
}
for(i=0;i<m;i++)
f1<<name[i]<<endl;
cout<<"Enter the number of records in file 2: ";
cin>>n;
cout<<"Enter the names:\n";
for(i=0;i<n;i++)
cin>>name[i];
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(strcmp(name[j],name[j+1])>0)
{
strcpy(temp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
}
}
}
for(i=0;i<n;i++)
f2<<name[i]<<endl;
f1.close();
f2.close();
}

void main()
{
fstream f1("file1.txt",ios::in);
fstream f2("file2.txt",ios::in);
fstream f3("output.txt",ios::out);
char l1[100][20],l2[100][20],l3[100][20];
int i=0,j=0,k=0,m=0,n=0;
write_file();
if((!f1)||(!f2)||(!f3))
{
cout<<"Unable to open the files!!\n";
exit(0);
}
cout<<"Contents of file 1 are:\n";
while(!f1.eof())
{
f1.getline(l1[i],20,'\n');
cout<<l1[i++]<<endl;
m++;
}
cout<<"Contents of file 2 are:\n";
while(!f2.eof())
{
f2.getline(l2[j],20,'\n');
cout<<l2[j++]<<endl;
n++;
}
m--;
n--;
i=0,j=0;
while(i<m&&j<n)
{
if(strcmp(l1[i],l2[j])==0)
{
strcpy(l3[k],l1[i]);
f3<<l3[k]<<endl;
i++;
j++;
k++;
}
else if(strcmp(l1[i],l2[j])<0)
i++;
else
j++;
}
if(k==0)
cout<<"No common names!!\n";
else
{
cout<<"The names that are common are:\n";
for(i=0;i<k;i++)
cout<<l3[i]<<endl;
}
}
==========================================================
==========================================================
                                                 PROGRAM-8

#include<stdio.h>
#include<iostream.h>
#include<fstream.h>
#include<string.h>

class record
{
public:
char name[20],usn[20];
}rec[20];

char fname[8][8]={"1.txt","2.txt","3.txt","4.txt","5.txt","6.txt","7.txt","8.txt"};
fstream file[8];
int n;

void merge_file(char *fil1,char *fil2,char *fil)
{
record rcd[20];
fstream f1(fil1,ios::in);
fstream f2(fil2,ios::in);
fstream f3(fil,ios::out);
int i,j,k=0,k1;
record temp;
while(!f1.eof())
{
f1.getline(rcd[k].name,20,'|');
f1.getline(rcd[k++].usn,20);
}
while(!f2.eof())
{
f2.getline(rcd[k].name,20,'|');
f2.getline(rcd[k++].usn,20);
}
k1=k;
for(i=0;i<k-2;i++)
{
for(j=0;j<k-i-2;j++)
{
if(strcmp(rcd[j].name,rcd[j+1].name)>0)
{
temp=rcd[j];
rcd[j]=rcd[j+1];
rcd[j+1]=temp;
}
else if(strcmp(rcd[j].name,rcd[j+1].name)==0)
{
if(strcmp(rcd[j].usn,rcd[j+1].usn)>0)
{
temp=rcd[j];
rcd[j]=rcd[j+1];
rcd[j+1]=temp;
}
else if(strcmp(rcd[j].usn,rcd[j+1].usn)==0)
{
j++;
k1--;
n--;
}
}
}
}
for(i=1;i<k1-1;i++)
{
f3<<rcd[i].name<<"|"<<rcd[i].usn<<endl;
}
f1.close();
f2.close();
f3.close();
}

void k_merge()
{
char filname[7][20]={"11.txt","22.txt","33.txt","44.txt","111.txt","222.txt","1111.txt"};
int i,j=0;
for(i=0;i<8;i+=2)
merge_file(fname[i],fname[i+1],filname[j++]);
j=4;
for(i=0;i<4;i+=2)
merge_file(filname[i],filname[i+1],filname[j++]);
merge_file(filname[4],filname[5],filname[6]);
}

void main()
{
int i;
char name[20],usn[20];
n=0;
for(i=0;i<8;i++)
file[i].open(fname[i],ios::out);
cout<<"Enter number of records: ";
cin>>n;
cout<<"Enter Name and USN:\n";
for(i=0;i<n;i++)
{
cout<<"Student "<<i+1<<" : ";
cin>>rec[i].name>>rec[i].usn;
file[i%8]<<rec[i].name<<"|"<<rec[i].usn<<endl;
}
for(i=0;i<8;i++)
file[i].close();
k_merge();
fstream output("1111.txt",ios::in);
cout<<"\nThe sorted records are:\n";
cout<<"NAME\tUSN\n";
for(i=0;i<n;i++)
{
output.getline(name,20,'|');
output.getline(usn,20);
cout<<name<<"\t"<<usn<<endl;
}
}
==========================================================
==========================================================
                                      PROGRAM-9
#include<iostream.h>
#include<stdio.h>
#include<fstream.h>
#include<stdlib.h>
#include<string.h>
class node
{
    public:
    int a[4];
    node * next[4];
    node * parent;
    int size;
    node();
};

node :: node()
{
      for(int i = 0; i < 4; i++)
  next[i] = NULL;
      parent = NULL;
      size = 0;
}

class btree
{
    node * root;
    public:
    node* findLeaf(int key,int &level);
    void updateKey(node *p,node *c,int newKey);
    void search(int key);
    void insert(int key);
    void insertIntoNode(node *n,int key,node *address);
    void promote(node *n,int key,node *address);
    node* split(node *n);
    void traverse(node  *ptr);
    btree();
};

void btree :: traverse(node *ptr)
{
      if(ptr == NULL)
return;
      for(int i = 0; i < ptr->size; i++)
    cout<<ptr->a[i]<<"    ";
      cout<<endl;
      for(i = 0;  i < ptr->size;i++)
  traverse(ptr->next[i]);
    
}

btree :: btree()
{
    root = NULL;
}

node* btree :: findLeaf(int key,int &level)
{
    node *ptr = root;
    node *prevptr = NULL;
    level = 0;
    int i;
    while(ptr)
    {
 i = 0;
  level++;
  cout<<level<<endl;
 while(i < ptr -> size-1 && key > ptr -> a[i])
i++;
  prevptr = ptr;
 ptr = ptr -> next[i];
    }
    return prevptr;
}

node* btree :: split(node *n)
{
    int midpoint = (n -> size+1)/2;
    int newsize = n->size - midpoint;
    node *newptr = new node;
    node *child;
    newptr->parent = n -> parent;
    int i;
    for(i = 0; i < midpoint; i++)
    {
newptr->a[i] = n->a[i];
newptr ->next[i] = n->next[i];
n->a[i] = n->a[i+midpoint];
n->next[i] = n->next[i+midpoint];
    }
    n->size = midpoint;
    newptr -> size = newsize;
    for( i = 0; i < n->size; i++)
    {
child = n->next[i];
if(child!= NULL)
child -> parent = n;
    }
    for( i  = 0; i < newptr -> size; i++)
    {
child = newptr -> next[i];
if(child!= NULL)
child -> parent = newptr;
    }
    return newptr;
}

void btree :: updateKey(node *parent,node *child,int newkey)
{
     if(parent == NULL)
return;
      if(parent->size == 0)
    return;
      int oldkey = child->a[child->size-2];
  while(parent)
  {
      for(int i = 0; i < parent->size;i++)
  if(parent->a[i] == oldkey)
  { 
 parent->a[i] = newkey;
     parent->next[i] = child;
  }
  child=parent;
  parent=parent->parent;
  }
  
}
void btree :: insertIntoNode(node *n,int key,node *address)
{
    int i;
    if( n == NULL)
return;
    
    for(i = 0; i < n->size; i++)
if(n->a[i] == key)
    return;

    i = n->size-1;
    while(i >= 0 && n -> a[i] > key)
    {
n->a[i+1] = n->a[i];
n->next[i+1] = n->next[i];
i--;
    }
    i++;
    n->a[i] = key;
    n->next[i] = address;
    n->size++;
    if( i == n->size-1)
updateKey(n->parent,n,key);
}

void btree :: promote(node *n,int key,node *address)
{
    if( n == NULL)
return;

    if(n -> size < 4)
    {
insertIntoNode(n,key,address);
return;
    }

    if( n == root)
    {
root = new node;
n->parent = root;
    }
    node *newptr = split(n);
    node *t;
    if(key < n->a[0])
  t = newptr;
    else
  t = n;
    insertIntoNode(t,key,address);
    promote(n->parent,n->a[n->size-1],n);
    promote(newptr->parent,newptr->a[newptr->size-1],newptr);
    
}

void btree :: insert(int key)
{
    if( root == NULL)
    {
  root = new node;
  root->a[root->size] = key;
  root->size++;
  return;
    }
    int level;
    node *leaf = findLeaf(key,level);
    int i;
    for(i = 0; i < leaf->size; i++)
if(leaf -> a[i] == key)
{
cout<<"The Key to be inserted already exists"<<endl;
return;
}
    promote(leaf,key,NULL);
     cout<<"---------------\n";
      traverse(root);
      cout<<"----------------\n";
}
    
void btree :: search(int key)
{
       if(root == NULL)
      {   cout<<"The tree Does not exist"<<endl;
  return;
      }
      int level;
      node *leaf = findLeaf(key,level);
      int flag = 0;
      for(int i = 0; i < leaf ->size; i++)
  if(leaf->a[i] == key)
  {
      flag = 1;
      cout<<"The Key "<<key<<" Exists in the B-Tree at the level"<<level<<endl;
  }
      if(!flag)
  cout<<"The Key Searched for was not found"<<endl;
}

int main()
{
    btree b; 
    int choice = 1,key;
    while(choice !=3)
    {
    cout<<"1.Insert a Key\n";
    cout<<"2.Search a key\n";
    cout<<"3.Exit\n";
    cin>>choice;
    switch(choice)

{
  case 1: cout<<"Enter The Key to be inserted in B-Tree\n";
  cin>>key;
  b.insert(key);
  break;
  case 2: cout<<"Enter The key to be searched\n";
  cin>>key;
  b.search(key);
  break;
    }
    }
    return 0;
}
==========================================================
==========================================================
                                          PROGRAM-10
#include<iostream.h>
#include<stdio.h>
#include<fstream.h>
#include<stdlib.h>
#include<string.h>

class node
{
    public:
    int a[4];
    node * next[4];
    node * parent;
    int size;
    node();
};

class linkleaf
{
    public:
    node * data;
    linkleaf *next;
    linkleaf();
};

linkleaf :: linkleaf()
{
  next = NULL;
}

node :: node()
{
      for(int i = 0; i < 4; i++)
  next[i] = NULL;
      parent = NULL;
      size = 0;
}

class btree
{
    node * root;
    linkleaf *head;
    int flag;
    public:
    node* findLeaf(int key,int &level);
    void updateKey(node *p,node *c,int newKey);
    void search(int key);
    void insert(int key);
    void insertIntoNode(node *n,int key,node *address);
    void promote(node *n,int key,node *address);
    node* split(node *n);
    void traverse(node  *ptr);
    void connectLeaf(node *n,node *newptr);
    void traverseleaf();
    btree();
};

void btree :: traverseleaf()
{
    linkleaf * ptr = head;
    int i;
    while(ptr)
    {
  for(i = 0; i < ptr -> data -> size; i++)
cout<<ptr -> data -> a[i]<<"    ";
  cout<<endl;
  ptr = ptr ->next;
    }
}

void btree :: connectLeaf(node *n,node *newptr)
{
    linkleaf *ptr = head,*prevptr = NULL,*p;
    while(ptr)
    {
if(ptr-> data == n)
    break;
prevptr = ptr;
ptr = ptr ->next;
    }
    if( ptr == NULL)
    {
    cout<<"Unexpected Error!!";
    exit(0);
    }

    if( ptr == head)
    {
p = new linkleaf;
p -> next = head;
head = p;
p->data = newptr;
    }
    else
    {
p = new linkleaf;
p-> next = ptr;
prevptr -> next = p;
p->data = newptr;
    }
   
}

void btree :: traverse(node *ptr)
{
      int i;
      if(ptr == NULL)
return;
      for(i = 0; i < ptr->size; i++)
    cout<<ptr->a[i]<<"    ";
      cout<<endl;
      for(i = 0;  i < ptr->size;i++)
  traverse(ptr->next[i]);
    
}

btree :: btree()
{
    root = NULL;
    head = NULL;
}

node* btree :: findLeaf(int key,int &level)
{
    node *ptr = root;
    node *prevptr = NULL;
    level = 0;
    int i;
    while(ptr)
    {
 i = 0;
  level++;
 while(i < ptr -> size-1 && key > ptr -> a[i])
i++;
  prevptr = ptr;
 ptr = ptr -> next[i];
    }
    return prevptr;
}

node* btree :: split(node *n)
{
    int midpoint = (n -> size+1)/2;
    int newsize = n->size - midpoint;
    node *newptr = new node;
    node *child;
    newptr->parent = n -> parent;
    int i;
    for(i = 0; i < midpoint; i++)
    {
newptr->a[i] = n->a[i];
newptr ->next[i] = n->next[i];
n->a[i] = n->a[i+midpoint];
n->next[i] = n->next[i+midpoint];
    }
    n->size = midpoint;
    newptr -> size = newsize;
    for( i = 0; i < n->size; i++)
    {
child = n->next[i];
if(child!= NULL)
child -> parent = n;
    }
    for( i  = 0; i < newptr -> size; i++)
    {
child = newptr -> next[i];
if(child!= NULL)
child -> parent = newptr;
    }
    return newptr;
}

void btree :: updateKey(node *parent,node *child,int newkey)
{
      if( parent == NULL)
return;
      if(parent->size == 0)
    return;
      int oldkey = child->a[child->size-2];
      while(parent)
  {
      for(int i = 0; i < parent->size;i++)
  if(parent->a[i] == oldkey)
  { 
 parent->a[i] = newkey;
     parent->next[i] = child;
  }
  child=parent;
  parent=parent->parent;
  }
}

void btree :: insertIntoNode(node *n,int key,node *address)
{
    int i;
    if( n == NULL)
return;
    
    for(i = 0; i < n->size; i++)
if(n->a[i] == key)
    return;

    i = n->size-1;
    while(i >= 0 && n -> a[i] > key)
    {
n->a[i+1] = n->a[i];
n->next[i+1] = n->next[i];
i--;
    }
    i++;
    n->a[i] = key;
    n->next[i] = address;
    n->size++;
    if( i == n->size-1)
updateKey(n->parent,n,key);
}

void btree :: promote(node *n,int key,node *address)
{
    if( n == NULL)
return;

    if(n -> size < 4)
    {
insertIntoNode(n,key,address);
return;
    }

    if( n == root)
    {
root = new node;
n->parent = root;
    }
    node *newptr = split(n);
    node *t;
    if(key < n->a[0])
  t = newptr;
    else
  t = n;
    insertIntoNode(t,key,address);
    if(!flag)
    {   connectLeaf(n,newptr);flag = 1;}
    promote(n->parent,n->a[n->size-1],n);
    promote(newptr->parent,newptr->a[newptr->size-1],newptr);
    
}

void btree :: insert(int key)
{
    flag = 0;
    if( root == NULL)
    {
  root = new node;
  root->a[root->size] = key;
  root->size++;
  head = new linkleaf;
  head -> data = root;
  return;
    }
    int level;
    node *leaf = findLeaf(key,level);
    int i;
    for(i = 0; i < leaf->size; i++)
if(leaf -> a[i] == key)
{
cout<<"The Key to be inserted already exists"<<endl;
return;
}
    promote(leaf,key,NULL);
     cout<<"---------------\n";
      traverse(root);
      cout<<"----------------\n";
}
    
void btree :: search(int key)
{
       if(root == NULL)
      {   cout<<"The tree Does not exist"<<endl;
  return;
      }
      int level;
      node *leaf = findLeaf(key,level);
      int flag = 0;
      for(int i = 0; i < leaf ->size; i++)
  if(leaf->a[i] == key)
  {
      flag = 1;
      cout<<"The Key "<<key<<" Exists in the B-Tree at the level"<<level<<endl;
  }
      if(!flag)
  cout<<"The Key Searched for was not found"<<endl;
}

int main()
{
    btree b;
    int choice = 1,key;
    while(choice <=3)
    {
    cout<<"1.Insert a Key\n";
    cout<<"2.Search a key\n";
    cout<<"3.Traverse Leaf\n";
    cout<<"4.Exit\n";
    cin>>choice;
    switch(choice)
    {
  case 1: cout<<"Enter The Key to be inserted in B-Tree\n";
  cin>>key;
  b.insert(key);
  break;
  case 2: cout<<"Enter The key to be searched\n";
  cin>>key;
  b.search(key);
  break;
  case 3: b. traverseleaf();
  break;
    }
    }
    return 0;
}
===========================================================
===========================================================
                                                   PROGRAM-11
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#include<string.h>
class node
{
public:
char name[15],usn[15];
node* next;
};
node*h[29];

void insert()
{
char name[15],usn[15],buf[50];
fstream file("student.txt",ios::app);
cout<<"enter name and usn";
cin>>name>>usn;
strcpy(buf,name);
strcat(buf,"|");
strcat(buf,usn);
strcat(buf,"\n");
file<<buf;
file.close();
}
void hash_ins(char name[],char usn[],int hash_key)
{
node*p,*prev,*cur;
p=new node;

strcpy(p->name,name);
strcpy(p->usn,usn);
p->next=NULL;
prev=NULL;
cur=h[hash_key];
if(cur==NULL)
{
h[hash_key]=p;
return;
}
while(cur!=NULL)
{
prev=cur;
cur=cur->next;
}
prev->next=p;
}
void display()
{
node*cur;
fstream file("student.txt",ios::in);
char name[15],usn[15];
int j,count;
for(int i=0;i<29;i++)
{
h[i]=NULL;
}
while(!file.eof())
{
file.getline(name,15,'|');
file.getline(usn,15);
count=0;
for(j=0;j<strlen(usn);j++)
count+=usn[j];
count=count%29;
hash_ins(name,usn,count);
}

for(i=0;i<29;i++)
{
cur=h[i];
if(cur!=NULL)
{
cout<<i<<"---";
while(cur!=NULL)
{
cout<<cur->name<<"|"<<cur->usn<<"\t";
cur=cur->next;
}
cout<<"\n";
}
}
file.close();
}
void retrieve()
{
fstream file("student.txt",ios::in);
char name[15],usn[15];
int j,count;
node*cur;
for(int i=0;i<29;i++)
{
h[i]=NULL;
}
while(!file.eof())
{
file.getline(name,15,'|');
file.getline(usn,15);
count=0;
for(j=0;j<strlen(usn);j++)
count+=usn[j];
count=count%29;
hash_ins(name,usn,count);
}
cout<<"enter usn\n";
cin>>usn;
count=0;
for(j=0;j<strlen(usn);j++)
count+=usn[j];
count=count%29;
cur=h[count];
if(cur==NULL)
{
cout<<"record not found\n";
return;
}
do 
{
if(strcmp(cur->usn,usn)==0)
{
cout<<"record found\nname:"<<cur->name<<"\nUSN:"<<cur->usn<<endl;
return;
}
else 
cur=cur->next;
}while(cur!=NULL);
}
void main()
{
int ch;
do
{
cout<<"1:insert 2:retrive 3:display the table 4:exit\n";
cout<<"enter your choice";
cin>>ch;
switch(ch)
{
case 1:insert();break;
case 2:retrieve();break;
case 3:display();break;
case 4:break;
}
}while(ch!=4);
}
=========================================================
=========================================================
                                               PROGRAM-12
#include<iostream.h>
#include<fstream.h>
#include<ostream.h>
#include<string.h>
#include<stdio.h>
class node
{
public:
node* next;
int offset;
node()
{
next=NULL;
offset=0;
}
};
node*first;
char p[20][20];
int nor;
char buff[90];
class student
{
 public:
 char name[20],usn[20],branch[20],sem[20];
 void del();
 void insert();
 void display();
};
void student::insert()
{
fstream f1("record.txt",ios::in|ios::out);
fstream f2("avail.txt",ios::out);
node*cur=first;
cout<<"enter the usn,name,branch,sem\n";
cin>>usn>>name>>branch>>sem;
for(int i=0;i<90;i++)
buff[i]=NULL;
strcpy(buff,usn);
strcat(buff,"|");
strcat(buff,name);
strcat(buff,"|");
strcat(buff,branch);
strcat(buff,"|");
strcat(buff,sem);
strcat(buff,"|");
if(cur==NULL)
{
f1.seekp(0,ios::end);
f1.write(buff,sizeof(buff));
strcpy(p[nor],usn);
nor++;
}
else
{
i=first->offset;
f1.seekp(i,ios::beg);
f1.write(buff,sizeof(buff));
node *cur=first;
first=first->next;
delete(cur);
strcpy(p[i/sizeof(buff)],usn);
}
cur=first;
while(cur)
{
f2<<cur->offset<<endl;
cur=cur->next;
}
f1.close();
f2.close();
}
void student::del()
{
fstream f1("record.txt",ios::in|ios::out);
fstream f2("avail.txt",ios::out);
cout<<"enter the usn to deleted\n";
char key[20];
int flag=-1;
cin>>key;
node *a;
for(int i=0;i<nor;i++)
if(strcmp(p[i],key)==0)
{
flag=i;
}
if(flag!=-1)
{
cout<<"record deleted\n";
a=new node;
f1.seekp(flag*sizeof(buff),ios::beg);
a->offset=f1.tellp();
for(i=0;i<(int)strlen(key);i++)
f1<<"*";
a->next=first;
first=a;
}
else
{
cout<<"not found";
}
node *cur=first;
while(cur)
{
f2<<cur->offset<<endl;
cur=cur->next;
}
f1.close();
f2.close();
}
void student::display()
{
fstream f1("record.txt",ios::in|ios::out);
fstream f2("avail.txt",ios::out);
int j=0;
while(!f1.eof())
{
f1.seekp(j,ios::beg);
f1.getline(usn,20,'|');
f1.getline(name,20,'|');
f1.getline(branch,20,'|');
f1.getline(sem,20,'|');
cout<<"usn\tname\tbranch\tsem\n";
if(usn[0]!='*')
{
cout<<usn<<"\t"<<name<<"\t"<<branch<<"\t"<<sem<<endl;
}
j=j+sizeof(buff);
}
f1.close();
f2.close();
}
void main()
{
student s;
int ch;
do
{
cout<<"1:insert 2:delete 3:display 4:exit\n";
cout<<"enter your choice";
cin>>ch;
switch(ch)
{
case 1:s.insert();
break;
case 2:s.del();
break;
case 3:s.display();
break;
case 4:remove("record.txt");
remove("avail.txt");
break;
}
}while(ch!=4);
}














1 comment: