Из введенных слов создать односвязный кольцевой список - C (СИ)
Формулировка задачи:
Доброй ночи
Задача звучит так: Из введенных слов создать односвязный кольцевой список. Далее, создать список, организованный как стек, в который переписать все слова, которые содержат все буквы, что и первое введенное слово списка. К примеру если слово qwe, то qwer переписать, а qw не подойдет
Выскакивает ошибка о левостороннем значении операнда при копировании информационного поля слова в новый элемент списка (закомментированная строка в функции RECH * AddNew), иначе выводится лужайка
Помогите исправить, пожалуйста.
П.С. второй список делал как очередь так же, так как на стековой организации вылетала такая же ошибка об операнде, думал, в очереди будет проще по аналогии сделать
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <Windows.h> typedef struct rechenya{ char rech[100]; struct rechenya * next; }RECH; RECH * AddElement (RECH * last); void Print(RECH *); RECH * new_sp(char * word); //RECH * getstack(char good_word[]); //RECH * outstack(char * good_word); RECH * AddNew( RECH * last); RECH * list; RECH * list1; int main () { SetConsoleCP(1251); SetConsoleOutputCP(1251); RECH * end = NULL; RECH * lis; int i = 0; int K = 0; char qaz[10]; int counter = 0; do{ end = AddElement(end); if (counter == 0) lis = end; // сохраняем адрес первого слова. сделано через опу, но пока не придумал как иначе counter++; }while (end != NULL); char * zzz; zzz = list->rech; char * ss = zzz; // указатель на первое введенное слово int dod = 0; RECH * new_el; RECH * el_to_new_sp = 0; i = 0; do{fflush(stdin); new_el = new_sp(ss); if (new_el == NULL) printf ("\nНе совпадает слово"); else{ printf("\n%s",new_el); el_to_new_sp = AddNew(el_to_new_sp); // почему я не использую new_el? хм... printf("%s\n",el_to_new_sp->rech); // лужаечка } i++; }while (i < counter - 2); Print(lis); getch(); } RECH * AddElement (RECH * last){ // возвращаем новый элемент списка пока не считано пустую строку RECH * pel; char *qwe; pel = (RECH*)malloc(sizeof(RECH)+1); static int count = 1; printf ("%d slovo: ",count); if(*(qwe = gets (pel ->rech)) == '\0'){ pel->next = list; return NULL; } pel->next = NULL; if (list == NULL) list = pel; else last -> next = pel; count ++; return pel; } void Print (RECH * lis){ // вывод введенного списка RECH * pel = lis; int i = 0; printf ("\nНачальный список: \n"); while (pel != NULL){ printf ("%s\n", pel -> rech); pel = pel ->next; } } RECH * new_sp(char * word){ // тут проверяем совпадение букв и возвражаем слово если совпадают все буквы char * next_word; char * p ; list = list->next; next_word = list->rech; char * aaa; aaa = next_word; p = word; for(; *p != '\0';){ for (; *aaa != '\0'; ){ if (*p == *aaa){ p++; aaa = next_word; } else aaa++; if (*p == '\0') return list; if(*aaa == '\0') return NULL; } } } RECH * AddNew(RECH * last){ // тут должен возвращаться элемент, который будет в новом списке RECH * newel; newel = (RECH*)malloc(sizeof(RECH)); //newel->rech = list->rech; newel->next = NULL; if (list1 == NULL) list1 = newel; else last ->next = newel; return newel; }
Решение задачи: «Из введенных слов создать односвязный кольцевой список»
textual
Листинг программы
RECH * getstack(RECH* el, RECH ** adr){ RECH*smth; //smth = (RECH*)malloc(sizeof(RECH)); smth = *adr; strcpy (smth->rech,list->rech); smth->next = list; list = smth; return smth; }
Объяснение кода листинга программы
В данном коде выполняется функция getstack, которая создает новый элемент списка (RECH) и добавляет его в конец существующего списка.
- В функции объявлен новый указатель RECH* smth, который будет использоваться для хранения нового элемента списка.
- Присваиваем указателю smth значение указателя adr, который указывает на начало списка.
- Копируем значение поля rech из текущего элемента списка (list) в новый элемент списка (smth).
- Устанавливаем поле next нового элемента списка (smth) равным указателю на текущий элемент списка (list).
- Устанавливаем указатель list на новый элемент списка (smth).
- Возвращаем указатель на новый элемент списка (smth). В данном коде не выделен память под новый элемент списка при помощи malloc, поэтому предполагается, что память под новый элемент списка выделяется где-то вне функции getstack.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д