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

Списки. Функции добавление списка в конец и в середину другого списка. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти наименьший диагональный элемент и его номер среди четных по номеру и нечетных по величине отрицательных элементов http://www.cyberforum.ru/cpp-beginners/thread417189.html
Найти наименьший диагональный элемент и его номер среди четных по номеру и нечетных по величине отрицательных элементов
C++ Кто может объяснить? Кто может объяснить как это делать? Задание 1. В оперативной памяти вектор int X расположен, начиная с адреса B7F0. Какие значения примут выражения: а) X+1; б) X+5; в) X-4? А)B7F2 б)B7G0 в)B7I2 Задание 2. В программе объявлен массив: int P ={0, 2, 4, 5, 6, 7, 9, 12}; Какие значения примут выражения: а) P ; б) *P; в) *(P+4); г) *(P+P)? А)5 б)0 в)6 г)6 http://www.cyberforum.ru/cpp-beginners/thread417171.html
C++ Какое значение примет переменная s после выполнения следующих операторов?
int i, s=10, a=3; for (i=1; i<4; i++) if (i==a) s=s*a*a; else s=a; s=s/a;
Моделирование C++
Помогите пожалуйста с заданием, вообще не представляю как его делать. задание в фаиле.
C++ Как правильно подключить модули? http://www.cyberforum.ru/cpp-beginners/thread417142.html
Задача: Даны натуральное число n, действительные числа x1,y1; x2,y2;... xn,yn;. Найти площадь n-угольника, вершины которого при некотором последовательном обходе имеют координаты (x1,y1); (x2,y2);... (xn,yn). (Определить процедуру вычисления площади треугольника по координатам его вершин.) Нужно решить с использованием модулей. Не могу понять что не так. Есть main.cpp: #include...
C++ Пересечение прямоугольников на плоскости привет! ребят помогите, пожалуйста.. все по порядку: задача: Реализовать класс, позволяющий хранить данные о координатах прямоугольника на плоскости. Создать конструкторы, а также методы, позволяющие вычислить периметр и площадь прямоугольника. Создать в основной части программы два объекта этого класса и выяснить, пересекаются ли два прямоугольника. вот я создал 2 объекта, сделал методы... подробнее

Показать сообщение отдельно
KOPC1886
27 / 6 / 0
Регистрация: 28.10.2010
Сообщений: 352
25.12.2011, 17:55     Списки. Функции добавление списка в конец и в середину другого списка.
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину списка1, а 2 - добавляет список2 в конец списка1....когда я использую каждую функцию по отдельности, все прекрасно работает, а когда использую обе сразу..то у меня вывод бесконечен. В чем дело? Где я ошибся? Вот код:
Сами функции..они в хедере H2
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
#include <iostream>
using namespace std;
struct Node
{
        char a;
        Node *next;
        Node *prev;
 
};
 
 
Node * first(char a);
void PrintList(Node *pbeg);
void add(Node **pend, char a);
void dob(Node *pbeg, Node *n2, char a);
void konSp(Node *pbeg, Node *n2);
Node * find(Node * const pbeg, int i);
bool remove(Node **pbeg, Node **pend, int key);
Node * incert(Node * const pbeg, Node **pend, int key, char a);
Node *searchEnd(Node *n2);
///////////////////////////////////////////////////////////////////
 
// Формирование первого элемента
Node * first(char a)
{
        Node *pv = new Node;
        pv->a = a;
        pv->next = 0;
        pv->prev = 0;
        
        return pv;
}
//
//Добавление списка2 в середину списка1 после элемента "a"
void dob(Node *pbeg, Node *n2, char a)
{
    Node *pv=pbeg;
    Node *ph=new Node;
    Node *pk=new Node;
    while(pv->next)
    {   
        if(pv->a==a)
        {
            ph=searchEnd(n2);
            pk=pv;
            ph->next=pk->next;  
            pk->next=n2;                    
        }
        pv=pv->next;                    
    }
 
}
 
//Добавление списка2 в конец списка1
void konSp(Node *pbeg, Node *n2)
{
    Node *pv=pbeg;
    while(pv->next!=NULL)
    {       
        pv=pv->next;
    }
    //break;
    pv->next=n2;
    
    //return pbeg;
    
}
 
// Добавление в конец списка
void add(Node **pend,char a)
{
        Node *pv = new Node;
        pv->a = a; 
        pv->next = 0; 
        pv->prev = *pend;
        (*pend)->next = pv;
        *pend = pv;
 
}
 
Node * add1(Node **pend, char a)
{
    Node *pv = new Node;
    pv->a        = a; 
    pv->next = 0; 
    pv->prev = *pend;
    (*pend)->next = pv;
    return (*pend = pv);
}
/////////////////
// Печать списка
void PrintList(Node *pbeg)
{
    // pv пробегает по списку, начиная с головы
    Node *pv = pbeg;
    while(pv )// пока не конец списка, печатать значение данных текущего узла 
        {
            cout<<pv->a;
    
            pv = pv->next; // перейти к следующему узлу 
        }
}
//////////////////////
Node *searchEnd(Node *n2)
{
    Node *pt=new Node;
    while(n2)
    {
        n2=n2->next;
        if(n2->next==NULL)
        {
            pt=n2;
            break;
        }
    }
    return pt;
}
 
///////////////////////////////
Node * find(Node * const pbeg,int i)
{
        Node *pv = pbeg;
        while (pv)
        {
                if (pv->a==i)break;
                {
                        
                        pv=pv->next;
                }
        }
                return pv;
 
 
}
 
// Удаление элемента
 
bool remove(Node **pbeg, Node **pend, int key){
if(Node *pkey = find(*pbeg, key)){
        if (pkey == *pbeg)
        { // 2
                *pbeg = (*pbeg)->next;
                (*pbeg)->prev =0;
        }
        else if (pkey == *pend){ // 3
                *pend = (*pend)->prev;
                (*pend)->next =0;}
else
{        // 4
        (pkey->prev)->next = pkey->next;
        (pkey->next)->prev = pkey->prev;
}
 
delete pkey;
return true; // 5
}
return false; 
}// 6
 
//
// Вставка элемента
 
Node * incert (Node * const pbeg, Node **pend, int key, char a){
if(Node *pkey = find(pbeg, key)){
Node *pv = new Node;
pv->a = a;
// 1 - установление связи нового узла с последующим:
pv->next = pkey->next;
// 2 - установление связи нового узла с предыдущим:
pv->prev = pkey;
// 3 - установление связи предыдущего узла с новым:
pkey->next = pv;
// 4 - установление связи последующего узла с новым:
if( pkey != *pend) (pv->next)->prev = pv;
// Обновление указателя на конец списка,
// если узел вставляется в конец:
else *pend = pv;
return pv;
}
 
 
 
return 0;
}
А вот сам main
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
// Списки и структуры.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "H1.h"
using namespace std;
 
//void sk(Node *pbeg,Node *pend);
 
int _tmain(int argc, _TCHAR* argv[])
{
    Node *pbeg = first('a'); // Формирование первого элемента списка 1
    Node *pend = pbeg;
    Node *n2=first('e');// Формирование первого элемента списка 2
    Node *pend2=n2;
    // Спискb заканчивается, едва начавшись
    
    /*
     ifstream fin("array.txt", ios::in);
     if (!fin)      cout << "Not file!"<< endl;
     int nrow, i;
     fin >> nrow;
     char *M = new char [nrow];
     for (i = 0; i < nrow; i++)      fin >> *(M + i);
*/
    int size;
    int size2;
    int ind;
    int scob=0;
    char Form[]={"bczxv"};//из массива в список №1
    size=strlen(Form);
    for (int i = 0; i<size; i++)
    {
        //add(&pend,Form[i]);
        add1(&pend, Form[i]);
        if (Form[i]=='(')
        {               
            scob++;
            ind=i;
            
        }
        if (Form[i]==')')
        {
            scob--;
            ind=i;
        }   
    }       
    Node *pv = pbeg;
    Node *ph=new Node;
    Node *pd=new Node;  
    Node *pk=new Node;
    
    char Temp[]={"frt"};//из массива в список №2
    size2=strlen(Temp);
    for (int i = 0; i<size2; i++)
    {   
        add(&pend2,Temp[i]);            
    }
    //incert(pbeg, &pend, 'y',&pendn);
    // Удаление элемента 5
    //if(!remove (&pbeg, &pend, Form[3]))cout << "не найден";
    // Вставка элемента 200 гюсле элемента 2:
 
        /*// Поис скобок и их замена на пробелы
        if(pv->a=='(')
        {                   
            pk=pv;          
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }       
        //Вставка списка №2 в список №1     
        if(pv->a=='c')
        {
            ph=searchEnd(n2);
            pk=pv;
            ph->next=pk->next;  
            pk->next=n2;        
        }*/
        //Вставка списка №2 после списка №1 
        /*
        if(pv->a=='v')
        {
            pk=pv;
            //ph=searchEnd(pbeg);           
            //pv->next=n2;      
            pk->next=n2;
    
        }*/
        
        //Вставка списка №2 в список №1  функция  
        dob(pbeg,n2,'c');
        konSp(pbeg,n2);
        // вывод списка на экран
        
        PrintList(pbeg);
    
    cout <<endl;
    
/*
    for(pv = pbeg; pv!=0; pv = pv-> next)
    {
        if(pv->a=='k')
        {
            pk=pv;
            pk=n2->next->prev;
        }
        cout<<pv->a;
    }
    
 
    
    if (scob> 0)
           cout << "( bigger"<<ind<<endl;
    else if (scob< 0) 
           cout << ") bigger"<<ind<<endl;
    else if (scob == 0) cout << "Good";
    */
 
    return 0;
}
 
/*void sk(Node **pbeg,Node **pend)
{
    Node *pv=new Node;
    if(pv->a=='(')
        {                   
            Node *pk=pv;            
            while(pk->next!=NULL)
            {
                pk = pk->next;
                if(pk->a==')')
                {
                    pk->a=' ';
                    pv->a=' ';
                    break;
                }               
            }   
        }
 
}
*/
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 18:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru