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

рекурсивная обработка списков - C++

Восстановить пароль Регистрация
 
SoulTaker
0 / 0 / 0
Регистрация: 12.10.2010
Сообщений: 10
23.12.2010, 23:25     рекурсивная обработка списков #1
написал программу для вычисления первообразной...все работает,но при введении коэфициэнта при x^0 равного нулю выскакивает ошибка...а он не должен включаться в список. если мы делаем равный нулю коэфициэнт при любом другом х то все работает как надо...помогите пожалуйста исправить косяк. вот задание
1.Многочлен P(x)=anxn+an-1xn-1+…+a0 с целыми коэффициентами представьте в виде списка, причем, если ai=0, то соответствующее звено в список не включается. Построить его первообразную

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
// lab0808inf.cpp: определяет точку входа для консольного приложения.
// л.р. (информатика) №8-9 вариант 1 (первообразная)
 
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
 
struct numb
//элемент списка
{
    int a; //коэффициент перед x
    int pow; //степень
    numb* next;
};
 
//добавление элементов список (рекурсивно, один за другим)
void add_numbs(numb*& beg, numb*& end, int stepen, numb* p = NULL, int prim = 0)
//ук-ль на начало списка (только для первого элемента)
//ук-ль на конец списка
//степень (только для исходного списка)
//ук-ль на элемент исходного списка (только для первообразной)
//если первообразная - true
{
    int num, pow_;
 
    //ввод данных
    if (!prim) //для исходного списка
    {
        pow_ = stepen;
        cout << "vvedi a dlya x^" << pow_ << ":\n";
        cin >> num;
    }
    else //для списка с первообразной
    {
        num = (p->a)/((p->pow)+1);
        pow_ = (p->pow)+1;
        p = p->next;
    }
 
    if (num!=0) //если коэффициент не 0
 
    {
        numb* t = new numb;
        if (beg != NULL) //не первый элемент
        {
            t->a = num; 
            t->pow = pow_;
            t->next = NULL;
 
            end->next = t;
            end = t;
        }
        else //первый элемент
        {
            t->a = num;
            t->pow = pow_;
            t->next = NULL;
 
            beg = end = t;
        }
    }
 
    pow_--; //уменьшение степени
    
 
    if (pow_ >= 0 && !(prim && (p == NULL)))
    //степень >= 0, и указатель на след. элемент исходн. списка не 0 (при вычисл. первообразной)
        add_numbs(beg, end, pow_, p, prim);
    return;
}
 
//печатаем все элементы 
void print(numb* p, bool flag = 0) 
{
 
    if (!flag || p->a < 0) //первый вызов, не пишем "+" перед коэфф-том
    
    {
        cout << p->a;
        if (p->pow) //степень не 0
            cout << "x^" << p->pow; 
    }
    else
    {
        cout << "+" << p->a;
        if (p->pow) //степень не 0
            cout << "x^" << p->pow;
    }
    p = p->next;
 
    if (p != NULL)
        print(p,1);
    else
        cout << "\n";
}
 
//вычисление первообразной, создание списка с первообразной
void pervoobraznaja(numb* beg1, numb*& beg2, numb*& end2, int stepen)
{
    add_numbs(beg2,end2,stepen,beg1,1);
}
 
//удаление списка (рекурсивно)
numb* delete_chain(numb* beg)
{
    numb* p = beg;
 
    if (p != NULL)
    {
        numb* k = p->next;
        delete p;
        p = k;
        delete_chain(p);
    }
 
    return p;
}
 
//-------------------------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    int stepen_c, stepen; //степень многочлена (первая переменная не изменяется)
 
    numb *beg, *end, *beg2, *end2; //указатели на нач. и конец исходного и конечного списков
    beg = end = beg2 = end2 = NULL;
 
    cout << "vvedite n:\n";
    cin >> stepen_c;
    stepen = stepen_c;
 
    add_numbs(beg, end, stepen);
 
    stepen = stepen_c;
 
    pervoobraznaja(beg, beg2, end2, stepen); //формирование списка с производной т.к. элементы списка целые округляем результат в меньшую сторону
 
    print(beg); //печать исходного многочлена
    printf("\n");
    print(beg2); //печать полученного многочлена
 
    end = beg = delete_chain(beg); //освобождение памяти
    end2 = beg2 = delete_chain(beg2); //освобождение памяти
    getch();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 23:25     рекурсивная обработка списков
Посмотрите здесь:

C++ Обработка списков
C++ рекурсивная((
«Хранение и обработка данных с использованием линейных списков». C++
Хранение и обработка данных с использованием линейных списков C++
Рекурсивная обработка списков C++
Создание и обработка списков C++
C++ Обработка списков

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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