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

Перемещение элементов односвязного списка - C++

Восстановить пароль Регистрация
 
dude45
1 / 1 / 0
Регистрация: 26.10.2012
Сообщений: 13
28.03.2013, 16:46     Перемещение элементов односвязного списка #1
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
#include <stdio.h>
#include <conio.h>
void main()
{
    struct node
    {
        int inf;
        node*next;
    };
    printf ("Vvedite chislo elementov");
    int c;
    scanf("%d", &c);
    int a[100];
    for (int i=0; i < c; i++)
    {
        printf ("Vvedite %d element",i+1);
        scanf ("%d",&a[i]);};
    node*r;
    node*w;
    node*fr;
    node*er;
    fr=NULL;
    for (int i=0; i<=c; i++)
    {
        if(fr==NULL)
        {
            r=new node;
            r->inf=a[i];
            r->next=NULL;
            fr=r;
            er=r;}
        else
        {
            r=new node;
            r->inf=a[i];
            r->next=NULL;
            er->next=r;
            er=r;}};
    r=fr;
      while(r->next!=NULL)
        {printf("%d",r->inf);
        r=r->next;};
    while(r->next!=NULL) 
    {
        if(r->inf<0)
        {
            if(r==fr)
        
            {
                er->next=r;
                fr=r->next;
                r->next=NULL;
                er=r;}
            else
            {
                er->next=r;
                w->next=r->next;
                r->next=NULL;
                er=r;
            };
        };
        w=r;
        r=r->next;};
        r=fr;
        while(r->next!=NULL)
        {printf("%d",r->inf);
        r=r->next;};
        getch();}
Помогите, пожалуйста, найти ошибку в этом коде.
Цель: сделать так, чтобы отрицательные числа стояли после положительных. Обязательно использовать односвязный список.
Проблема: не перемещает отрицательные элементы (возможно ошибка с условием if(r->inf<0))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2013, 16:46     Перемещение элементов односвязного списка
Посмотрите здесь:

C++ Заполнение односвязного списка
копирование односвязного списка C++
C++ сортировка односвязного списка
C++ Удаление нескольких элементов из односвязного списка
C++ Сортировка односвязного списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
28.03.2013, 17:32     Перемещение элементов односвязного списка #2
dude45, а не легче ограничиться тем, что положительные добавлять в начало, а отрицательные в конец?

Добавлено через 15 минут
dude45, вот как-то так

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
#include <iostream>
#include <locale>
using namespace std;
 
struct List
{
    int data;
    List *next;
};
 
class ListNode
{
    private:
        List *Head;
 
    public:
        ListNode()
        {
            Head = NULL;
        }
 
        ~ListNode()
        {
            List *temp = Head;
            List *cur = NULL;
 
            while(temp != NULL)
            {
                cur = temp -> next; 
                delete temp;
                temp = cur; 
            }
        }
 
        void addToBack(const int value)                 //добавление в конец
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            if(Head == NULL)
            {
                Head = Ptr;
                Ptr -> next = NULL;
            }
            else
            {
                List *temp = Head;
 
                while(temp -> next != NULL)
                    temp = temp -> next;
                
                temp -> next = Ptr;
                Ptr -> next = NULL;
            }
        }
 
        void addToFront(const int value)                    //добавление в начало
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            Ptr -> next = Head;
            Head = Ptr;
        }
 
        void delList(const int value)
        {
            List *tmp = Head;
            List *cur = NULL;
 
            if(Head != NULL)
            {
                if((Head -> data) == value)                 //если удаляем 1 элемент
                {
                    cur = Head -> next;
                    delete Head;
                    Head = cur;
                }
                else
                {
                    while((tmp != NULL) && (tmp -> data != value))
                    {
                        cur = tmp;
                        tmp = tmp -> next;
                    }
 
                    if(tmp -> next == NULL)                 //если элемент между
                    {                                       //1 и последним
                        delete tmp;
                        cur -> next = NULL;
                    }
                    else                                    //если элемент последний
                    {
                        cur -> next = tmp -> next;
                        delete tmp;
                    }
                }
            }
        }
 
        void showList()
        {
            List *temp = Head;
 
            if(Head != NULL)
            {
                while(temp != NULL)
                {
                    cout << temp -> data << " ";
                    temp = temp -> next;
                }
 
                cout << "\n";
            }
            else
                wcout << L"Список пуст!\n";
        }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
 
    ListNode Universal;
    int value;
 
    for(int i = 0; i < 10; ++i){
        wcout << L"Введите число: ";
            cin >> value;
 
        if(value >= 0)
            Universal.addToFront(value);
        else
            Universal.addToBack(value);
 
        Universal.showList();
    }
 
    cout << "\n\n";
    return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от dude45 Посмотреть сообщение
node*r;
* * node*w;
* * node*fr;
* * node*er;
если по хорошему, это должно быть не в теле цикла... вынесите это.
dude45
1 / 1 / 0
Регистрация: 26.10.2012
Сообщений: 13
28.03.2013, 17:33  [ТС]     Перемещение элементов односвязного списка #3
yoghurt92, А можно как-то без использования классов? Можно ли это реализовать только с помощью: структур, функций, циклов и условного оператора?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
28.03.2013, 17:51     Перемещение элементов односвязного списка #4
dude45, очень непонятный код, я так понял вы сначала заполняете список, а потом сортируете... лучше добавлять элементы и сразу сортировать, положительные в начало, отрицательные в конец, мороки меньше

Добавлено через 22 секунды
dude45, можно

Добавлено через 9 минут
dude45,

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;
 
struct List
{
    int data;
    List *next;
};
  
void DeleteList(List *_Head)
{
    List *temp = _Head;
    List *cur = NULL;
 
    while(temp != NULL)
    {
        cur = temp -> next; 
        delete temp;
        temp = cur; 
    }
}
 
List *addToBack(List *_Head, const int value)                 //добавление в конец
{
    List *Ptr = new List;
    Ptr -> data = value;
 
    if(_Head == NULL)
    {
        _Head = Ptr;
        Ptr -> next = NULL;
    }
    else
    {
        List *temp = _Head;
 
        while(temp -> next != NULL)
            temp = temp -> next;
                
        temp -> next = Ptr;
        Ptr -> next = NULL;
    }
 
    return _Head;
}
 
List *addToFront(List *_Head, const int value)                    //добавление в начало
{
    List *Ptr = new List;
    Ptr -> data = value;
 
    Ptr -> next = _Head;
    _Head = Ptr;
 
    return _Head;
}
 
void delList(List *_Head, const int value)
{
    List *tmp = _Head;
    List *cur = NULL;
 
    if(_Head != NULL)
    {
        if((_Head -> data) == value)                 //если удаляем 1 элемент
        {
            cur = _Head -> next;
            delete _Head;
            _Head = cur;
        }
        else
        {
            while((tmp != NULL) && (tmp -> data != value))
            {
                cur = tmp;
                tmp = tmp -> next;
            }
 
            if(tmp -> next == NULL)                 //если элемент между
            {                                       //1 и последним
                delete tmp;
                cur -> next = NULL;
            }
            else                                    //если элемент последний
            {
                cur -> next = tmp -> next;
                delete tmp;
            }
        }
    }
}
 
void showList(List *_Head)
{
    List *temp = _Head;
 
    if(_Head != NULL)
    {
        while(temp != NULL)
        {
            cout << temp -> data << " ";
            temp = temp -> next;
        }
 
        cout << "\n";
    }
    else
        wcout << L"Список пуст!\n";
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
 
    List *Head = NULL;
    int value;
 
    for(int i = 0; i < 10; ++i){
        wcout << L"Введите число: ";
            cin >> value;
 
        if(value >= 0)
            Head = addToFront(Head, value);
        else
            Head = addToBack(Head, value);
 
        showList(Head);
    }
 
    DeleteList(Head);
 
    cout << "\n\n";
    return 0;
}
Добавлено через 7 минут
dude45, вот еще вариант

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
 
struct Print{
    template <typename T>
    void operator() (T &elem)
    {
        cout << elem << ' ';
    }
};
 
template <typename T>
void addToFront(list<T> &_coll, const T value)      
{
    _coll.push_front(value);
}
 
template <typename T>
void addToBack(list<T> &_coll, const T value)      
{
    _coll.push_back(value);
}
 
template <typename T>
void dellist(list<T> &_coll)
{
    _coll.pop_front();
}
 
template <typename T>
void showlist(list<T> &_coll)
{
    if(!_coll.empty())
    {
        for_each(_coll.begin(), _coll.end(), Print());
        cout << endl;
    }
    else
        wcout << L"Список пуст!\n";
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
 
    list<int> coll;
    int value;
 
    for(int i = 0; i < 10; ++i){
        wcout << L"Введите число: ";
            cin >> value;
 
        if(value >= 0)
            addToFront(coll, value);
        else
            addToBack(coll, value);
 
        showlist(coll);
    }
 
    if(coll.empty())
        coll.clear();
 
    cout << "\n\n";
    return 0;
}
dude45
1 / 1 / 0
Регистрация: 26.10.2012
Сообщений: 13
28.03.2013, 17:54  [ТС]     Перемещение элементов односвязного списка #5
yoghurt92, Спасибо за идею сортировки элементов до записи в список, но в коде я ничего не понял Буду делать по-своему.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
28.03.2013, 17:57     Перемещение элементов односвязного списка #6
dude45, почему ничего не поняли? давайте объясню.
dude45
1 / 1 / 0
Регистрация: 26.10.2012
Сообщений: 13
28.03.2013, 18:04  [ТС]     Перемещение элементов односвязного списка #7
yoghurt92, Я просто только начал изучать С++ и не знаю многих функций (или чего-то ещё), которые вы использовали.
Я попытался переделать, но опять не получается.
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
#include <stdio.h>
#include <conio.h>
void main()
{
    struct node
    {
        int inf;
        node*next;
    };
    printf ("Vvedite chislo elementov");
    int c,j=0,k=0;
    scanf("%d", &c);
    int a[100],b[100],d[100];
    for (int i=0; i < c; i++)
    {
        printf ("Vvedite %d element",i+1);
        scanf ("%d",&a[i]);
        if(a[i]<0)
        {
        b[i]=a[i];
        j++;}
        else
        {
            d[i]=a[i];
            k++;};}
     
    node*r;
    node*w;
    node*fr;
    node*er;
    fr=NULL;
    for (int i=0; i<j; i++)
    {
        if(fr==NULL)
        {
            r=new node;
            r->inf=b[i];
            r->next=NULL;
            fr=r;
            er=r;}
        else
        {
            r=new node;
            r->inf=b[i];
            r->next=NULL;
            er->next=r;
            er=r;}};
    r=er;
    for(int i=0;i<k;i++)
    {r=new node;
    r->inf=d[i];
    er->next=r;
    r->next=NULL;
    er=r;};
    r=fr;
      while(r->next!=NULL)
        {printf("%d",r->inf);
        r=r->next;};
    
        getch();
       }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 19:52     Перемещение элементов односвязного списка
Еще ссылки по теме:

C++ Создание односвязного списка
Удаление элементов из односвязного списка списка C++
C++ Вывод односвязного списка на C

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

Или воспользуйтесь поиском по форуму:
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
28.03.2013, 19:52     Перемещение элементов односвязного списка #8
dude45, вот вам написал

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale>               //для работы с юникод строками
using namespace std;
 
struct List
{
    int data;                   //данные(список состоит из последоват целых)
    List *next;                 //указатель на следующий элемент списка
};
  
void DeleteList(List *_Head)        //функция освобождения выделенной памяти
{
    List *temp = _Head;             //указываем на начало списка
    List *cur = NULL;               //промежуточная переменная
 
    while(temp != NULL)             //пока список не пуст
    {
        cur = temp -> next;         //указываем на след после удаляемого
        delete temp;                //удялем элемент
        temp = cur;                 //текущий равен последующему
    }
}
 
List *addToBack(List *_Head, const int value)                 //добавление в конец
{
    List *Ptr = new List;                   //выделяем память под новый элемент
    Ptr -> data = value;                        //инициализируем
 
    if(_Head == NULL)                   //если список пуст
    {
        _Head = Ptr;                    //голова равна новому эл-ту
        Ptr -> next = NULL;             //следующего нет
    }
    else                                        //если список не пуст
    {
        List *temp = _Head;                     //указываем на начало списка
 
        while(temp -> next != NULL)             //проходим по списку до конца
            temp = temp -> next;
                
        temp -> next = Ptr;                 //последний указывает на новый
        Ptr -> next = NULL;                 //новый становится последним
                                            //(NULL служет признаком конца списка)
    }
 
    return _Head;                           //возвращаем указатель на начало списка
}
 
List *addToFront(List *_Head, const int value)             //добавление в начало
{
    List *Ptr = new List;                       //выделяем память под новый элемент
    Ptr -> data = value;                            //инициализируем
 
    Ptr -> next = _Head;                            //новый указывает на начало
    _Head = Ptr;                                //новый становится головой списка
 
    return _Head;                           //возвращаем указатель на начало списка
}
 
void delList(List *_Head, const int value)          //удаляем элемент списка
{
    List *tmp = _Head;                      //указываем на начало списка
    List *cur = NULL;                       //промежуточная переменная
 
    if(_Head != NULL)                       //если список не пуст
    {
        if((_Head -> data) == value)                 //если удаляем 1 элемент
        {
            cur = _Head -> next;            //промежуточный равен второму эл-ту
            delete _Head;               //удаляем первый
            _Head = cur;                //первый равен второму
        }
        else                        //если удаляем не первый элемент
        {
            while((tmp != NULL) && (tmp -> data != value))      
                //идем пока не найдем или пока список не закончится
            {
                cur = tmp;                      //предыдущий элемент
                tmp = tmp -> next;              //текущий элемент
            }
 
            if(tmp -> next == NULL)                 //если элемент между 1 и последним
            {      
                cur -> next = tmp -> next;          //предыдущий указывает на следующи
                                                    //после удаляемого
                delete tmp;                         //удалячем
            }
            else                                    //если элемент последний
            {
                delete tmp;                         //удалячем
                cur -> next = NULL;                 //предпоследний указывает на NULL
                                                    //т.е. после стал последним
            }
        }
    }
}
 
void showList(List *_Head)              //выводим список на консоль
{
    List *temp = _Head;                 //указатель на начало списка
 
    if(_Head != NULL)                   //если список не пуст
    {
        while(temp != NULL)             //идем по списку
        {
            cout << temp -> data << " ";        //выводим текущий элемент
            temp = temp -> next;                    //переходим на следующий
        }
 
        cout << "\n";
    }
    else
        wcout << L"Список пуст!\n";
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));            //для вывод на консоли кириллицы
 
    List *Head = NULL;                      //список изначально пуст
    int value;                              //переменная для инициализации
 
    for(int i = 0; i < 10; ++i){            //вводим 10 элементов и заполняем список
        wcout << L"Введите число: ";
            cin >> value;
 
        if(value >= 0)                          //если положит
            //добюавляем в начало и возвращаем указатель на начало списка
            Head = addToFront(Head, value);     
        else
            //иначе добавляем в конец списка и возвращаем указатель на начало списка
            Head = addToBack(Head, value);
 
        showList(Head);                 //выводим список каждый раз после
                                        //добавления нового элемента
    }
 
    DeleteList(Head);                   //удаляем все что выделили
 
    cout << "\n\n";
    return 0;
}
Добавлено через 21 минуту
dude45, вот вашим методом написал, извините что не ищу у вас, уж очень плохо написали, читать трудно...

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale>               //для работы с юникод строками
#include <stdio.h>
#include <conio.h>
 
struct List
{
    int inf;
    List *next;
};
 
void main()
{
    int value, size = 5;
 
    List *head = NULL, *ptr, *cur;
 
    /*инициализируем список*/
    for (int i=0; i < size; ++i)
    {
        printf ("Vvedite %d element: ", i + 1);
        scanf ("%d", &value);
        
        ptr = new List;
        ptr -> inf = value;
 
        if(head == NULL)
        {
            head = ptr;
            ptr -> next = NULL;
        }
        else
        {
            if(ptr -> inf >= 0)
            {
                ptr -> next = head;
                head = ptr;
            }
            else
            {
                cur = head;
                while(cur -> next != NULL)
                    cur = cur -> next;
 
                cur -> next = ptr;
                ptr -> next = NULL;
            }
        }
 
        /*выводим список*/
        cur = head;
        while(cur != NULL){
            printf("%d ",cur -> inf);
            cur = cur -> next;
        }
 
        printf("\n");
    }
 
}
Yandex
Объявления
28.03.2013, 19:52     Перемещение элементов односвязного списка
Ответ Создать тему
Опции темы

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