Добавление элемента после элемента с заданным ключом в однонаправленном списке - 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, если заданный элемент не найден.