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

Объяснение кода листинга программы

Объяснение порядка выполнения кода:

  1. Вызов функции: Node*AddInAfterTheGivenElement(Node**p, int g, int k)
  2. Проверка: if (*p == NULL)
  3. Если список пуст и заданного элемента нет, создается новый узел со значением 'K' и добавляется в начало списка.
  4. else
  5. Переменная walk инициализируется значением первого элемента списка (*p).
  6. Проверка: if (walk->next->k == g)
  7. Если следующий элемент после текущего имеет значение g, то происходит поиск элемента с заданным значением g.
  8. while (walk->k != g)
  9. Если текущий элемент не является искомым, то происходит переход к следующему элементу списка.
  10. tmp = walk->next;
  11. Переменная walk ссылается на следующий элемент списка (walk->next).
  12. walk->next = ins;
  13. Создается новый узел ins и добавляется после найденного элемента.
  14. ins->next = tmp;
  15. Устанавливается ссылка на следующий элемент нового узла на предыдущий элемент списка.
  16. return *p;
  17. Возвращается указатель на первый элемент списка.
  18. Если список пуст и заданного элемента нет, выводится сообщение об этом.
  19. return NULL;
  20. Возвращается NULL, если заданный элемент не найден.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы