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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ работа со структурой данных http://www.cyberforum.ru/cpp-beginners/thread708584.html
Определите структурный тип содержащий след инф-ю: Марка авто, цвет, кол-во, цена. Ввести 5 элем-в данного типа. Распечатать инф-ю в табл виде, расположив по алфавиту по цвету. Подсчитать сумму по каждой марке авто, сумму по всем авто и определить авто с самым популярным цветом. #include <stdio.h> #include <conio.h> void main()
C++ Посчитать сумму каждой строки матрицы отдельно void task_1(int **A, int M, int N) { int i=0,sum=0; //1.) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент; bool bFlag; for (int i=0; i < M; i++){ bFlag=false; for (int j=0; j < N; j++){ if(A<0){ http://www.cyberforum.ru/cpp-beginners/thread708578.html
Динамический массив C++
Программа берет из консоли строки и размещает их в динамических массивах строк. Перед размещением из строки удаляются все символы-разделители (пробелы и табуляция). Адреса этих массивов запоминаются в массиве указателей. После окончания ввода содержимое массивов выводится в стандартный поток вывода. Как оно должно работать? Не могу понять работу с динамическим массивом(
C++ Одномерные массивы: вычисление сумм элементов
Здравствуйте, дорогие форумчане. Мне снова нужна ваша помощь. Так как в задании есть примеры, которые в ручную и быстро не могу записать, поэтому прикрепил скрин.(7 задача). Если сможете, то помогите, пожалуйста. С меня много плюсов. ---------------------------------------------------------------- Как я понял, то можно начать так: #include <iostream> #include <conio> #include <math>
C++ Нахождение размера массива структур http://www.cyberforum.ru/cpp-beginners/thread708567.html
Пытаюсь создать массив с фразами, но не получается найти величину массива через strlen #include <iostream> #include <string.h> using namespace std; int main() { struct qwe{ char *r; }; qwe q = {"1","2","3"};
C++ Системы счисления(пояснения) #include <stdio.h> void main() { int n, a, b, c, n1; scanf("%d", &n); a=0; c=0; b=1; n1=n; подробнее

Показать сообщение отдельно
r9a109
0 / 0 / 0
Регистрация: 24.10.2012
Сообщений: 3
26.11.2012, 08:11  [ТС]     двусвязный список как сделать объединение?
Подскажите пожалуйста! Задание на курсовой было такое "Разработать абстрактный тип данных двусвязный список с методами". Один из методов - объединение списков. Я код написала, включила в качестве проверки в код распечатку объединенного списка. Программа список на экран выводит, после чего все выключается. Помогите переделать, чтобы работало!
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);
    }
}
 
Текущее время: 14:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru