Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
r9a109
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 3
25.11.2012, 15:58     двусвязный список как сделать объединение? #1
Подскажите пожалуйста! Задание на курсовой было такое "Разработать абстрактный тип данных двусвязный список с методами". Один из методов - объединение списков. Я код написала, включила в качестве проверки в код распечатку объединенного списка. Программа список на экран выводит, после чего все выключается. Помогите переделать, чтобы работало!
В прикреплённом файле исходник программы.
Вложения
Тип файла: zip spisok.zip (3.2 Кб, 11 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 15:58     двусвязный список как сделать объединение?
Посмотрите здесь:

Как переделать двусвязный список в циклический c++ C++
C++ двусвязный список
двусвязный список, как сделать добавление элемента? C++
C++ Возможно ли как-то переделать односвязный список в двусвязный?
C++ Как переделать эту прогу в шаблон классов "Двусвязный список" произвольных элементов
C++ Двусвязный список
Двусвязный список C++
Двусвязный список C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
r9a109
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 3
26.11.2012, 08:11  [ТС]     двусвязный список как сделать объединение? #2
Подскажите пожалуйста! Задание на курсовой было такое "Разработать абстрактный тип данных двусвязный список с методами". Один из методов - объединение списков. Я код написала, включила в качестве проверки в код распечатку объединенного списка. Программа список на экран выводит, после чего все выключается. Помогите переделать, чтобы работало!
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);
    }
}
Yandex
Объявления
26.11.2012, 08:11     двусвязный список как сделать объединение?
Ответ Создать тему
Опции темы

Текущее время: 23:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru