Author: Not specified Language: c
Description: Not specified Timestamp: 2013-05-19 18:37:19 +0000
View raw paste Reply
  1. #pragma hdrstop
  2. #pragma argsused
  3.  
  4. #include <stdio.h>
  5. #include <tchar.h>
  6.  
  7. #define size 10
  8.  
  9. typedef struct Item
  10. {
  11.         int release;
  12.         char *string;
  13.         struct Item *next;
  14. } Item;
  15.  
  16. typedef struct Node
  17. {
  18.         int key;
  19.         Item *info;
  20. } Node;
  21.  
  22. void Init(Node *top[]) {
  23.         int i;
  24.         for (i = 0; i < size; i++) {
  25.                 top[i] = NULL;
  26.         }
  27. }
  28. char* getStr() {
  29.         char buf[21];
  30.         char *ptr = (char*)malloc(1);
  31.         int len = 0, curlen, n;
  32.         *ptr = '\0';
  33.         do {
  34.                 n = scanf("%20[^\n]", buf);
  35.                 if (n < 0) {
  36.                         free(ptr);
  37.                         continue;
  38.                 }
  39.                 if (n > 0) {
  40.                         curlen = strlen(buf);
  41.                         len += curlen;
  42.                         ptr = (char*)realloc(ptr, len + 1);
  43.                         strcat(ptr, buf);
  44.                 }
  45.                 else
  46.                         scanf("%*c");
  47.         }
  48.         while (n > 0);
  49.         return ptr;
  50. }
  51.  
  52. void OutPut(Node *top[])
  53. {
  54.         int i;
  55.         Item *cur=malloc(sizeof(Item));
  56.         system("Cls");
  57.         for (i = 0; i<size && top[i]; i++)
  58.         {
  59.                 printf("Key-%i\n",top[i]->key);
  60.                 cur=top[i]->info;
  61.                 while(cur)
  62.                 {
  63.                         printf("\tRelease-%i Info-%s\n", cur->release,cur->string);
  64.                         cur=cur->next;
  65.                 }
  66.         }
  67.         system("Pause");
  68.  
  69. }
  70.  
  71. Node *AddElement(Node *top,int key,char* info)
  72. {
  73.         Item *temp;
  74.         if(!top)
  75.         {
  76.                 top=malloc(sizeof(Node));
  77.                 top->key=key;
  78.                 top->info=malloc(sizeof(Item));
  79.                 top->info->release=0;
  80.                 top->info->string=info;
  81.                 top->info->next=NULL;
  82.         }
  83.         else
  84.         {
  85.                 temp=malloc(sizeof(Item));
  86.                 temp->release=top->info->release+1;
  87.                 temp->string=info;
  88.                 temp->next=top->info;
  89.                 top->info=temp;
  90.         }
  91.         return top;
  92. }
  93. int Add(Node *top[], int key, char *info)
  94. {
  95.         int i;
  96.         for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
  97.         if (i==size)
  98.                 return 1;
  99.         else
  100.         {
  101.                 top[i]=AddElement(top[i],key,info);
  102.                 return 0;
  103.         }
  104.  
  105. }
  106. void D_Add(Node *top[])
  107. {
  108.         int key,res;
  109.         char *info;
  110.         system("Cls");
  111.         printf("Enter key: ");
  112.         scanf("%i",&key);
  113.         scanf("%*c");
  114.         printf("Enter info: ");
  115.         info=getStr();
  116.         res=Add(top,key,info);
  117.         if(res)
  118.                 printf("Table is full\n");
  119.         else
  120.                 printf("Elment are inserted\n");
  121.         system("Pause");
  122. }
  123.  
  124.  
  125. void DeleteElement(Node *top[],int index)
  126. {
  127.         Item *temp;
  128.         int j;
  129.         while(top[index]->info)
  130.         {
  131.                 temp=top[index]->info;
  132.                 top[index]->info=top[index]->info->next;
  133.                 free(temp->string);
  134.                 free(temp);
  135.         }
  136.         top[index]=NULL;
  137.         for (j = index+1; j<size && top[j]; j++);
  138.         if(j!=index)
  139.         {
  140.            top[index]=malloc(sizeof(Node));
  141.            top[index]->info=malloc(sizeof(Node));
  142.            top[index]->key=top[j-1]->key;
  143.            top[index]->info=top[j-1]->info;
  144.            top[j-1]=NULL;
  145.         }
  146. }
  147. int DeleteRelease(Node *top[], int key,int release)
  148. {
  149.         int i;
  150.         Item *cur, *prev;
  151.         for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
  152.         if(i==size || !top[i])
  153.                 return 1;
  154.         cur=top[i]->info;
  155.         while(cur && cur->release!=release)
  156.         {
  157.                 prev=cur;
  158.                 cur=cur->next;
  159.         }
  160.         if(cur)
  161.         {
  162.                 if(cur==top[i]->info)
  163.                         top[i]->info=top[i]->info->next;
  164.                 else
  165.                         prev->next=cur->next;
  166.                 free(cur->string);
  167.                 free(cur);
  168.                 if(!top[i]->info)
  169.                         DeleteElement(top,i);
  170.                 return 0;
  171.         }
  172.         return 1;
  173. }
  174. void DeleteByKeyAndRelease(Node *top[])
  175. {
  176.   int key,res;
  177.   int release;
  178.   system("Cls");
  179.   printf("Enter key: ");
  180.   scanf("%i", &key);
  181.   printf("Enter release: ");
  182.   scanf("%i", &release);
  183.   res=DeleteRelease(top,key,release);
  184.   if(res==1)
  185.         printf("Element was not found\n");
  186.   else
  187.         printf("Element is deleted\n");
  188.   system("Pause");
  189. }
  190. void DeleteByKey(Node *top[])
  191. {
  192.         int key,res,i;
  193.         system("Cls");
  194.         printf("Enter key: ");
  195.         scanf("%i",&key);
  196.         for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
  197.         if (i==size || !top[i])
  198.                 printf("Element is not found\n");
  199.         else
  200.         {
  201.                 DeleteElement(top,i);
  202.                 printf("Element is deleted\n");
  203.         }
  204.         system("Pause");
  205. }
  206. void D_Delete(Node *top[])
  207. {
  208.         int key;
  209.         do
  210.         {
  211.                 system("Cls");
  212.                 printf("\nWhat Would You prefer");
  213.                 printf("1-Delete by key\n");
  214.                 printf("2-Delete by key and release\n");
  215.                 printf("0-Menu\n");
  216.                 scanf("%i",&key);
  217.                 if(key==1)
  218.                         DeleteByKey(top);
  219.                 else if(key==2)
  220.                         DeleteByKeyAndRelease(top);
  221.  
  222.         }while(key);
  223. }
  224.  
  225. void Search (Node *top[], Node *temp[],int key, int release)
  226. {
  227.    int i;
  228.    Node *cur=malloc(sizeof(Node));
  229.    cur->info=malloc(sizeof(Item));
  230.    for (i = 0; i<size && top[i] && top[i]->key!=key; i++);
  231.    if(i==size || !top[i])
  232.         return;
  233.    if(release <0)
  234.    {
  235.                 temp[0]=malloc(sizeof(Node));
  236.                 temp[0]=top[i];
  237.    }
  238.    else
  239.    {
  240.                 cur->info=top[i]->info;
  241.                 while(cur && cur->info->release>release)
  242.                         cur->info=cur->info->next;
  243.                 if(!cur || cur->info->release<release)
  244.                         return ;
  245.                 temp[0]=malloc(sizeof(Node));
  246.                 temp[0]->info=malloc(sizeof(Item));
  247.                 temp[0]->key=top[i]->key;
  248.                 temp[0]->info=cur->info;
  249.                 temp[0]->info->next=NULL;
  250.    }
  251. }
  252. void SearchByKey(Node *top[])
  253. {
  254.         int key;
  255.         Node *temp[size];
  256.         system("Cls");
  257.         printf("Enter key: ");
  258.         scanf("%i",&key);
  259.         Init(temp);
  260.         Search(top,temp,key,-1);
  261.         OutPut(temp);
  262. }
  263. void SearchByKeyAndRelease(Node *top[])
  264. {
  265.         int key,release;
  266.         Node *temp[size];
  267.         system("Cls");
  268.         printf("Enter key: ");
  269.         scanf("%i",&key);
  270.         printf("Enter release: ");
  271.         scanf("%i",&release);
  272.         Init(temp);
  273.         Search(top,temp,key,release);
  274.         OutPut(temp);
  275. }
  276. void D_Search(Node *top[])
  277. {
  278.         int key;
  279.         do
  280.         {
  281.                 system("Cls");
  282.                 printf("1-Search by key\n");
  283.                 printf("2-Search by key and release\n");
  284.                 printf("0-Menu\n");
  285.                 scanf("%i",&key);
  286.                 if(key==1)
  287.                         SearchByKey(top);
  288.                 else if(key==2)
  289.                         SearchByKeyAndRelease(top);
  290.         }while(key);
  291. }
  292.  
  293. void Menu() {
  294.         int key;
  295.         void(*function[])(Node**)={NULL, D_Add,D_Delete,D_Search,OutPut};
  296.         Node *top[size];
  297.         Init(top);
  298.         do {
  299.                 system("Cls");
  300.                 printf("1-Add\n2-Delete\n3-Search\n4-Output\n0-Exit\n");
  301.                 scanf("%i", &key);
  302.                 if (key<5 && key>0)
  303.                         function[key](top);
  304.         }
  305.         while (key);
  306. }
  307.  
  308. int _tmain(int argc, _TCHAR* argv[]) {
  309.         Menu();
  310.         return 0;
  311. }
  312.  
View raw paste Reply