Двусвязный список

216
16 декабря 2017, 07:10

Подскажите, пожалуйста, как правильно удалить элемент из двусвязного списка и добавить элемент в конец списка? Пример кода, который работает не так, как надо - ниже.

#include <iostream>       
#include <string>         
#include <fstream>        
using namespace std;
int n, nom;
struct node
{
    char word[256];   // Информационное поле.
    node *next;
    node *prev;     // Адресное поле. 
};
typedef node *list;
list build_list()             // Формирование двунаправленного списка. Создание одного элемента.
{
    list new_list = new(node);
    cin >> (new_list->word);
    new_list->prev = 0;
    new_list->next = 0;
    return new_list;
}
list make_list()               // Создание списка.
{
    list Head, p, u;
    do
    {
        cout << " \n\nВведите количество записей в списке: "; cin >> n;
        if (n <= 0) cout << " Столько элементов быть не может...";
    } while (n <= 0);
    if (n > 0)
    {
        Head = build_list();
        u = Head;
        for (int i = 1; i < n; i++)
        {
            p = build_list();
            p->prev = Head;
            Head->next = p;
            Head = p;
        }
        return u;
    }
    else
        return 0;
}
void Out(list u)           // Печать списка.
{
    list p = u;
    if (p == 0)
    {
        cout << " Список пустой...\n";
        return;
    }
    while (p != 0)
    {
        cout << p->word << endl;
        p = p->next;
    }
}
void Delete(list &Head, int nom)     // Удаление элемента с заданным номером.
{
    for (int i = 0; i < n; i++)
        if (i == nom)
        {
            Head->next = NULL;
        }
}
void addition(list &Head)        // Добавление элемента в начало списка.
{
    list now;
    now = make_list();
    now->next = Head; //Новый хвост смотрит на старый
    now->prev = NULL; //Новый хвост ни на что не оборачивается
    Head->prev = now; //Старый хвост оборачивается на новый
    Head = now; //Запоминаем указатель на новый хвост
}
void in_file(const list &Head, char x[])     // Запись списка в файл.
{
    ofstream u(x);
    if (x)
    {
        list p = Head;
        if (!p)
        {
            u << "Список пустой...\n";
            return;
        }
        while (p != 0)
        {
            u << p->word << endl;
            p = p->next;
        }
    }
    u.close();
}
list inFile(ifstream &f)     // Восстановление списка из файла. 
{
    list new_list = new (node);
    f >> new_list->word;
    new_list->prev = 0;
    new_list->next = 0;
    return new_list;
}
list vosstan(char u[])
{
    ifstream f(u);
    list Head = inFile(f);
    list pop = Head;
    list temp;
    while (!f.eof())
    {
        temp = inFile(f);
        if (f.eof())
            break;
        Head->next = temp;
        temp->prev = Head;
        Head = temp;
    }
    return pop;
}
void Delete_list(list&Head)          // Уничтожение списка.
{
    list p = Head;
    list temp;
    if (!p)
    {
        cout << "Список пустой...\n";
        return;
    }
    while (p != 0)
    {
        temp = p;
        p = p->next;
        delete(temp);
    }
}
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << " Записи в линейном списке содержат ключевое поле типа char*.\n Сформировать двунаправленный список.\n Удалить из него элемент с заданным номером, добавить элемент в начало списка." << endl;
    list Head;
    Head = make_list();
    cout << " Исходный список: \n";
    Out(Head);
    cout << " Введите номер удаляемого элемента: ";
    cin >> nom;
    Delete(Head, nom);
    cout << " Список после удаления элемента: "; cout << endl;
    Out(Head);
    cout << endl;
    cout << " Добавление элемента:"; cout << endl;
    addition(Head);
    cout << " Список с добавленным элементом: "; cout << endl;
    Out(Head); cout << endl;
    char x[100];
    cout << " Куда записать список? (название файла с расширением!)   "; cin >> x;
    in_file(Head, x); cout << endl;
    cout << " Список удаляется...\n"; cout << endl;
    Delete_list(Head);
    cout << " Список пустой..." << endl; cout << endl;
    cout << " Список восстанавливается...\n"; cout << endl;
    list head = vosstan(x);
    cout << " Итоговый список: "; cout << endl;
    Out(head); cout << endl;
    system("pause");
    return 0;
}
Answer 1

Код для удаления очень не правильный

void Delete(list &Head, int nom)     // Удаление элемента с заданным номером.
{
    //текущая нода
    list current=Head;
    //ищем позицию
    while (nom>0)
    {
        current=current->next;
        if (current==nullptr) throw RangeError;
        nom--;
    }
    //правим связи
    if (current->prev!=nullptr)current->prev->next = current->next;
    if (current->next!=nullptr)current->next->prev = current->prev;
    //если надо сдвигаем голову
    if (Head==curent) Head = current->next;
    //удаляем
    delete curent;
}
READ ALSO
Выписать цифры числа в обратном порядке с помощью цикла while [требует правки]

Выписать цифры числа в обратном порядке с помощью цикла while [требует правки]

Определить число выписыванием в обратном порядке цифр заданного натуральным числом nРезультат вывести на экран

186
Выписать цифры числа в обратном порядке с помощью цикла while

Выписать цифры числа в обратном порядке с помощью цикла while

У меня есть натуральное число n, как можно вывести его цифры в обратном порядке?

260
Как изменить масштаб графика

Как изменить масштаб графика

Используя ф-ции MovetoEx LineTO как изменить масштаб графика? При значении x=1 у=60, что за гранью рамки консолиВот исходник, помогите пожалуйста

267
Проблема error reading characters of string

Проблема error reading characters of string

Здравствуйте! Можете объяснить в чем причина ошибки error reading characters of string в данном коде:

344