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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dude45
1 / 1 / 0
Регистрация: 26.10.2012
Сообщений: 13
#1

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

28.03.2013, 16:46. Просмотров 874. Ответов 7
Метки нет (Все метки)

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++
Нужно удалить элемент из списка. Удаляю элемент не по позиции а по значению (задаю это значение). И вот в чем проблема, если например в...

Циклический сдвиг односвязного списка, организованного структурами, на N элементов вправо/влево - C++
Подскажите, как лучше всего циклически сдвинуть односвязный список, организованный структурами, на N элементов вправо/влево, может ему...

Идеология односвязного списка - C++
Здарова! Посмотрел, что такое односвязный список и возникли естественно кое-какие чисто идеологические вопросы. Насколько я понял,...

Сортировка односвязного списка - C++
Добрый день форумчанам! Есть задача но не знаю как написать ее так как не знаю динамического программирования ) Будьте любезны...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
yoghurt92
374 / 345 / 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
374 / 345 / 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
374 / 345 / 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();
       }
yoghurt92
374 / 345 / 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");
    }
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 19:52
Привет! Вот еще темы с ответами:

Сортировка односвязного списка - C++
Здравствуйте уважаемые киберфорумщики! Нужна срочная помощь!!! В общем у меня есть задача которую нужно сделать но нет ни знаний ни...

Печать односвязного списка - C++
Доброго времени суток. Выполняя задание возникла трудность. Использую метод для этого, но почему-то вместо адекватного текста появляется...

Сортировка односвязного списка - C++
ребят, нужна помощь, учусь на втором курсе для зачета нужно написать сортировку односвязного списка. а мы такого рода программы не...

Сортировка односвязного списка - C++
В условии задачи нужно считать из файла неопределенное количество студентов и занести их в односвязный список. Отсортировать по изучаемому...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.03.2013, 19:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru