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