Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
5 / 5 / 2
Регистрация: 07.05.2014
Сообщений: 101

Из введенных слов создать односвязный кольцевой список

08.12.2014, 06:50. Показов 1347. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи
Задача звучит так: Из введенных слов создать односвязный кольцевой список. Далее, создать список, организованный как стек, в который переписать все слова, которые содержат все буквы, что и первое введенное слово списка. К примеру если слово qwe, то qwer переписать, а qw не подойдет
Выскакивает ошибка о левостороннем значении операнда при копировании информационного поля слова в новый элемент списка (закомментированная строка в функции RECH * AddNew), иначе выводится лужайка
Помогите исправить, пожалуйста.
П.С. второй список делал как очередь так же, так как на стековой организации вылетала такая же ошибка об операнде, думал, в очереди будет проще по аналогии сделать
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2014, 06:50
Ответы с готовыми решениями:

Создать кольцевой односвязный список, элементы которого будут вводиться с клавиатуры
Нужно сделать кольцевой односвязный список, элементы которого будут вводиться с клавиатуры. Я новичок в Си, создал список, получил...

Создать односвязный список о книгах
Помогите реализовать односвязный список ... #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;locale.h&gt;...

Создать односвязный упорядоченный список
Здравствуйте, помогите пожалуйста, нужно написать программу. Вводим числа с клавиатуры и сразу упорядочиваем их.( всё это список ) не...

4
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.12.2014, 11:28
Цитата Сообщение от Nescafe32 Посмотреть сообщение
Выскакивает ошибка о левостороннем значении операнда при копировании информационного поля слова в новый элемент списка (закомментированная строка в функции RECH * AddNew)
Для копирования строк использовать strcpy
0
5 / 5 / 2
Регистрация: 07.05.2014
Сообщений: 101
08.12.2014, 13:41  [ТС]
Лужайку не выводит, благодарю. Но я хотел бы еще узнать почему прямое присваивание (та же закомментированная строка) выбивает ошибку об левостороннем значении операнда
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.12.2014, 14:07
Цитата Сообщение от Nescafe32 Посмотреть сообщение
Но я хотел бы еще узнать почему прямое присваивание (та же закомментированная строка) выбивает ошибку об левостороннем значении операнда
потому что в С нельзя присваивать одному массиву другой
1
5 / 5 / 2
Регистрация: 07.05.2014
Сообщений: 101
08.12.2014, 18:57  [ТС]
Подправил, все работает, но нашел в задании пункт
Если элементы нужно перенести в новый список, то не надо выделять для них новую динамическую память, а нужно изьять эти элементы из начального списка (не стирая их с памяти) и потом присоединить в соответственном месте к новому списку. Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#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 * AddNew( RECH * last);
RECH * getstack(RECH*);
RECH * outstack(RECH*);
 
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;
    RECH * el_out = 0;
    i = 0;
    do{fflush(stdin);
    new_el = new_sp(ss);
        if (new_el == NULL)
            printf ("\nНе совпадает слово");
        else{
            el_to_new_sp = getstack(new_el);
            el_out = outstack(el_to_new_sp);
            printf("\n%s\n",el_out->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 * getstack(RECH* el){
    RECH*smth;
    smth = (RECH*)malloc(sizeof(RECH));
    strcpy (smth->rech,list->rech);
    smth->next = list;
    list = smth;
    return smth;
}
 
RECH * outstack(RECH* el1){
    RECH * smth1 = list;
    if(smth1 == NULL) return NULL;
    //strcpy(el1->rech,smth1->rech);
    strcpy(el1->rech,smth1->rech);
    list = list->next;
    free (smth1);
    return list;
}
Подскажите как это организовать, пожалуйста
Пробовал что то типа
C
1
el_to_new_sp = getstack(new_el, &new_el); //(мейн)
и
C
1
2
3
4
5
6
7
8
9
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;
}
Так после первого добавления прога вылетает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2014, 18:57
Помогаю со студенческими работами здесь

Создать односвязный список из структур
Помогите пожалуйста..Сколько читаю ничего не понимаю(Большинство с классами...которые мы не изучали. Понимаю что должно быть значение и...

Создать и заполнить линейный односвязный список
Здравствуйте! Мне нужно создать и заполнить линейный односвязный список. Вот код, который у меня получился: #include &lt;stdio.h&gt; ...

Создать односвязный список и добавить в него элементы
помогите, пожалуйста. нужен код: создать односвязный список, тип информационного поля char*, добавить в список элементы с номерами 1,3,5 и...

Создать новый односвязный список, который содержит элементы заданного списка в порядке убывания
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в порядке убывания

Программа должна уметь по команде создать односвязный список, добавить элемент в начало, середину или конец
Доброго времени суток всем читающим. Поступил на мехмат, но больше всего мозги делают с программированием. Задача состоит в том, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru