Разделение строки на слова с использованием линейного списка - C (СИ)
Формулировка задачи:
Разработать программу для обработки строки с использованием линейного списка.Исходная строка вводится с клавиатуры. В строке записаны слова через пробел или несколько пробелов. В начале и концах строк тоже могут быть пробелы. Выделить из строки слова и записать в консольное окно.
Алгоритм выполнения: В строке записаны правильные 8-ричные и 16-ричные константы. На левый конец очереди переписать слова котрые представляют правильные 8-ричные константы, а на правый конец - 16-ричные. Порядок записи констант произвольный.
Решение задачи: «Разделение строки на слова с использованием линейного списка»
textual
Листинг программы
- #include <stdio.h>
- #include <ctype.h>
- #include <malloc.h>
- typedef struct _node {
- const char* p;
- struct _node* next;
- } node;
- typedef struct {
- node* head;
- node* tail;
- } slist;
- void slist_init(slist* lst);
- int slist_push_front(slist* lst, const char* p);
- int slist_push_back(slist* lst, const char* p);
- void slist_clear(slist* lst);
- void split_word(slist* lst, char* s){
- int h;
- char* p;
- slist_init(lst);
- while(*s){
- while(*s && ! isxdigit(*s))
- ++s;
- p = s;
- h = 0;
- while(isxdigit(*p)){
- if(! h)
- h = (*p >= '8');
- ++p;
- }
- if(*s){
- if(*p != '\0')
- *p++ = '\0';
- if(h)
- slist_push_back(lst, s);
- else
- slist_push_front(lst, s);
- }
- s = p;
- }
- }
- int main(void){
- node* it;
- slist deq;
- char s[128] = "AB 12 FF 8E AC 78 9A 77 75 DC 10 45 67 CF 33";
- /*
- printf("enter str: ");
- fgets(s, sizeof(s), stdin);
- fflush(stdin);
- */
- split_word(&deq, s);
- //вывести
- for(it = deq.head; it != NULL; it = it->next)
- printf("%s ", it->p);
- slist_clear(&deq);
- return 0;
- }
- //инициализация списка
- void slist_init(slist* lst){
- lst->head = lst->tail = NULL;
- }
- //вставка элемента в голову списка
- int slist_push_front(slist* lst, const char* p){
- node* n = (node*)malloc(sizeof(node));
- if(n != NULL){
- n->next = NULL;
- n->p = p;
- if(lst->head == NULL)
- lst->head = lst->tail = n;
- else {
- n->next = lst->head;
- lst->head = n;
- }
- }
- return (n != NULL);
- }
- //вставка элемента в конец списка
- int slist_push_back(slist* lst, const char* p){
- node* n = (node*)malloc(sizeof(node));
- if(n != NULL){
- n->next = NULL;
- n->p = p;
- if(lst->head == NULL)
- lst->head = lst->tail = n;
- else {
- lst->tail->next = n;
- lst->tail = n;
- }
- }
- return (n != NULL);
- }
- //удаление списка
- void slist_clear(slist* lst){
- node* t;
- while(lst->head != NULL){
- t= lst->head;
- lst->head = lst->head->next;
- free(t);
- }
- lst->tail = NULL;
- }
Объяснение кода листинга программы
Этот код разделяет строку на слова, используя список (или дерево
в данном контексте), где каждое слово представлено отдельным узлом. Каждое слово в исходной строке помещается в список в соответствии с его началом (перед первым символом слова) или концом (после последнего символа слова).
Список реализован с помощью связного списка, который состоит из узлов, каждый из которых содержит указатель на следующий узел и строку (слово).
Вот список действий, которые выполняются в коде:
- Инициализация списка в функции
slist_init
. - Запрос строки у пользователя и сохранение ее в переменной
s
. - Разделение строки на слова в функции
split_word
. Каждое слово помещается в список в соответствии с его началом или концом. Функцияsplit_word
вызывается с указателем на список в качестве аргумента. - В функции
split_word
используется цикл, чтобы пройти по каждому символу в строке. Если текущий символ является началом нового слова (не является цифрой), то текущее слово помещается в список. Цикл продолжается до тех пор, пока не будет достигнут конец строки. - После завершения функции
split_word
строка выводится на экран с помощью циклаfor
, который проходит по каждому узлу в списке и печатает его содержимое. - Функция
slist_clear
вызывается для очистки списка и освобождения памяти, занятой узлами списка. Вот список функций, используемых в коде: slist_init
: Инициализирует список.slist_push_front
: Вставляет новый узел в начало списка.slist_push_back
: Вставляет новый узел в конец списка.slist_clear
: Очищает список и освобождает память, занятую узлами списка.split_word
: Разделяет строку на слова и вставляет их в список. Вот список переменных, используемых в коде:s
: Строка, которую нужно разделить на слова.it
: Указатель на текущий узел в списке.deq
: Список, в котором хранятся слова.h
: Переменная-флаг, используемая в цикле в функцииsplit_word
. Устанавливается в1
, если текущий символ является началом нового слова.p
: Указатель на текущий символ в строке.n
: Указатель на новый узел, который будет вставлен в список.t
: Указатель на узел, который будет удален из списка в функцииslist_clear
. Вот список вызовов функций, используемых в коде:slist_init
вызывается в функцииmain
для инициализации списка.slist_push_front
иslist_push_back
вызываются в функцииsplit_word
для вставки новых узлов в список.slist_clear
вызывается в функцииmain
для очистки списка после того, как все слова были добавлены в список.printf
иfgets
используются для вывода строки на экран и чтения строки из стандартного ввода соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д