Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2022, 22:55   #1
Vaden
Новичок
Джуниор
 
Регистрация: 12.05.2022
Сообщений: 3
По умолчанию Односвязный список. Добавление нового звена

Написал код, который создает односвязный список и выполняет стандартные операции с ним.

По каким-то причинам выполнение команды добавления нового звена после указанного (case 3) работает не так как нужно, вместо добавления звена после переданного добавление происходит через одно звено. К примеру, у нас есть список: "1", "2", "3", если число после которого будет добавление - "1", а число для добавления - "10", то список получится "1","2", "10", "3", а не "1","10", "2", "3". Подумал что ошибка в поиске нужного звена, сделал проверку, но не похоже на это, возможно в самой функции "insertAfter" проблема, но вроде как тоже верно работает. В чем ошибка и как её исправить?

Вот сам код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <fstream>
using namespace std;

struct Node
{
int data;
struct Node *next;
};

void insertAfter(struct Node* prev_node, int new_data) //добавить после
{
if (prev_node == NULL)
{
printf("Предыдущий узел не может быть пустым.");
return;
}
struct Node* new_node =(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = prev_node->next;
prev_node->next = new_node;}

void append(struct Node** head_ref, int new_data) ///добавление в конец
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
struct Node *last = *head_ref;
new_node->data = new_data;
new_node->next = NULL;
if (*head_ref == NULL)
{
*head_ref = new_node;
return;
}

while (last->next != NULL)
last = last->next;
last->next = new_node;
return;
}


void printList(struct Node *node) ///печать списка
{
while (node != NULL)
{
printf(" %d ", node->data);
node = node->next;
}
}

int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    /* Создаем новый пустой список */
    struct Node* head = NULL;
    int keys;//переменная для switch
    while (1)
    {
    printf("1. Добавить в конец списка\n");
    printf("2. Печать списка\n");
    printf("3. Вставить после указанного\n");
    printf("0. Выход\n\n");
    printf("Ваш Выбор: ");
    scanf("%d", &keys);
    switch(keys){
    case 0:
    {
        system("CLS");
        break;
    }

    case 1:///Добавить звено в конец списка
    {
        system("CLS");

        printf("Введите Число: ");
        int numb;
        scanf("%d", &numb);//переменная в которую записывается число для добавления в список
        append(&head, numb); //добавление_в_конец
        system("CLS");
        continue;
    }

    case 2:///Печать
    {
        system("CLS");
        printf("--------СПИСОК--------\n\n");
        printList(head);//печать
        printf("\n\n");
        system("PAUSE");
        system("CLS");
        continue;
    }

    case 3: /// Вставить после указаного
        {
        system("CLS");
        printf("Введите Число для поиска: ");
        int key;
        scanf("%d", &key);

        printf("Введите Число для вставки: ");
        int numb;
        scanf("%d", &numb);

        ///Поиск
        Node* ptr = 0;
        ptr = head;
        while(1)
        {
           if(key==ptr->data)
         {
            insertAfter(ptr->next, numb);//вставить после
            printf("\n Элемент найден. Новое звено добавлено после %d.\n", ptr->data);
            break;
         }
           if(ptr->next == NULL)
           {
            printf("\n Элемент не найден\n");
            break;
           }
        ptr = ptr->next;}
        system("PAUSE");
        system("CLS");
        continue;
        }

}
return 0;
}
};
Vaden вне форума Ответить с цитированием
Старый 12.05.2022, 23:03   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

вы передаете ptr->next, а надо просто ptr
Цитата:
Сообщение от Vaden Посмотреть сообщение
Код:
insertAfter(ptr, numb);//вставить после

Последний раз редактировалось macomics; 12.05.2022 в 23:15.
macomics вне форума Ответить с цитированием
Старый 12.05.2022, 23:24   #3
Vaden
Новичок
Джуниор
 
Регистрация: 12.05.2022
Сообщений: 3
По умолчанию

macomics, Да, действительно, вместо очередного звена передавал указатель. Спасибо за помощь.
Vaden вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Добавления нового элемента в односвязный список каждый раз слева от последнего astero C# (си шарп) 3 17.05.2019 18:31
Часть кода сделал. Односвязный список без заглавного звена. Динамическая память. Перевернуть список и считать в обратном порядке. Varner Общие вопросы Delphi 5 19.05.2016 17:30
Односвязный список, добавление элемента Buserandi Общие вопросы C/C++ 13 27.07.2012 22:29
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45