Разделение строки на слова с использованием линейного списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Разработать программу для обработки строки с использованием линейного списка.Исходная строка вводится с клавиатуры. В строке записаны слова через пробел или несколько пробелов. В начале и концах строк тоже могут быть пробелы. Выделить из строки слова и записать в консольное окно. Алгоритм выполнения: В строке записаны правильные 8-ричные и 16-ричные константы. На левый конец очереди переписать слова котрые представляют правильные 8-ричные константы, а на правый конец - 16-ричные. Порядок записи констант произвольный.

Решение задачи: «Разделение строки на слова с использованием линейного списка»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct _node {
  6.     const char* p;
  7.     struct _node* next;
  8. } node;
  9.  
  10. typedef struct {
  11.     node* head;
  12.     node* tail;
  13. } slist;
  14.  
  15. void slist_init(slist* lst);
  16. int  slist_push_front(slist* lst, const char* p);
  17. int  slist_push_back(slist* lst, const char* p);
  18. void slist_clear(slist* lst);
  19.  
  20.  
  21. void split_word(slist* lst, char* s){
  22.     int   h;
  23.     char* p;
  24.  
  25.     slist_init(lst);
  26.  
  27.     while(*s){
  28.  
  29.         while(*s && ! isxdigit(*s))
  30.             ++s;
  31.  
  32.         p = s;
  33.         h = 0;
  34.         while(isxdigit(*p)){
  35.             if(! h)
  36.                 h = (*p >= '8');
  37.             ++p;
  38.         }
  39.  
  40.         if(*s){
  41.             if(*p != '\0')
  42.                 *p++ = '\0';
  43.  
  44.             if(h)
  45.                 slist_push_back(lst, s);
  46.             else
  47.                 slist_push_front(lst, s);
  48.         }
  49.         s = p;
  50.     }
  51. }
  52.  
  53.  
  54.  
  55. int main(void){
  56.     node* it;
  57.     slist deq;
  58.  
  59.     char s[128] = "AB 12 FF 8E AC 78 9A 77 75 DC 10 45 67 CF 33";
  60. /*
  61.     printf("enter str: ");
  62.     fgets(s, sizeof(s), stdin);
  63.     fflush(stdin);
  64. */
  65.     split_word(&deq, s);
  66.  
  67.     //вывести
  68.     for(it = deq.head; it != NULL; it = it->next)
  69.         printf("%s ", it->p);
  70.  
  71.     slist_clear(&deq);
  72.     return 0;
  73. }
  74.  
  75. //инициализация списка
  76. void slist_init(slist* lst){
  77.     lst->head = lst->tail = NULL;
  78. }
  79.  
  80. //вставка элемента в голову списка
  81. int slist_push_front(slist* lst, const char* p){
  82.     node* n = (node*)malloc(sizeof(node));
  83.     if(n != NULL){
  84.         n->next = NULL;
  85.         n->p    = p;
  86.  
  87.         if(lst->head == NULL)
  88.             lst->head = lst->tail = n;
  89.         else {
  90.             n->next   = lst->head;
  91.             lst->head = n;
  92.         }
  93.     }
  94.     return (n != NULL);
  95. }
  96.  
  97. //вставка элемента в конец списка
  98. int slist_push_back(slist* lst, const char* p){
  99.     node* n = (node*)malloc(sizeof(node));
  100.     if(n != NULL){
  101.         n->next = NULL;
  102.         n->p    = p;
  103.  
  104.         if(lst->head == NULL)
  105.             lst->head = lst->tail = n;
  106.         else {
  107.             lst->tail->next = n;
  108.             lst->tail = n;
  109.         }
  110.     }
  111.     return (n != NULL);
  112. }
  113.  
  114. //удаление списка
  115. void slist_clear(slist* lst){
  116.     node* t;
  117.     while(lst->head != NULL){
  118.         t= lst->head;
  119.         lst->head = lst->head->next;
  120.         free(t);
  121.     }
  122.     lst->tail = NULL;
  123. }

Объяснение кода листинга программы

Этот код разделяет строку на слова, используя список (или дерево в данном контексте), где каждое слово представлено отдельным узлом. Каждое слово в исходной строке помещается в список в соответствии с его началом (перед первым символом слова) или концом (после последнего символа слова). Список реализован с помощью связного списка, который состоит из узлов, каждый из которых содержит указатель на следующий узел и строку (слово). Вот список действий, которые выполняются в коде:

  1. Инициализация списка в функции slist_init.
  2. Запрос строки у пользователя и сохранение ее в переменной s.
  3. Разделение строки на слова в функции split_word. Каждое слово помещается в список в соответствии с его началом или концом. Функция split_word вызывается с указателем на список в качестве аргумента.
  4. В функции split_word используется цикл, чтобы пройти по каждому символу в строке. Если текущий символ является началом нового слова (не является цифрой), то текущее слово помещается в список. Цикл продолжается до тех пор, пока не будет достигнут конец строки.
  5. После завершения функции split_word строка выводится на экран с помощью цикла for, который проходит по каждому узлу в списке и печатает его содержимое.
  6. Функция slist_clear вызывается для очистки списка и освобождения памяти, занятой узлами списка. Вот список функций, используемых в коде:
  7. slist_init: Инициализирует список.
  8. slist_push_front: Вставляет новый узел в начало списка.
  9. slist_push_back: Вставляет новый узел в конец списка.
  10. slist_clear: Очищает список и освобождает память, занятую узлами списка.
  11. split_word: Разделяет строку на слова и вставляет их в список. Вот список переменных, используемых в коде:
  12. s: Строка, которую нужно разделить на слова.
  13. it: Указатель на текущий узел в списке.
  14. deq: Список, в котором хранятся слова.
  15. h: Переменная-флаг, используемая в цикле в функции split_word. Устанавливается в 1, если текущий символ является началом нового слова.
  16. p: Указатель на текущий символ в строке.
  17. n: Указатель на новый узел, который будет вставлен в список.
  18. t: Указатель на узел, который будет удален из списка в функции slist_clear. Вот список вызовов функций, используемых в коде:
  19. slist_init вызывается в функции main для инициализации списка.
  20. slist_push_front и slist_push_back вызываются в функции split_word для вставки новых узлов в список.
  21. slist_clear вызывается в функции main для очистки списка после того, как все слова были добавлены в список.
  22. printf и fgets используются для вывода строки на экран и чтения строки из стандартного ввода соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы