Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28

Заменить имя в односвязном списке

14.01.2020, 18:15. Показов 2504. Ответов 8

Студворк — интернет-сервис помощи студентам
Проблема в функции FindName, после нее зависает программа.
Требуется найти имя, введенное с клавиатуры, и заменить его на другое, также введенное с клавиатуры.(строки 117-132 и 34-42)
Помогите, пожалуйста, разобраться!

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
//додавання у хвіст, видалення з голови, знайти та замін. існуюче імя (з клав.) у всіх елем. на сернейм, надрукув. весь список "І.Прізвище", видалити весь список
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1024 
#define DELIMITER "->"
 
 
typedef struct linked_list{
    char name[MAX_LEN];
    char surname[MAX_LEN];
    struct linked_list* next;
}student_list;
 
student_list *createNode(char *name, char *surname);
void addToTail(student_list **head, student_list *newNode);
void printList(student_list **);
void deleteFirst(student_list **);
void freeList(student_list *);
void findName(student_list **, char* name, char *newName);
 
int main(){
 
    student_list *head = NULL;
    student_list *tail = NULL;
    addToTail(&head, createNode("Kateryna", "Reznik"));
    addToTail(&head, createNode("Hlib", "Rudenko"));
    addToTail(&head, createNode("Hlib", "Slyvchak"));
    addToTail(&head, createNode("Inna", "Sokolova"));
 
    printf("Student list: \n");
    printList(&head);
 
    char oldName[MAX_LEN];
    char someName[MAX_LEN];
    printf("Enter name for search: ");
    scanf("%s", &oldName);
    printf("Enter some name: ");
    scanf("%s",&someName);
    findName(&head, oldName, someName);
    printf("List with new name:  \n");
    printList(&head);
 
    deleteFirst(&head);
    printf("\n");
    printf("List without first node: ");
    printList(&head);
 
    freeList(head);
 
 
}
 
student_list *createNode(char *name, char *surname){
 
    student_list *newNode = (student_list*) malloc(sizeof(student_list));
 
    strcpy(newNode->name, name);
    strcpy(newNode->surname, surname);
    newNode->next = NULL;
    return newNode;
    
    }
 
void addToTail(student_list **head, student_list *newNode){
 
    if(*head == NULL){
        *head = newNode;
        return;
    }
    student_list *next = *head;
    while(next->next){
        next = next->next;
    }
    next->next = newNode;
}
 
void printList(student_list **head){
 
    if(!head){
        printf("This list is empty!\n");
    }
    student_list *next = *head;
    while(next){
        printf("%c. %s\n", next->name[0], next->surname);
        next = next->next;
    }
 
}
 
void deleteFirst(student_list **head){
 
    if(head == NULL){
        printf("List is emty!");
    }
    else{
        student_list *firstNode = *head;
        *head = (*head)->next;
        free(firstNode);
    }
}
 
void freeList(student_list *head){
 
    int counter;
    while(head){
        counter ++;
        student_list *temp = head;
        head = (head)->next;
        free(temp);
 
    }
    printf("%d nodes where cleaned!", counter);
 
}
 
void findName(student_list **head, char* name, char *newName){
 
    char temp[MAX_LEN];
    if(!head){
        printf("This list is empty!\n");
    }
    student_list *current = head;
    while(current!=NULL){
 
        if(strcmp(current->name,name) == 1)
            strcpy(current->name, newName);
        
        else
        current = current->next;
}
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2020, 18:15
Ответы с готовыми решениями:

Ошибка в односвязном списке
Ошибка в функции вывод на экран информации содержащую список. Название функции Print. Ошибка: #include &lt;stdio.h&gt; ...

Стек на односвязном списке
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt; #define STACK_OVERFLOW -100 #define...

Фиктивное звено в односвязном списке
Помогите добавить фиктивное звено в программу #include &lt;stdio.h&gt; const char* in = &quot;in.txt&quot;, * out = &quot;out.txt&quot;; ...

8
136 / 90 / 48
Регистрация: 16.08.2016
Сообщений: 362
14.01.2020, 20:31
Я думаю проблема кроется в 123 строке, можно попробовать написать так
C
1
student_list *current = (*head);
0
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
14.01.2020, 20:41  [ТС]
Программа отрабатывает без ошибки, но функция замены все-равно не работает(
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
14.01.2020, 21:32
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

что вернет strcmp("foo", "foo"); ?
после strcpy() нужно либо прервать цикл, либо перейти к следующему элементу списка.
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
14.01.2020, 21:53  [ТС]
Простите, не до конца понимаю.
Ведь в strcmp я сравниваю данные из списка(current name) и name, который передаю из ф-ции main.
а после strcpy я прописал так:
C
1
2
3
4
5
6
if(strcmp(current->name,name) == 1){
            strcpy(current->name, newName);
            break;
        }
        else
        current = current->next;
но ничего не поменялось, а в else идет переход к следующему элементу.
Где я ошибаюсь?

Добавлено через 8 минут
А вернет 1?т.е. верно, совпадает?
0
136 / 90 / 48
Регистрация: 16.08.2016
Сообщений: 362
14.01.2020, 21:53
Лучший ответ Сообщение было отмечено Lockal как решение

Решение

Нужно не с единицей сравнивать, а с нулем. strcmp возвращает 0 если строки равны
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
15.01.2020, 00:22  [ТС]
Точно, теперь вижу! Спасибо огромное! Программа работает исправно теперь)
C
1
2
3
4
if(strcmp(current->name,name) == 0){
            strcpy(current->name, newName);
            return newName;
        }
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
15.01.2020, 08:06
Цитата Сообщение от Lockal Посмотреть сообщение
return newName
у вас findName() объявлена как void
1
0 / 0 / 0
Регистрация: 02.12.2019
Сообщений: 28
15.01.2020, 13:52  [ТС]
да, действительно
Сейчас исправлю, спасибо!

Добавлено через 15 секунд
да, действительно
Сейчас исправлю, спасибо!

Добавлено через 7 секунд
да, действительно
Сейчас исправлю, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2020, 13:52
Помогаю со студенческими работами здесь

Реализация поиска в односвязном списке
Задача следующая: реализовать поиск в односвязном списке. В функции поиска (48 строка) выдаёт либо исключения, либо неправильный вывод...

Реализация очереди на односвязном списке
Всем привет, пожалуйста, помогите. Нужно реализовать очереди на односвязном списке. Входные файлы такие: сначала количество операций над...

Удаление и поиск элемента в односвязном списке
Вот мои функции, но они почему то не работают: функция удаления удаляет всегда голову, а функция поиска находит все элементы. ITEM*...

Найти в односвязном списке количество элементов
Нужно найти в односвязном списке количество елементов: Мое решение: struct SinglyLinkedList { struct Node { int value; ...

Объясните, что значат стрелки в односвязном списке
Начал учить Си. Не понимаю, что в данной записи значат &quot;-&gt;&quot;. Объясните, пожалуйста или скиньте ссылки, гдле об этом можно почитать ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru