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

  1. В функции объявлен новый указатель RECH* smth, который будет использоваться для хранения нового элемента списка.
  2. Присваиваем указателю smth значение указателя adr, который указывает на начало списка.
  3. Копируем значение поля rech из текущего элемента списка (list) в новый элемент списка (smth).
  4. Устанавливаем поле next нового элемента списка (smth) равным указателю на текущий элемент списка (list).
  5. Устанавливаем указатель list на новый элемент списка (smth).
  6. Возвращаем указатель на новый элемент списка (smth). В данном коде не выделен память под новый элемент списка при помощи malloc, поэтому предполагается, что память под новый элемент списка выделяется где-то вне функции getstack.

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы