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