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

Односвязный список - C++

Восстановить пароль Регистрация
 
cybernate
3 / 3 / 0
Регистрация: 10.03.2013
Сообщений: 45
27.09.2013, 19:05     Односвязный список #1
Дано два списка с целыми числами. Создать новый список в котором размещены элементы какие одновременно присутствуют в первых двух списках.
Скорее всего проблема в функции PrintDouble но не могу ее найти. Функция проверяет только первый элемент первого списка со всеми элементами второго, но не переходит на следующий. Подскажите в чем может быть проблема.

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
#include<iostream>
#include<string>
using namespace std;
 
struct element
{
    int data;
    element * next;
};
 
typedef element * ptr;
 
ptr AddElem(ptr head, int elem)
{
    ptr x;
 
    x = (element*)malloc(sizeof(element));
    //delete x; free(x);
    x->data= elem;
    x->next = head;
    head = x;
    return head;
}
 
void Print(ptr head)
{
    ptr x;
    x = head;
    while(x!=NULL)
    {
        cout<<x->data<<", ";
        x = x->next;
    }
    cout<<"NULL"<<endl;
}
 
void PrintDouble(ptr f, ptr s, ptr *head)
{
    ptr p,p2;
    p=f; p2 = s;
    while(p2!=NULL)
    {
        if(p->data==p2->data)
        {
            cout<<"OK\t";
            //*head = AddElem(*head,p->data);
            if(p2!=NULL)
            {
                p2=p2->next;
            }
            else
            {
                if(p!=NULL){
                p=p->next;
                p2=f;}
                else
                {   break;  }
            }
            
        }
        else
        {
            cout<<"NO\t";
            if(p2!=NULL)
            {
                p2=p2->next;
            }
            else
            {
                if(p!=NULL){
                p=p->next;
                p2=f;}
                else
                {   break;  }
            }
 
 
        }
//___________________________________________________
    }
}
 
int main()
{
    ptr head,List,List2;
    int elem,i ,n;
    cout<<"Enter the number of elem:\n";    cin>>n;
    head = NULL;    List = NULL;    List2 = NULL;
    
    cout<<"Vvedite chisla v pervui spisok!\n";
    
    for(i = 0; i<n; i++)
    {
        cin>>elem;
        List = AddElem(List, elem);
    }
 
    cout<<"Vvedite chisla v drugui spisok!\n";
    
    for(i = 0; i<n; i++)
    {
        cin>>elem;
        List2 = AddElem(List2, elem);
    }
    cout<<"first list:\n";  Print(List);
    cout<<"\nsecond list:\n";   Print(List2);
    
 
    cout<<"New List: "; PrintDouble(List,List2,&head);
    Print(head);
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2013, 19:05     Односвязный список
Посмотрите здесь:

Односвязный список C++
односвязный список C++
C++ Односвязный список
Односвязный список C++
C++ Односвязный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
27.09.2013, 21:16     Односвязный список #2
C++
1
2
3
4
5
        if(p->data==p2->data)
        {
            cout<<"OK\t";
            //*head = AddElem(*head,p->data);
            if(p2->data)
Эта проверка не имеет смысла. Ведь если p2->data, то ясно, что p2->data!=0.
работа с указателями в PrintDouble вообще хаотична, поэтому проще написать заново:
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
void PrintDouble(ptr first, ptr second, ptr dst/*тут будет новый список.*/) {
    dst = 0; //на всякий случай
    ptr curf = first, curs, cur;
    while(curf) {
        curs = second;
        while(curs) {
            if (curf->data==curs->data) {
                /*предыдущие списки изменяться не будут*/
                ptr temp = new element;
                element->data = curf->data;
                element->next = 0;
                if (!dst) { //первый элем.
                    dst = temp;
                    cur = temp; //это курсор, чтоб не потерять голову списка
                } 
                else {
                    cur->next = temp;
                    cur = cur->next;
                }   
                break;
            }
        curs = curs->next;
        }
        curf = curf->next;
    }
}
cybernate
3 / 3 / 0
Регистрация: 10.03.2013
Сообщений: 45
28.09.2013, 11:43  [ТС]     Односвязный список #3
спасибо.
C++
1
ptr curf = first, curs, cur;
Как это понять?)

Добавлено через 13 часов 38 минут
Эта функция создает список только внутри себя, а при выходе его удаляет.
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
void PrintDouble(ptr f, ptr s, ptr dst)
{
    
     dst = 0; //на всякий случай
    ptr curf = f, curs, cur;
    while(curf) {
        curs = s;
        while(curs) {
            if (curf->data==curs->data) {
                /*предыдущие списки изменяться не будут*/       
                ptr temp = new element;
                temp->data = curf->data;
                temp->next = 0;
                if (!dst) { //первый элем.
                    dst = temp;
                    cur = temp; //это курсор, чтоб не потерять голову списка
                } 
                else {
                    cur->next = temp;
                    cur = cur->next;
                }   
                break;
            }
        curs = curs->next;
        }
        curf = curf->next;
        
    }   
}
Я пробовал записать ptr dst как ptr *dst но ошибок дало еще больше.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 12:00     Односвязный список #4
Цитата Сообщение от cybernate Посмотреть сообщение
ptr curf = f, curs, cur;
все эти переменные наверно указатели, потому что:
Цитата Сообщение от cybernate Посмотреть сообщение
if (curf->data==curs->data)
Добавлено через 54 секунды
и аргументы функции тоже должны быть указателями
cybernate
3 / 3 / 0
Регистрация: 10.03.2013
Сообщений: 45
28.09.2013, 12:25  [ТС]     Односвязный список #5
я вижу что то указатели)) Я не пойму что указателю ptr присваивается сразу три других указателя. Что именно будет хранится в ptr. Разве мы можем записать int x = 2,3,4 ? Аргументы и есть указателями.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 12:34     Односвязный список #6
Цитата Сообщение от cybernate Посмотреть сообщение
ptr присваивается сразу три других указателя.
не присваиваются.
переменной curf присваивается значение f
а так же объявляются еще две переменных (curs и cur)

для примера:
C++
1
int a = 5, b, c;
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
28.09.2013, 13:15     Односвязный список #7
Цитата Сообщение от cybernate Посмотреть сообщение
Эта функция создает список только внутри себя, а при выходе его удаляет.
Не, не удаляет. delete нигде не используется же ж. А про остальное тебе объяснили)
cybernate
3 / 3 / 0
Регистрация: 10.03.2013
Сообщений: 45
28.09.2013, 15:07  [ТС]     Односвязный список #8
Точно! int a = 5, b, c; Спасибо!
Я не имею в виду что список удаляется, но просто создаётся в теле функции и больше нигде. В этом случае с ним нельзя работать так как он(список) не может выйти из этой функции.

Кароче, ptr dst не передаёт список)
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
28.09.2013, 19:04     Односвязный список #9
ptr dst ~ element* dst
Поэтому как это не передает?
Хотя, возможно, правильнее было бы этот dst создавать в теле функции, и возвращать return'ом. так 100% будет работать(хотя то, что я написал ранее, тоже должно, видать, как-то не так используешь).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 21:33     Односвязный список
Еще ссылки по теме:

C++ Односвязный список
Односвязный список C++

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

Или воспользуйтесь поиском по форуму:
cybernate
3 / 3 / 0
Регистрация: 10.03.2013
Сообщений: 45
28.09.2013, 21:33  [ТС]     Односвязный список #10
Цитата Сообщение от monolit Посмотреть сообщение
ptr dst ~ element* dst
Поэтому как это не передает?
Хотя, возможно, правильнее было бы этот dst создавать в теле функции, и возвращать return'ом. так 100% будет работать(хотя то, что я написал ранее, тоже должно, видать, как-то не так используешь).
ptr dst позволяет работать с ним внутри функции, но не разрешает работать с ним из main.
То-есть если я пишу Print(dst); внутри функции то он выводит список, но если я напишу это в main то ничего не произойдет.

Добавлено через 54 минуты
Вот разве что return-ом)
Ладно, спасибо всем за помощь!
Yandex
Объявления
28.09.2013, 21:33     Односвязный список
Ответ Создать тему
Опции темы

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