Author: Pavel Kravtsov Language: c
Description: 2c Timestamp: 2013-05-19 20:26:20 +0000
View raw paste Reply
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. typedef struct Item {
  6. char c;
  7. struct Item *next;
  8. } Item;
  9.  
  10. int getList(Item **);
  11. void putList(const char *, Item *);
  12. Item *deleteList(Item *);
  13. Item *delWord(Item *);
  14. Item *skipWord(Item *);
  15. Item *delSpace(Item *);
  16. Item *newString(Item *);
  17.  
  18. int main()
  19. {
  20. Item *ptr = NULL;
  21.     while(printf("enter string... "), getList(&ptr))
  22.     {
  23.         putList("Entered string", ptr);
  24.         ptr = newString(ptr);
  25.         putList("Result string", ptr);
  26.         ptr = deleteList(ptr);
  27.     }
  28. return 0;
  29. }
  30.  
  31. /* ??????? ??? ????? ?????? - ??????.
  32. ** ??????? ?????????? ????????? ?? ??????, ? ??????? ????????? ????????? ??????.
  33. ** ?? ???????? ??????, ????? ???? ??????? ?????? ??????, ?????
  34. ** ??????? ?????????? ???????? NULL - ?????? ??????.
  35. ** ??????? ?????? ??????????? ????????? "????? ?????", ? ??? ????????? ??????
  36. ** ??????? ?? ????????? ????????? NULL - ?????? ??????.
  37. ** ??????? ???????????? ??????? ? ?????????? int getList(Item **) ??????????
  38. ** ????????? 1, ???? ?????? ???????, ??? 0, ???? ????????? ????? ?????,
  39. ** ? ???? ?????? ?????????? ????? ???????? ???????. */
  40. int getList(Item **pptr)
  41. {
  42. char buf[21], *str;
  43. Item head = {'*', NULL};
  44. Item *last = &head;
  45. int n, rc = 1;
  46.  
  47.     do{
  48.         n = scanf("%20[^\n]", buf);
  49.         if(n < 0)
  50.         {
  51.             deleteList(head.next);
  52.             head.next = NULL;
  53.             rc = 0;
  54.             continue;
  55.         }
  56.  
  57.         if(n > 0)
  58.         {
  59.             for(str = buf; *str != '\0'; ++str)
  60.             {
  61.                 last->next = (Item *)malloc(sizeof(Item));
  62.                 last = last->next;
  63.                 last->c = *str;
  64.             }
  65.             last->next = NULL;
  66.         }
  67.         else
  68.             scanf("%*c");
  69.       }
  70.  
  71.     while(n > 0);
  72.         *pptr = head.next;
  73. return rc;
  74. }
  75.  
  76. /* ????? ?????? - ?????? */
  77. void putList(const char *msg, Item *ptr)
  78. {
  79.     printf("%s: \"", msg);
  80.     for(; ptr != NULL; ptr = ptr->next)
  81.         printf("%c", ptr->c);
  82.         printf("\"\n");
  83. }
  84.  
  85. /* ???????????? ?????? */
  86. Item *deleteList(Item *ptr)
  87. {
  88. Item *tmp = NULL;
  89.     while(ptr != NULL)
  90.     {
  91.         tmp = ptr;
  92.         ptr = ptr->next;
  93.         free(tmp);
  94.     }
  95. return ptr;
  96. }
  97.  
  98. /* ??????? ????? ? ?????? - ??????
  99. ** ????????? - ????????? ? ???????? ?????? ??
  100. ** ???????? ?????? ????? */
  101. Item *skipWord(Item *p)
  102. {
  103.     while(p->next && p->next->c != ' ' && p->next->c != '\t')
  104.         p = p->next;
  105. return p;
  106. }
  107.  
  108. /* ???????? ????? ?? ?????? - ??????
  109. ** ????????? - ????????? ?? ??????? ??????, ???????????
  110. ** ?????????? ??????, ??? NULL */
  111. Item *delWord(Item *p)
  112. {
  113. Item *tmp;
  114.     while(p && p->c != ' ' && p->c != '\t')
  115.     {
  116.         tmp = p;
  117.         p = p->next;
  118.         free(tmp);
  119.     }
  120. return p;
  121. }
  122.  
  123. /* ???????? ???????? ?? ?????? - ??????
  124. ** ????????? - ????????? ?? ??????? ??????, ???????????
  125. ** ???????????? ??????, ??? NULL */
  126. Item *delSpace(Item *p)
  127. {
  128. Item *tmp;
  129.     while(p && (p->c == ' ' || p->c == '\t'))
  130.     {
  131.         tmp = p;
  132.         p = p->next;
  133.         free(tmp);
  134.     }
  135. return p;
  136. }
  137.  
  138. Item *newString(Item *p)
  139. {
  140. Item head = {'*', p};
  141. Item *cur = &head, *prev = &head; // prev - ??? ?????????? ????????? ????? ??????
  142.  
  143.     /* ???????????? ?????? ? ???????? ?????????; ??????? cur ?????????
  144.     ** ?? ??????? ??????, ?????????????? ????, ??????? ????? ??????????????? */
  145.     while(cur && (cur->next = delSpace(cur->next)))
  146.     {
  147.         /* ????? ???? ????????????? ? cur, ??? ??? ? ?????????? ????????
  148.         * ????? cur ????????? ?? ??????? ??????, ????????? ?? ????????? ????????
  149.         ** ?????, ? ??? ????? ? ?? ???? - ????????? ?????? ????? ???? ?????????
  150.         ** ?????? ?????? */
  151.         if(cur->next->c == skipWord(cur->next)->c)
  152.         {
  153.             cur = skipWord(cur->next);
  154.             prev = cur;                    // ????????? ????????? ?????? ?????
  155.             cur = cur->next;               // ?????? cur ????????? ?? ??????? ????? ?????
  156.             if(cur)                        // ???? ?????-?? ??????????? ??????, cur ?????????
  157.                 cur->c = ' ';              // ?? ?????????? ??????? ??????
  158.         }
  159.         else
  160.             cur->next = delWord(cur->next);
  161.  
  162.     }
  163.     if(prev->next)                 // ????????, ? ????? ?????? - ?????? ??????? ?????? ??????
  164.     {
  165.         free(prev->next);
  166.         prev->next = NULL;
  167.     }
  168. return head.next;
  169. }
  170.  
View raw paste Reply