Из введенных слов создать односвязный кольцевой список - 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.