Advertisement
melnikovmaxim

BKV_3

Dec 16th, 2019
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.14 KB | None | 0 0
  1. //list with different functional
  2. //link https://yadi.sk/d/_1r4N-gZbXsTpA
  3. /*
  4.   ТЕЛЕФОННАЯ КНИЖКА С ИСПОЛЬЗОВАНИЕМ ЛИНЕЙНОГО СПИСКА.
  5.  
  6.  
  7. При помощи линейных списков реализовать приложение,
  8. позволяющее поддерживать список контактов, содержащих
  9.  - номер телефона (число),
  10.  
  11. - имя абонента (строка текста до 128 символов) и
  12.  - дополнительные данные (строка текста до 256 символов).
  13. Данные книжки записаны в файле,
  14.  при запуске приложения загружаются в память
  15. в виде линейного списка,
  16. при закрытии приложения записываются в файл,
  17. если были сделаны изменения
  18. в данных.+
  19. Со списком необходимо иметь возможность выполнять следующие операции:
  20.  - добавить контакт, +
  21.  - ввести значения полей, обязательными являются
  22.  номер телефона и имя абонента: +
  23.  - удалить контакт; +
  24.  - удалить все записи; +
  25.  *
  26.  - поиск контакта по имени абонента, использовать алгоритм soundex; +
  27.  - поиск +
  28. контакта по номеру, можно задавать только последние цифры номера;
  29.  - вывод для найденных контактов всей информации, включая дополнительные данные; +
  30.  -
  31. сортировка списка по имени абонента ---
  32.  - сортировка по номеру телефона. ---
  33.  
  34. Дополнительные сведения:
  35.  typedef cont {
  36.     long int num;
  37.     char name[128];
  38.    
  39.  char extra[256];
  40.   CONTACT;
  41.  
  42. Использовать алгоритм soundex (или аналогичный по назначению алгоритм),
  43. переработка из оригинального (английский) в русский
  44. вариант.
  45. Поиск последовательным просмотром списка
  46. Проверка введенной информации на корректность (длина строки)
  47. Выделение гласных и согласных для soundex
  48. Функции
  49.  сравнения имени абонента, номера телефона (в т.ч. по части номера)
  50. Функции-макросы isupper, ispunct, isspace, etc
  51. */
  52.  
  53. #include <stdio.h>
  54. #include <malloc.h>
  55. #include <string.h>
  56. #include <stdlib.h>
  57. #include <string.h>
  58.  
  59. typedef struct Node{
  60.     long int num;
  61.     char name[128];
  62.     char extra[256];
  63.    
  64.     struct Node *next;
  65. } Node;
  66.  
  67. void push(Node **head, long int data, char c[128], char e[256] ){ //добавление первого элемента
  68.     Node *tmp = (Node*)malloc(sizeof(Node));
  69.     tmp->num=data;
  70.     strcpy(tmp->name,c);
  71.     strcpy(tmp->extra,e);
  72.     tmp->next=(*head);
  73.     (*head)=tmp;
  74. }
  75.  
  76. int pop(Node **head) { //удаление первого элемента в списке и возвращение указателя и значения
  77.     Node* prev = NULL;
  78.     int val;
  79.     if (!(head == NULL))
  80.     prev = (*head);
  81.     val = prev->num;
  82.     (*head) = (*head)->next;
  83.     free(prev);
  84.     return val;
  85. }
  86.  
  87. void pushBack(Node *head, long int value, char c[128], char e[256]){ //добавление нового элемента в конец сп
  88.     Node *last = head;
  89.     while (last->next){
  90.         last=last->next;
  91.     }
  92.     Node *tmp = (Node*)malloc(sizeof(Node));
  93.     tmp->num=value;
  94.     strcpy(tmp->name,c);
  95.     strcpy(tmp->extra,e);
  96.     tmp->next=NULL;
  97.     last->next=tmp;
  98. }
  99.  
  100. int deleteNth(Node **head, int n) { //уд
  101.     n--;
  102.     int counter;
  103.     if (n == 0) {
  104.         return pop(head);
  105.     } else {
  106.         Node *prev = *head;
  107.         while (counter < n-1 && head){
  108.             prev = prev->next;
  109.             counter++;
  110.         }
  111.         Node *elm  = prev->next;
  112.         int val = elm->num;
  113.  
  114.         prev->next = elm->next;
  115.         free(elm);
  116.    
  117.         return val;
  118.     }
  119. }
  120.  
  121. void printLinkedList(const Node *head) {
  122.     while (head) {
  123.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s\n__________________________________\n\n", head->num,head->name,head->extra);
  124.        
  125.         head=head->next;
  126.     }
  127.     printf("\n");
  128. }
  129.  
  130. void deleteList(Node **head) {
  131.     Node* prev = NULL;
  132.     while ((*head)->next) {
  133.         prev = (*head);
  134.         (*head) = (*head)->next;
  135.         free(prev);
  136.     }
  137.     (*head)=(*head)->next;
  138.     head=NULL;
  139. }
  140.  
  141. void soundex(Node *head, char c[128]) {
  142.     char h1[4],h2[4];
  143.     int i,k,j;
  144.    
  145.     for (i=0;i<4;i++)
  146.     {
  147.     h1[i]=0;
  148.     h2[i]=0;
  149.     }
  150.    
  151.     if ((c[0]<91) && (c[0]>64))
  152.     h1[0]=c[0];
  153.     else
  154.     if ((c[0]<123) && (c[0]>96))
  155.     h1[0]=c[0]-32;
  156.    
  157.     k=1;
  158.     for (i=1;i<128;i++)
  159.     {
  160.         if (k<4){
  161.         if ((c[i]==98 || c[i]==102 || c[i]==112 || c[i]==118) || (c[i]==98-32 || c[i]==102-32 || c[i]==112-32 || c[i]==118-32))
  162.         if (h1[k-1]!=1)
  163.         {
  164.         h1[k]=1;
  165.         k++;
  166.         }
  167.        
  168.        
  169.         if ((c[i]==99 || c[i]==103 || c[i]==106 || c[i]==107 || c[i]==113 || c[i]==115 || c[i]==120 || c[i]==122) || (c[i]==99-32 || c[i]==103-32 || c[i]==106-32 || c[i]==107-32 || c[i]==113-32 || c[i]==115-32 || c[i]==120-32 || c[i]==122-32))
  170.         if (h1[k-1]!=2)
  171.         {
  172.         h1[k]=2;
  173.         k++;
  174.         }
  175.        
  176.         if ((c[i]==100 || c[i]==116) || (c[i]==100-32 || c[i]==116-32))
  177.         if (h1[k-1]!=3)
  178.         {
  179.         h1[k]=3;
  180.         k++;
  181.         }
  182.        
  183.         if ((c[i]==108) || (c[i]==108-32))
  184.         if (h1[k-1]!=4)
  185.         {
  186.         h1[k]=4;
  187.         k++;
  188.         }
  189.        
  190.         if ((c[i]==109 || c[i]==110) || (c[i]==109-32 || c[i]==110-32))
  191.         if (h1[k-1]!=5)
  192.         {
  193.         h1[k]=5;
  194.         k++;
  195.         }
  196.        
  197.         if ((c[i]==114) || (c[i]==114-32))
  198.         if (h1[k-1]!=6)
  199.         {
  200.         h1[k]=6;
  201.         k++;
  202.         }
  203.         }
  204.         for (j=k;j>k;j--)
  205.         h1[j]=0;
  206.    
  207. }
  208.    
  209.     while (head!=NULL)
  210.     {
  211.         k=1;
  212.        
  213.  
  214.        
  215.         for (i=1;i<128;i++)
  216.     {
  217.         if ((head->name[0]<91) && (head->name[0]>64))
  218.         h2[0]=head->name[0];
  219.         else
  220.         if ((head->name[0]<123) && (head->name[0]>96))
  221.         h2[0]=head->name[0]-32;
  222.    
  223.         if (k<4){
  224.         if ((head->name[i]==98 || head->name[i]==102 || head->name[i]==112 || head->name[i]==118) || (head->name[i]==98-32 || head->name[i]==102-32 || head->name[i]==112-32 || head->name[i]==118-32))
  225.         if (h2[k-1]!=1)
  226.         {
  227.         h2[k]=1;
  228.         k++;
  229.         }
  230.        
  231.        
  232.         if ((head->name[i]==99 || head->name[i]==103 || head->name[i]==106 || head->name[i]==107 || head->name[i]==113 || head->name[i]==115 || head->name[i]==120 || head->name[i]==122) || (head->name[i]==99-32 || head->name[i]==103-32 || head->name[i]==106-32 || head->name[i]==107-32 || head->name[i]==113-32 || head->name[i]==115-32 || head->name[i]==120-32 || head->name[i]==122-32))
  233.         {
  234.         if (h2[k-1]!=2)
  235.         {
  236.         h2[k]=2;
  237.         k++;
  238.         }
  239.         }
  240.        
  241.         if ((head->name[i]==100 || head->name[i]==116) || (head->name[i]==100-32 || head->name[i]==116-32))
  242.         {
  243.         if (h2[k-1]!=3)
  244.         {
  245.         h2[k]=3;
  246.         k++;
  247.         }
  248.     }
  249.        
  250.         if ((head->name[i]==108) || (head->name[i]==108-32))
  251.         {
  252.         if (h2[k-1]!=4)
  253.         {
  254.         h2[k]=4;
  255.         k++;
  256.         }
  257.         }
  258.        
  259.         if ((head->name[i]==109 || head->name[i]==110) || (head->name[i]==109-32 || head->name[i]==110-32))
  260.         {
  261.         if (h2[k-1]!=5)
  262.         {
  263.         h2[k]=5;
  264.         k++;
  265.         }
  266.         }
  267.        
  268.         if ((head->name[i]==114) || (head->name[i]==114-32))
  269.         {
  270.         if (h2[k-1]!=6)
  271.         {
  272.         h2[k]=6;
  273.         k++;
  274.         }
  275.         }
  276.         }
  277.  
  278.  
  279.     }
  280.     if ((h1[0]==h2[0]) && (h1[1]==h2[1]) && (h1[2]==h2[2]) && (h1[3]==h2[3]))
  281.     {
  282.        
  283.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  284.     }
  285.         head=head->next;
  286.         h2[0]=0;
  287.         h2[1]=0;
  288.         h2[2]=0;
  289.         h2[3]=0;
  290.        
  291. }
  292. }
  293.  
  294. void num(Node *head,long int n){
  295.     while (head!=NULL)
  296.     {
  297.         if (head->num==n)
  298.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  299.         else
  300.         if (head->num%10==n)
  301.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  302.         else
  303.         if (head->num%100==n)
  304.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  305.         else
  306.         if (head->num%1000==n)
  307.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  308.         else
  309.         if (head->num%10000==n)
  310.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  311.         else
  312.         if (head->num%100000==n)
  313.         printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName         : %s\nExtra        : %s \n__________________________________\n", head->num,head->name,head->extra);
  314.        
  315.        
  316.     head=head->next;
  317.     }
  318. }
  319.  
  320. void filein(Node *head)
  321. {
  322.     FILE *file;
  323.     file = fopen("list.txt","w");
  324.    
  325.     while (head!=NULL)
  326.     {
  327.         fprintf(file,"%ld;%s;%s;\n",head->num, head->name, head->extra);
  328.         head=head->next;
  329.     }
  330.     fclose(file);
  331. }
  332.  
  333.  
  334.  
  335.  
  336.  
  337. void bubble_sort_phone(Node *head) {
  338.     Node *p = NULL;
  339.     char c[128],e[256];
  340.    
  341.     if (head != NULL) {
  342.         while (head->next != NULL) {
  343.             p = head->next;
  344.            
  345.             do {
  346.                 if (p->num < head->num) {
  347.                     int tmp = p->num;
  348.                     strcpy(c,p->name);
  349.                     strcpy(e,p->extra);
  350.                    
  351.                     p->num = head->num;
  352.                     strcpy(p->name,head->name);
  353.                     strcpy(p->extra,head->extra);
  354.                    
  355.                     head->num = tmp;
  356.                     strcpy(head->name,c);
  357.                     strcpy(head->extra,e);
  358.                 }
  359.                
  360.                 p = p->next;
  361.             } while (p != NULL);
  362.            
  363.             head = head->next;
  364.         }
  365.     }
  366. }
  367.  
  368. void bubble_sort_name(Node *head) {
  369.     Node *p = NULL;
  370.     char c[128],e[256];
  371.    
  372.     if (head != NULL) {
  373.         while (head->next != NULL) {
  374.             p = head->next;
  375.            
  376.             do {
  377.                
  378.                 if (strcmp(p->name,head->name)<0) {
  379.                     int tmp = p->num;
  380.                     strcpy(c,p->name);
  381.                     strcpy(e,p->extra);
  382.                    
  383.                     p->num = head->num;
  384.                     strcpy(p->name,head->name);
  385.                     strcpy(p->extra,head->extra);
  386.                    
  387.                     head->num = tmp;
  388.                     strcpy(head->name,c);
  389.                     strcpy(head->extra,e);
  390.                 }
  391.                
  392.                 p = p->next;
  393.             } while (p != NULL);
  394.            
  395.             head = head->next;
  396.         }
  397.     }
  398. }
  399.  
  400.  
  401. int main()
  402. {
  403.  
  404.     Node *head = NULL;
  405.     int y,i,n,k,x;
  406.     i=0;
  407.  
  408.     FILE *file;
  409.     file = fopen("list.txt","r");
  410.     long int ix;
  411.     int j;
  412.     j=0;
  413.     char s1[512];
  414.     char * pch;
  415.     char * pch2;
  416.    
  417.     while (fgets(s1,300,file))
  418.     {
  419.     j++;
  420.     ix=atoi(s1);
  421.     pch = strtok(s1,";");
  422.     pch = strtok(NULL, ";");
  423.     pch2=pch;
  424.     pch = strtok(NULL, ";");
  425.     if (j==1)
  426.     {
  427.     i++;
  428.     push(&head,ix,pch2,pch);
  429.     }
  430.     else
  431.     pushBack(head,ix,pch2,pch);
  432.    
  433.     }
  434.  
  435.     fclose(file);
  436.  
  437.     char c[128],e[256];
  438.     x=0;
  439.     c[1]=0;
  440.     while (y!=9)
  441.     {
  442.        
  443.     printf("\n1 - Add contact \n2 - delete a contact \n3 - delete all entries \n4 - search for a contact by name \n5 - search for a contact by number \n6 - the withdrawal of all the contacts and information \n7 - sorted by phone number\n8 - sorted by name\n9 - Exit and save list\n\n");
  444.    
  445.     scanf("%i",&y);
  446.     if (y==1)//добавление
  447.     { //можно переделать
  448.         while ((x==0)||(x<0)||(c[1]==0))
  449.         {
  450.         printf("Phone number & Name are required\n\nPhone number : ");
  451.         scanf("%i",&x);
  452.         printf("Name         : ");
  453.         scanf("%s",c);
  454.         printf("Extra        : ");
  455.         scanf("%s",e);
  456.         }
  457.         if (i==0)
  458.             push(&head,x,c,e);
  459.         else
  460.             {
  461.                 pushBack(head,x,c,e);
  462.             }
  463.         if (i==0)
  464.         i++;
  465.         x=0;
  466.         c[1]=0;
  467.     }
  468.     else
  469.         if (y==2)//удаление
  470.         {
  471.             printf("Enter list item index\n");
  472.             scanf("%d",&n);
  473.             if ((n==1) && (head->next==NULL))
  474.             i=0;
  475.             deleteNth(&head,n);
  476.         }
  477.         else
  478.         if (y==3)
  479.         {
  480.             deleteList(&head);
  481.             i=0;
  482.         }
  483.         else
  484.         if (y==4)
  485.         {
  486.             for (k=0;k<128;k++)
  487.             c[k]=0;
  488.             printf("Enter name\n");
  489.             scanf("%s",c);
  490.             soundex(head,c);
  491.         }
  492.         else
  493.         if (y==5)
  494.         {
  495.             printf("Enter phone number\n");
  496.             scanf("%i", &x);
  497.             num(head,x);
  498.         }
  499.         else
  500.         if (y==6)
  501.         {
  502.             printLinkedList(head);
  503.         }
  504.         else
  505.         if(y==7)
  506.         {
  507.             bubble_sort_phone(head);
  508.             printf("List is sorted\n");
  509.         }
  510.         else
  511.         if(y==8)
  512.         {
  513.             bubble_sort_name(head);
  514.             printf("List is sorted\n");
  515.         }
  516.     }
  517.  
  518.     //Удаляем пятый элемент (индексация с нуля)
  519.     filein(head);
  520. return 0;
  521. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement