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

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

Войти
Регистрация
Восстановить пароль
 
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
#1

Нужно найти ошибку в списках - C++

11.08.2016, 10:48. Просмотров 218. Ответов 10

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
#include <iostream>
#include <conio.h>
 
using std::cout;
using std::cin;
using std::endl;
 
//структуры
struct Abc
{
    int key;
};
struct pt
{
    Abc a;
    pt *next;
};
 
//прототипы
void Ins_begin(pt*,Abc);
void Ins_midl(pt*,Abc);
void Ins_end(pt*,Abc);
 
//функции
void Ins(pt *begin,pt *end,Abc el)
{
    if (begin==NULL){Ins_begin(begin,el); end=begin;}
    else if (el.key<=begin->a.key) Ins_begin(begin,el);
    else if (el.key>=end->a.key) Ins_end(end,el);
    else Ins_midl(begin,el);
}
void Print(pt *begin)
{
    pt *print=begin;
    while(print!=NULL)
    {
        cout<<print->a.key<<"->";
        print=print->next;
    }
    cout<<endl;
}
void Ins_begin(pt *begin,Abc el)
{
    pt *new_begin;
    new_begin=new pt;
    new_begin->next=begin;
    new_begin->a=el;
    begin=new_begin;
}
 
int main()
{
    //setlocale(LC_ALL,"Russian");
    pt *begin=NULL,*end=begin;
    Abc a,b,c;
 
    cin>>a.key>>b.key>>c.key;
    Ins(begin,end,a);
    Ins_begin(begin,b);
    Ins_begin(begin,c);
    Print(begin);
    _getch();
    return 0;
}
Начал изучать ДП и списки в С++, написал в функции main простую проверку работают ли функции, но программа даже не компилируется. Выдает ошибки:

Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl Ins_midl(struct pt *,struct Abc)" (?Ins_midl@@YAXPAUpt@@UAbc@@@Z) в функции "void __cdecl Ins(struct pt *,struct pt *,struct Abc)" (?Ins@@YAXPAUpt@@0UAbc@@@Z)

Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl Ins_end(struct pt *,struct Abc)" (?Ins_end@@YAXPAUpt@@UAbc@@@Z) в функции "void __cdecl Ins(struct pt *,struct pt *,struct Abc)" (?Ins@@YAXPAUpt@@0UAbc@@@Z)

Ошибка 3 error LNK1120: неразрешенных внешних элементов: 2

Не могу понять, что за неразрешенные внешние элементы. Помогите!
(Куча непонятных символов в ошибках не пропадает, даже если отключить setlocale)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2016, 10:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно найти ошибку в списках (C++):

Нужно найти ошибку - C++
Вот код программы: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; int main(void) { ...

Нужно найти ошибку - C++
Мой код #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double ugol(int a, int n, double s) { s = (n*a*a) / (4 *...

Нужно найти ошибку - C++
#include &lt;iostream.h&gt; #include &lt;math.h&gt; double a,b,c,d,v; a=1000; b=1; v=a+b; ...

Нужно найти ошибку - C++
Помогите найти ошибку, не запускается( Тексты программ переписывайте в сообщение!

нужно найти ошибку. - C++
#include &lt;stdio.h&gt; void quickSortR(int* a, long N) { long i = 0, j = N; int temp, p; p = a;

Нужно найти ошибку - C++
10 строка: #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; const double PI=22/7; void main () { double r,s,l; ...

10
Людвиг Бодмер
350 / 349 / 135
Регистрация: 29.03.2013
Сообщений: 860
Завершенные тесты: 4
11.08.2016, 10:56 #2
Хадукен, а где реализация этих функций (Ins_midl, Ins_end)?
1
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
11.08.2016, 11:00  [ТС] #3
Людвиг Бодмер, в main я их не использовал, потому что решил проверить работоспособность Ins_begin.
(В единственном вызове функции Ins так же используется Ins_begin)
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.08.2016, 11:27 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хадукен, Вы их использовали в коде, поэтому должны определить их.
1
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
11.08.2016, 11:34  [ТС] #5
Toshkarik, спасибо!
(Я считал, что если не используешь функцию, то достаточно прототипа)

Добавлено через 1 минуту
Не подскажете, почему функция Ins_begin не создает список?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.08.2016, 11:37 #6
Хадукен, так Вы её как раз используете в функции Ins. Компилятор не знает, какие точно значения будут переданы в функцию Ins, поэтому не может просто так взять и проигнорировать вызовы Ins_midl и Ins_end

Добавлено через 2 минуты
Цитата Сообщение от Хадукен Посмотреть сообщение
Не подскажете, почему функция Ins_begin не создает список?
Создает, но Вы передаете в функцию копию указателя, которая теряется по выходу из нее.
1
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
11.08.2016, 11:39  [ТС] #7
В списке я работаю с указателями, а что бы поменять значение указателя нужно использовать указатель на указатель. Верно?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.08.2016, 11:41 #8
Хадукен, именно так, но можно просто возвращать указатель.
1
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
11.08.2016, 11:42  [ТС] #9
То есть вместо void использовать pt* ?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.08.2016, 11:45 #10
Хадукен, да. Что то вроде такого:
C++
1
begin = Ins( begin, end, a );
1
Хадукен
0 / 0 / 2
Регистрация: 01.08.2016
Сообщений: 71
11.08.2016, 12:27  [ТС] #11
Toshkarik, спасибо огромное! Все заработало!

Добавлено через 30 минут
Может кому-то поможет, вот доработанный код:
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
#include <iostream>
#include <conio.h>
 
using std::cout;
using std::cin;
using std::endl;
 
//структуры
struct Abc
{
    int key;
};
struct pt
{
    Abc a;
    pt *next;
};
 
//функции
void Print(pt *begin)
{
    pt *print=begin;
    while(print!=NULL)
    {
        cout<<print->a.key<<"->";
        print=print->next;
    }
    cout<<"NULL"<<endl;
}
pt* Ins_begin(pt *begin,Abc el)
{
    pt *new_begin;
    new_begin=new pt;
    new_begin->next=begin;
    new_begin->a=el;
    begin=new_begin;
    return begin;
}
pt* Ins_end(pt *end,Abc el)
{
    end->next=new pt;
    end=end->next;
    end->a=el;
    end->next=NULL;
    return end;
}
void Ins_midl(pt *begin,Abc el)
{
    pt *u,*t,*midl;
    midl=new pt;
    midl->a=el;
    u=begin;
    t=begin->next;
    while (el.key>t->a.key) {u=t; t=t->next;}
    u->next=midl;
    midl->next=t;
}
pt* Input(pt *begin,pt *end)
{
    Abc el;
    int n;
    cout<<"Сколько элементов в списке?"<<endl;
    cin>>n;
    cout<<"Введите "<<n<<" элементов списка:"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>el.key;
        if (begin==NULL){begin=Ins_begin(begin,el); end=begin;}
        else if (el.key<=begin->a.key) begin=Ins_begin(begin,el);
        else if (el.key>=end->a.key) end=Ins_end(end,el);
        else Ins_midl(begin,el);
    }
    return begin;
}
int main()
{
    setlocale(LC_ALL,"Russian");
    pt *begin=NULL,*end=begin;
    begin=Input(begin,end);
    Print(begin);
    _getch();
    return 0;
}
Добавлено через 8 минут
Ой, Input не возвращала новый адрес end, исправил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pt* Input(pt *begin,pt **end)
{
    Abc el;
    int n;
    cout<<"Сколько элементов в списке?"<<endl;
    cin>>n;
    cout<<"Введите "<<n<<" элементов списка:"<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>el.key;
        if (begin==NULL){begin=Ins_begin(begin,el); (*end)=begin;}
        else if (el.key<=begin->a.key) begin=Ins_begin(begin,el);
        else if (el.key>=(*end)->a.key) (*end)=Ins_end((*end),el);
        else Ins_midl(begin,el);
    }
    return begin;
}
При вызове Input вместо end, нужно использовать его адрес в памяти.(&end)
0
11.08.2016, 12:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 12:27
Привет! Вот еще темы с ответами:

Нужно найти ошибку!! - C++
Код программы прилагается помогите найти ошибку , Заранее очень благодарен!!

Нужно найти и исправить ошибку - C++
Есть программа, работает, но все время выдает одни и те же числа. Помогите найти где там ошибка /* Записать каждый второй элемент...

Нужно найти ошибку в коде - C++
Суть задачи в том, что тебе дают размер массива , в котором нужно найти единицу и все нули вокруг нее превратить в двойки, найти двойки и...

Нужно найти ошибку и исправить ее - C++
Нужно сделать: Создать объект типа стек. Перегрузить оператор,!=, ==, &gt;, &lt;, &gt;=, &lt;=,++,--,+ Ввод, вывод в поток. Уже сделано: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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