Добавление элемента после элемента с заданным ключом в однонаправленном списке - C (СИ)
Формулировка задачи:
Здравствуйте!
У меня неправильно работает функция insert, которая должна добавлять элемент после элемента с заданным ключом (key1).
Подскажите, пожалуйста, как исправить эту функцию.
#include <stdio.h> #include <stdlib.h> typedef struct Node{ int value; int key; struct Node *next; }Node; void push(Node **head, int data, int key1) { Node *tmp = (Node*) malloc(sizeof(Node)); tmp->value = data; tmp->key=key1; tmp->next = (*head); (*head) = tmp; } void pop(Node **head, int *key1, int *val) { Node* prev = NULL; if (head == NULL) { exit(-1); } prev = (*head); *val = prev->value; *key1 = prev->key; (*head) = (*head)->next; free(prev); } void insert(Node *head, int key1, int key2, int val) { int key3; Node *tmp = NULL; do if (head->next){ key3=head->key; head=head->next; } else break; while(key3!=key1); tmp = (Node*) malloc(sizeof(Node)); tmp->value = val; tmp->key=key2; if (head->next) { tmp->next = head->next; } else { tmp->next = NULL; } head->next = tmp; } int main() {int key,val,keykol=0; Node *head=NULL; push(&head,27,keykol); ++keykol; push(&head,290,keykol); ++keykol; push(&head,3467,keykol); ++keykol; push(&head,8970,keykol); ++keykol; insert(head,0,keykol,78965); ++keykol; pop(&head,&key,&val); printf("val: %d key: %d\n",val,key); pop(&head,&key,&val); printf("val: %d key: %d\n",val,key); pop(&head,&key,&val); printf("val: %d key: %d\n",val,key); pop(&head,&key,&val); printf("val: %d key: %d\n",val,key); pop(&head,&key,&val); printf("val: %d key: %d\n",val,key); return 0; }
Решение задачи: «Добавление элемента после элемента с заданным ключом в однонаправленном списке»
textual
Листинг программы
Node*AddInAfterTheGivenElement(Node**p, int g, int k) { Node *ins = new Node; Node*walk = *p; ins->k = k; Node*tmp; if (*p == NULL) { printf("\nСписок пуст и заданного элемента нет. Создан узел со сзначением 'K' в начале списка\n"); ins->k = k; ins->next = *p; *p = ins; return *p; } else { if (walk->next->k == g) { while (walk->k != g) walk = walk->next; tmp = walk->next; walk->next = ins; ins->next = tmp; return*p; } else printf("\n заданного элемента нет. \n"); return NULL; } return *p; }
Объяснение кода листинга программы
Объяснение порядка выполнения кода:
- Вызов функции: Node*AddInAfterTheGivenElement(Node**p, int g, int k)
- Проверка: if (*p == NULL)
- Если список пуст и заданного элемента нет, создается новый узел со значением 'K' и добавляется в начало списка.
- else
- Переменная walk инициализируется значением первого элемента списка (*p).
- Проверка: if (walk->next->k == g)
- Если следующий элемент после текущего имеет значение g, то происходит поиск элемента с заданным значением g.
- while (walk->k != g)
- Если текущий элемент не является искомым, то происходит переход к следующему элементу списка.
- tmp = walk->next;
- Переменная walk ссылается на следующий элемент списка (walk->next).
- walk->next = ins;
- Создается новый узел ins и добавляется после найденного элемента.
- ins->next = tmp;
- Устанавливается ссылка на следующий элемент нового узла на предыдущий элемент списка.
- return *p;
- Возвращается указатель на первый элемент списка.
- Если список пуст и заданного элемента нет, выводится сообщение об этом.
- return NULL;
- Возвращается NULL, если заданный элемент не найден.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д