#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ?????????
const int SIZE = 20;
const char *msgs[]={"0. End","1. Add Item", "2. Find Items", "3. Delete Items", "4. Show Table"};
const int Nmsgs = sizeof(msgs)/sizeof(msgs[0]);
typedef struct Item
{
int key;
int release;
char *info;
}Item ;
// ??????? ?????
char *getStr();
int getInt(int *N);
char* antispace(char *str);
//?????????? ???????
int dialog(const char *msgs[], int N);
int D_Add(Item *table, int *ntab), // ??????? ???????? ? ???????
D_Find(Item *table, int *ntab), // ????? ???????? ? ???????
D_Delete(Item *table, int *ntab), // ???????? ???????? ?? ???????
D_Show(Item *table, int *ntab); // ????? ??????????? ???????
int (*fptr[])(Item *table, int *ntab) = {NULL,D_Add,D_Find,D_Delete,D_Show};
//????????? ???????
int insert(Item *table, int *n, int key, char *info);
int find(Item* table, int n, int key);
int main()
{
int i, ntab;
Item *table=(Item*)malloc(SIZE*sizeof(Item));
ntab=0;
int rc;
while(rc = dialog(msgs, Nmsgs))
{
fptr[rc](table, &ntab);
// for (i=0;i<20;i++)
// printf("number %d is %s\n",i,table[i].info);
}
return 0;
}
char* antispace(char* str)
{
for(;*str!='\0';str++)
if (*str != ' ' && *str != '\t')
return str;
return NULL;
}
char* getstr()
{
char *ptr = (char *)malloc(1);
char buf[21];
int n, len = 0;
*ptr = '\0';
do
{
n = scanf("%20[^\n]", buf);
if(n < 0)
{
free(ptr);
ptr = NULL;
break;
}
if(n == 0)
scanf("%*c");
else
{
len += strlen(buf);
ptr = (char *) realloc(ptr, len + 1);
strcat(ptr, buf);
}
}
while(n > 0);
return ptr;
}
int getInt(int *N)
{
int n;
n=scanf("%d",N);
if (n < 0)
{
*N=0;
return 0;
}
if( (n == 0) || (scanf("%[a-z]") == 1) )
{
*N=-1;
fflush(stdin);
return*N;
}
else
{
fflush(stdin);
return n;
}
}
int dialog(const char *msgs[], int N)
{
int rc=1, i;
do
{
if (rc < 0 || rc >= N)
puts("Sorry, your request is wrong. Please, try again");
else
puts("Please put the number of selected action:");
for (i=0;i<N;i++)
puts(msgs[i]);
getInt(&rc);
}
while (rc < 0 || rc >= N) ;
return rc;
}
int D_Add(Item *table, int *ntab)
{
int k,n=1;
char *info = NULL;
info=(char*)malloc(sizeof(char));
do
{
if(n<0 || k<0)
puts("Your key is wrong. Please try again:");
else
puts("Enter key:");
n=getInt(&k);
}
while (n<0 || k<0);
if(n == 0)
return 0;
do
{
if (info == NULL)
puts("Info is empty. Please try again:");
else
puts("Enter info:");
info = getstr();
if (info != NULL)
info = antispace(info);
else
return 0;
}
while (info == NULL);
insert(table,ntab,k,info);
return 1;
}
int D_Find(Item *table, int *ntab)
{
int i,j,k,rel=0,n=1,nnew=0;
Item *newtable;
do
{
if(n<0 || k<0)
puts("Your key is wrong. Please try again:");
else
puts("Enter key:");
n=getInt(&k);
}
while (n<0 || k<0);
if(n == 0)
return 0;
n=0;
do
{
if(n<0 || rel<0)
puts("Your release is wrong. Please try again:");
else
puts("Enter release[if necessary] or <0>");
n=getInt(&rel);
}
while (n<0 || rel<0);
if(n == 0)
return 0;
if (find(table,*ntab,k) >= 0)
{
j=i=find(table,*ntab,k);
if (rel<=0)
{
for(;table[j].key == k;j++,nnew++);
newtable=(Item *)malloc(nnew*sizeof(Item));
for(j=i;table[j].key == k;j++)
newtable[j-i]=table[j];
}
else
for(j=i;table[j].key == k;j++)
{
if(table[j].release == rel)
{
nnew++;
newtable=(Item *)malloc(sizeof(Item));
newtable[0]=table[j];
}
}
}
if(nnew>0)
D_Show(newtable,&nnew);
else
puts("Item not found");
return 1;
}
int D_Show (Item *table, int *ntab)
{
int i;
puts("///////////////////////////");
if (*ntab>0)
for(i=0;i<*ntab;i++)
printf("Table[%d]: key - %d, release - %d, info - %s\n",i
,table
[i
].
key,table
[i
].
release,table
[i
].
info);
else
puts("Table is empty");
puts("///////////////////////////");
return 1;
}
int D_Delete (Item *table, int *ntab)
{
int i,j;
for(i=0;i<*ntab;i++)
{
if(table[i].release>table[i-1].release)
{
for(j=i;j<*ntab;j++)
table[j-1]=table[j];
*ntab=*ntab-1;
i--;
table[i].release=1;
}
}
puts("Table changed");
return 1;
}
int find(Item* table, int ntab, int key)
{
int i;
for (i=0;i<ntab;i++)
{
if (table[i].key == key)
return i;
}
return -1;
}
int insert(Item *table, int *ntab, int key, char *info)
{
int i,j,rel;
rel=1;
if (*ntab == 0)
i=0;
else
{
i=find(table,*ntab,key);
if (i >= 0)
{
while (table[i].key == key)
{
i++;
rel++;
}
for(j=*ntab;j>i;j--)
table[j]=table[j-1];
}
else
{
i=0;j=0;
while (i<*ntab)
{
if(table[i].info == NULL)
{
table[j]=table[i];
j++;
}
i++;
}
j=i;
}
}
table[i].key=key;
table[i].info=info;
table[i].release=rel;
*ntab=*ntab+1;
return 1;
}