Замена элемента в двусвязном списке - 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. - Выводится список до и после замены.