Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 1
Регистрация: 24.10.2012
Сообщений: 3

двусвязный список как сделать объединение?

25.11.2012, 15:58. Показов 5206. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста! Задание на курсовой было такое "Разработать абстрактный тип данных двусвязный список с методами". Один из методов - объединение списков. Я код написала, включила в качестве проверки в код распечатку объединенного списка. Программа список на экран выводит, после чего все выключается. Помогите переделать, чтобы работало!
В прикреплённом файле исходник программы.
Вложения
Тип файла: zip spisok.zip (3.2 Кб, 14 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2012, 15:58
Ответы с готовыми решениями:

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

Как отсортировать двусвязный список?
Здравствуйте, имеется двусвязный список, в узлах - информация о поездах и нужно его отсортировать по "возростанию" городов. Мой...

Как создать двусвязный список?
Собственно... не шарю, как сделать двусвязный! односвязный вроде как получается. Двусвязный как-то и не очень :( Конструктор: list() {...

1
0 / 0 / 1
Регистрация: 24.10.2012
Сообщений: 3
26.11.2012, 08:11  [ТС]
Лучший ответ Сообщение было отмечено r9a109 как решение

Решение

Подскажите пожалуйста! Задание на курсовой было такое "Разработать абстрактный тип данных двусвязный список с методами". Один из методов - объединение списков. Я код написала, включила в качестве проверки в код распечатку объединенного списка. Программа список на экран выводит, после чего все выключается. Помогите переделать, чтобы работало!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
//List.h
#pragma once
#ifndef List_h
#define List_h
 
    class Node
    {
        public:
 
        int data;
        Node *next;
        Node *prev;
 
        Node(int d = 0)
        {data=d;next = 0;prev=0;} //конструктор
 
    };
 
    class List   //Создаем тип данных Список
 {
     Node *Head,*End; //Указатели на адреса начала списка и его конца
     int count;     //количество элементов списка
 public:
    List(){Head=NULL;End=NULL;count=0;}//конструктор
    ~List(); //Деструктор+
    Node * find (int  index) const;
    void Add(int data); //Функция добавления элементов в конец списка
    Node *Add(int num, int data);//Функция добавления узла под определенным номером
    bool IsEmpty(Node *Head);   //проверка пустоты двунаправленого списка
    bool clear(int num);    //удаление узла
    void clear();   //очистить список
    void refresh(int num, int data);    //изменение элемента списка
    void output();  //вывод списка на экран
    int print_count();  //количество элементов
    List operator+=(List rhs);
    friend int GetNumber(int, int);
 };
 
//проверка пустоты двунаправленного списка
 bool IsEmpty(Node *Head)
{
  if (Head!=NULL)  return false;
  else  return true;  
}
 
 List::~List()  //деструктор
{
    if (Head !=0)
    {
        Node *pv = Head;
        while (pv)
        {
            pv = pv->next;
            delete Head;
            Head = pv;
        }
    }
}
 
 Node * List::find (int  index) const 
{ 
    if ( (index < 1)  || (index > count) )  
        return NULL; 
    else // Отсчет от начала списка 
    { 
        Node   *cur   =  Head; 
        for  (int  i=1;i<index;++i) 
        cur   =  cur->next; 
        return  cur; 
    }   
}
 
 Node * List::Add(int num, int data)
{
if(Node *pkey = find(num-1))
  { 
  // Поиск узла с ключом key
  /* Выделение памяти под новый узел и его инициализация */
  Node *pv = new Node(data);    
  /* Установление связи нового узла с последующим */
  pv->next = pkey->next;    
  // Установление связи нового узла с предыдущим
  pv->prev = pkey;          
  // Установление связи предыдущего узла с новым
  pkey->next = pv;          
  if( pkey != End) 
   (pv->next)->prev = pv;   /* Установление связи последующего узла с новым */
        /* Обновление указателя на конец списка, если узел вставляется в конец */
        else End = pv;  
  return pv;
  }
return 0;
}
 
int List::print_count()
{
    return count;
}
 
void List::Add(int data) //Функция добавления элементов в конец списка
 
{
    Node *temp=new Node(data); //Выделение памяти под новый элемент
    if (Head==NULL) //Если список пуст
        Head=End=temp;  // Первый узел списка
    else
        {
            temp->prev = End;   // Связывание нового узла с предыдущим
            End->next = temp;
            End = temp;
        }       
    count++;
}
 
// удаление всего списка
void List::clear()
{
     while (Head)
     {
          Node *pv = Head;
          Head= pv->next;
          delete pv;
     }
     End = Head;
     
     count = 0;
}
 
bool List ::clear(int num)
{
    Node *pTemp = Head;     //создаем временный элемент
    if ((num>count) || (num<1))  //если указанный элемент не существует, то
    {std::cout << "Такого элемента не существует" << std::endl;return false;}  //выводим предупреждение на экран
    else
    {
        for(int i=1; i!=num; i++)   //иначе, переходим до этого элемента
        {
            pTemp = pTemp->next;
        }
 
        if(Node *pkey = pTemp)
        {
            if (pkey == Head)
            {
                Head = Head->next;
                Head->prev = 0;
            }
            else if (pkey == End)
            {
                End = End->prev;
                End->next = 0;
            }
                else 
                {
                    (pkey->prev)->next = pkey->next;
                    (pkey->next)->prev = pkey->prev;
                }
            delete pkey;
            count--;
            return true;
        }
    return false; 
    }
}
 
void List::refresh(int num, int data)
{
    clear(num);
    Add(num, data);
}
 
void List::output()
{
    Node *pv = Head;
    std::cout <<std::endl << "Список: ";
    while (pv)
    {
        std::cout << pv->data << ' ';
        pv = pv->next;
    }
    std::cout << std::endl;
}
 
List List::operator+=(List rhs)
{
    List temp;
    temp = *this;
    Node *cur = rhs.Head;
    //далее соединяем списки
    for (int j=1; j<=rhs.count; j++)
    {
        std::cout << cur->data << ' ';
        temp.Add(cur->data);
        temp.count++;
        cur=cur->next;
    }
    rhs.Head = NULL;
    rhs.End = NULL;
    rhs.count = 0;
 
    std::cout<<"temp";
    temp.output();
    return temp; 
}
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//Spisok.cpp
#include <iostream>
#include <clocale>
#include <cstring>
#include <windows.h> 
#include "List.h"
 
using namespace std;
 
int Menu();
int GetNumber(int min, int max);
void ExitBack();
 
void Enter_LST (List *ls);
void Show_All(List A,List B);        //вывести все списки
void AddItem(List A,List B);     //добавить элемент
void DeleteItem(List A,List B);  //удалить элемент из списка
void DeleteAll(List A,List B);   //Очистить все  списки
void count(List A,List B);  //показать количество элементов в списке
void change(List A,List B); //изменение элемента в списке
 
int main(int argc, char* argv[])
{
    List A; //объект типа список
 
    setlocale(LC_ALL,"rus");
    Enter_LST (&A);
    cout<<endl;
 
   // Главный цикл
      bool done = false;
      while (!done) 
        {
    
          switch (Menu()) 
          { 
              case 1:  {    cout<<"Вывод всех элементов\n"<<endl;
                            cout<<"Список A"<<endl;
                            A.output(); ExitBack();}break;
              case 2:  {    int a;
                            cout<<"Введите значение нового элемента: ";
                            cin>>a;
                            A.Add(a);ExitBack();}break;
              case 3:  {    int i=0;cout<<"Введите номер элемента, который вы хотите удалить = ";
                            cin>>i; 
                            A.clear(i);ExitBack();}break;
              case 4:  {    cout<<"Количество элементов списка: "<<A.print_count()<<endl;
                            ExitBack();
                        }   break;
              case 5:  {    
                            int i=0;
                            int a=0;
                            cout<<"Введите номер элемента, который вы хотите изменить = ";
                            cin>>i;
                            cout<<"Введите значение элемента: ";
                            cin>>a;
                            A.refresh(i,a);
                            ExitBack();
                        }   break;
              case 6:    { A.clear();   ExitBack();}        break;
              case 7:     {List B;Enter_LST (&B);A+=B;cout<<"Количество элементов списка: "<<A.print_count()<<endl;A.output();ExitBack();}     break;                
              case 0: cout << "Конец работы." << endl;
                  done = true;    break;
          }
      }
  
  ExitBack();
  return 0;
}
// -------------- ввод целого числа в заданном диапазоне
int GetNumber(int min, int max) 
{
    int number = min - 1;
    bool success = false;
    while (!success)
    {
        cin >> number;
        if ((number >= min) && (number <= max) && (cin.peek() == '\n'))
            break;
        else 
        {
            cout << "Повторите ввод (ожидается число от " << min 
                    << " до " << max << "):" << endl;
            cin.clear();
            while (cin.get() != '\n') {};
        }
    }
    return number;
}
 
//// -------------вывод меню
int Menu() {
  system("cls");
    cout << "\n=============== Г л а в н о е   м е н ю ===================" << endl;
    cout << "1 - вывести на экран список " << endl;
    cout << "2 - добавить элемент в список" << endl;
  cout << "3 - удалить элемент из списка" <<endl;
  cout << "4 - вывести на экран количество элементов списка" <<endl;
  cout << "5 - изменение элемента" << endl;
  cout << "6 - очистить список" << endl;
  cout << "7 - объединение списков" << endl;
  cout << "0 - Выход"<<endl;
  cout<<endl<<" \nВаш выбор: ";
    return GetNumber(0, 7);
}
 
// ------------------- возврат в функцию с основным меню
void ExitBack() 
{
    cout << "Нажмите Enter." << endl;
    cin.get();  cin.get();
}
 
void Enter_LST (List *ls)
{
    int k=0;
    int a=0;
    cout<<"Введите размер списка: ";
    cin>>k;          
    cout<<endl;
    cout<<"Введите  элементы списка через пробел   =   ";
    for (int i=0; i<k; i++)
    {
        cin>>a;
        ls->Add(a);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2012, 08:11
Помогаю со студенческими работами здесь

Как переделать двусвязный список в циклический c++
Как переделать двусвязный список в циклический c++

Как создать двусвязный линейный список?
Люди добрые, помогите с лабораторной работой! Нужно выполнить следующее: 3) Двусвязный линейный список. Дополнительные операции: a)...

Как в алгоритме обозначить двусвязный список?
Написал программу для двусвязного списка. Проблема в том, как составить алгоритм? В программе присутсвует ввод элементов списка, вывод,...

Возможно ли как-то переделать односвязный список в двусвязный?
Собственно вопрос в названии. Возможно ли переделать односвязный список в двусвязный? Или проще написать программу наново? Вот сама...

Двусвязный список. Как обратиться к первому элементу списка
Добрый день. Есть программа, для которой нужно сделать функцию FindMin, которая бы находила наименьший элемент из элементов одного типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru