Замена элемента в двусвязном списке - C (СИ)
Формулировка задачи:
Помогите пожалуйста реализовать замену элемента в двусвязном списке. Например есть у нас структура
И мы вводим имя элемента данные которого нужно заменить новым(введенным с клавиатуры)
struct st { char name[20]; int ser_bal; st *next; /* указатель на следующую запись */ st *prior; /* указатель на предыдущую запись */ };
Решение задачи: «Замена элемента в двусвязном списке»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node_t { char name[20]; int gpa; struct node_t* next; struct node_t* prev; } TNode; //----------------------------------------------------------------------------- TNode* PushFront(TNode** list, const char* name, int gpa) { TNode* node = (TNode*) malloc(sizeof(TNode)); strcpy(node->name, name); node->gpa = gpa; node->prev = NULL; node->next = *list; if (node->next) { node->next->prev = node; } *list = node; return *list; } //----------------------------------------------------------------------------- TNode* Replace(TNode* list, const char* oldName, const char* newName, int gpa) { for (; list; list = list->next) { if (strcmp(list->name, oldName) == 0) { strcpy(list->name, newName); list->gpa = gpa; } } return list; } //----------------------------------------------------------------------------- void Print(const TNode* list) { for (; list; list = list->next) { printf("%s\t%3d\n", list->name, list->gpa); } } //----------------------------------------------------------------------------- int main() { TNode* list = NULL; PushFront(&list, "Andreev", 5); PushFront(&list, "Avdeev", 10); PushFront(&list, "Grishin", 15); PushFront(&list, "Ivanov", 20); PushFront(&list, "Lobkov", 25); PushFront(&list, "Petrov", 30); Replace(list, "Ivanov", "Smirnov", 100); Print(list); return 0; }
Объяснение кода листинга программы
- В функции
PushFront
создается новый узел с заданными значениямиname
иgpa
. - Устанавливаются указатели
prev
иnext
нового узла. - Новый узел добавляется в начало списка, обновляя указатель
next
предыдущего узла и указательprev
нового узла. - Если новый узел не является первым в списке, то обновляется указатель
prev
следующего узла. - В функции
Replace
происходит проход по всем узлам списка. - Если в узле найдено совпадение по
name
, то обновляются значенияname
иgpa
этого узла. - В функции
Print
происходит проход по всем узлам списка и выводится значениеname
иgpa
каждого узла. - В функции
main
создается пустой список. - В список добавляются несколько узлов с различными значениями
name
иgpa
. - Затем выполняется замена значения
name
наSmirnov
и значенияgpa
на 100 для первого вхождения узла с именемIvanov
. - Выводится список до и после замены.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д