#pragma hdrstop
#pragma argsused
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define size 10
FILE *f_table;
typedef struct Item
{
int release;
char *string;
struct Item *next;
} Item;
typedef struct Node
{
int key;
Item *info;
} Node;
typedef struct File
{
FILE *tab;
char *file_name;
};
char *getStr()
{
char buffer[21];
char *tmp=(char*)malloc(sizeof(char)*1);
int len=0, curlen, n;
*tmp='\0';
do
{
n=scanf("%20[^\n]", buffer);
if(n<0)
{
free(tmp);
continue;
}
if(n>0)
{
curlen=strlen(buffer);
len+=curlen;
tmp=(char*)realloc(tmp, sizeof(char)*(len+1));
strcat(tmp, buffer);
}
}
while(n>0);
return tmp;
}
int ReadFile(struct File *ptab, Node *top[])
{
int key;
int len;
char *info;
puts("\nEnter Name Of File : ");
(ptab->file_name)=getStr();
if(ptab->tab=(fopen(ptab->file_name, "rb")))
{
while(fread(&key, sizeof(int), 1, ptab->tab)!=-1 && !feof(ptab->tab))
{
if(fread(&len, sizeof(int), 1, ptab->tab)==-1)
return 0;
info=(char*)malloc(sizeof(char)*(len+1));
if(fread(info, sizeof(char), len, ptab->tab)!=len)
return 0;
*(info+len)='\0';
Add(ptab, key, info);
}
fclose(ptab->tab);
}
ptab->tab=fopen(ptab->file_name, "ab");
return 1;
}
void AddFile(struct File *ptab, int k, char *info)
{
int len=strlen(info);
fwrite(&k, sizeof(int), 1, ptab->tab);
fwrite(&len, sizeof(int), 1, ptab->tab);
fwrite(info, sizeof(char), len, ptab->tab);
}
void SaveFile(Node *top[], struct File *ptab)
{
int i;
struct Item *tmp;
tmp=(struct Item*)malloc(sizeof(struct Item));
fclose(ptab->tab);
ptab->tab=fopen(ptab->file_name, "wb+");
system("Cls");
for(i=0; i<size && top[i]; i++)
{
tmp=top[i]->info;
while(tmp)
{
AddFile(&f_table, top[i]->key, tmp->string);
tmp=tmp->next;
}
}
system("Pause");
}
void Init(Node *top[]) {
int i;
for (i = 0; i < size; i++) {
top[i] = NULL;
}
}
void OutPut(Node *top[])
{
int i;
Item *cur=malloc(sizeof(Item));
system("Cls");
for (i = 0; i<size && top[i]; i++)
{
printf("Key-%i\n",top
[i
]->key
);
cur=top[i]->info;
while(cur)
{
printf("\tRelease-%i Info-%s\n", cur
->release
,cur
->string
);
cur=cur->next;
}
}
system("Pause");
}
Node *AddElement(Node *top,int key,char* info)
{
Item *temp;
if(!top)
{
top=malloc(sizeof(Node));
top->key=key;
top->info=malloc(sizeof(Item));
top->info->release=0;
top->info->string=info;
top->info->next=NULL;
}
else
{
temp=malloc(sizeof(Item));
temp->release=top->info->release+1;
temp->string=info;
temp->next=top->info;
top->info=temp;
}
return top;
}
int Add(Node *top[], int key, char *info)
{
int i;
for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
if (i==size)
return 1;
else
{
top[i]=AddElement(top[i],key,info);
return 0;
}
}
void D_Add(Node *top[])
{
int key,res;
char *info;
system("Cls");
scanf("%i",&key);
scanf("%*c");
info=getStr();
res=Add(top,key,info);
if(res)
else
printf("Elment are inserted\n");
system("Pause");
}
void DeleteElement(Node *top[],int index)
{
Item *temp;
int j;
while(top[index]->info)
{
temp=top[index]->info;
top[index]->info=top[index]->info->next;
free(temp->string);
free(temp);
}
top[index]=NULL;
for (j = index+1; j<size && top[j]; j++);
if(j!=index)
{
top[index]=malloc(sizeof(Node));
top[index]->info=malloc(sizeof(Node));
top[index]->key=top[j-1]->key;
top[index]->info=top[j-1]->info;
top[j-1]=NULL;
}
}
int DeleteRelease(Node *top[], int key,int release)
{
int i;
Item *cur, *prev;
for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
if(i==size || !top[i])
return 1;
cur=top[i]->info;
while(cur && cur->release!=release)
{
prev=cur;
cur=cur->next;
}
if(cur)
{
if(cur==top[i]->info)
top[i]->info=top[i]->info->next;
else
prev->next=cur->next;
free(cur->string);
free(cur);
if(!top[i]->info)
DeleteElement(top,i);
return 0;
}
return 1;
}
void DeleteByKeyAndRelease(Node *top[])
{
int key,res;
int release;
system("Cls");
scanf("%i", &key);
scanf("%i", &release);
res=DeleteRelease(top,key,release);
if(res==1)
printf("Element was not found\n");
else
printf("Element is deleted\n");
system("Pause");
}
void DeleteByKey(Node *top[])
{
int key,res,i;
system("Cls");
scanf("%i",&key);
for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
if (i==size || !top[i])
printf("Element is not found\n");
else
{
DeleteElement(top,i);
printf("Element is deleted\n");
}
system("Pause");
}
void D_Delete(Node *top[])
{
int key;
do
{
system("Cls");
printf("\nWhat Would You prefer");
printf("2-Delete by key and release\n");
scanf("%i",&key);
if(key==1)
DeleteByKey(top);
else if(key==2)
DeleteByKeyAndRelease(top);
}while(key);
}
void Search (Node *top[], Node *temp[],int key, int release)
{
int i;
Node *cur=malloc(sizeof(Node));
cur->info=malloc(sizeof(Item));
for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
if(i==size || !top[i])
return;
if(release <0)
{
temp[0]=malloc(sizeof(Node));
temp[0]=top[i];
}
else
{
cur->info=top[i]->info;
while(cur && cur->info->release>release)
cur->info=cur->info->next;
if(!cur || cur->info->release<release)
return ;
temp[0]=malloc(sizeof(Node));
temp[0]->info=malloc(sizeof(Item));
temp[0]->key=top[i]->key;
temp[0]->info=cur->info;
temp[0]->info->next=NULL;
}
}
void SearchByKey(Node *top[])
{
int key;
Node *temp[size];
system("Cls");
scanf("%i",&key);
Init(temp);
Search(top,temp,key,-1);
OutPut(temp);
}
void SearchByKeyAndRelease(Node *top[])
{
int key,release;
Node *temp[size];
system("Cls");
scanf("%i",&key);
scanf("%i",&release);
Init(temp);
Search(top,temp,key,release);
OutPut(temp);
}
void D_Search(Node *top[])
{
int key;
do
{
system("Cls");
printf("2-Search by key and release\n");
scanf("%i",&key);
if(key==1)
SearchByKey(top);
else if(key==2)
SearchByKeyAndRelease(top);
}while(key);
}
void Menu() {
int key;
void(*function[])(Node**)={NULL, D_Add,D_Delete,D_Search,OutPut};
Node *top[size];
Init(top);
ReadFile(&f_table, top);
do {
system("Cls");
printf("1-Add\n2-Delete\n3-Search\n4-Output\n0-Exit\n");
scanf("%i", &key);
if (key<5 && key>0)
function[key](top);
}
while (key);
SaveFile(top, &f_table);
}
int main() {
Menu();
return 0;
}