Многочлен с целыми коэффициентами представить в виде списка - C (СИ)
Формулировка задачи:
Доброго времени суток!
"Проходим" односвязные списки на Си, и вот мне попалась задачка такая: Многочлен с целыми коэффициентами можно представить в виде списка. Задать многочлен от Х односвязным списком. Элемент списка содержит показатель степени Х и ненулевой коэффициент при этой степени (в списке не должно быть элементов с одинаковыми степенями). Составить программу, включающую помимо указанных в задании функций, функции создания и вывода списка на экран. Список или списки должны отображаться на экране до обработки и после.
и вот само задание: Написать функцию, которая удаляет из многочлена все слагаемые со степенями меньше заданной. Например,
L= -5x2+x3+2x-3x5 и k=3, тогда
L=x3-3x5
вот мой код, но что-то в нем не так. удаляет все, кроме последнего элемента. иногда правильно работает.
Буду очень благодарна за помощь, так как сама не разберусь, и вообще плохо понимаю эту тему.
[COLOR="SeaGreen"]/**************************************************************
* Задание:
* Многочлен с целыми коэффициентами можно представить в виде
* списка. Задать многочлен от Х односвязным списком. Элемент
* списка содержит показатель степени Х и ненулевой коэффициент
* при этой степени (в списке не должно быть элементов с
* одинаковыми степенями). Составить программу, включающую
* помимо указанных в задании функций, функции создания и вывода
* списка на экран. Список или списки должны отображаться на
* экране до обработки и после.
*
* Написать функцию, которая удаляет из многочлена
* все слагаемые со степенями меньше заданной
**************************************************************/[/COLOR]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define DEBUG 0
#define _CRT_SECURE_NO_WARNINGS
struct node {
int koeff;
int power;
struct node *next;
};
typedef struct node* list;
void createList(list *phead, char *name);
void enterListElems(list *phead);
int addToHead(list *phead, int koeff, int power);
int checkIfExist(list *phead, int power);
void printList(list *phead, char *name);
void del_node(list p, int delpower);
int Delete(list *phead, int delpower);
void Pop(list phead);
int main(void)
{
list L1;
int k;
setlocale(LC_ALL, "RUSSIAN");
createList(&L1, "L1");
enterListElems(&L1);
printf("\n------\n");
printList(&L1, "L1");
printf("------\n\n");
printf("Введите степень, значения меньше которой следует удалить:");
scanf("%d", &k);
Delete(&L1, k);
printList(&L1, "L1");
system("pause");
return 0;
}
[COLOR="SeaGreen"]/**********************************************************
* void createList(list *phead)
* создаёт список
*
* Вход:
* phead - указатель на начало списка
* name - имя списка
*
* Выход:
* нет
*
* Возвращаемое значение:
* нет
**********************************************************/[/COLOR]
void createList(list *phead, char *name)
{
*phead = NULL;
printf("\nСоздание %s\n", name);
}
[COLOR="SeaGreen"]/**********************************************************
* int checkIfExist(list *phead, int power)
* проверяет наличие в списке степени power
*
* Вход:
* phead - указатель на начало списка
* power - искомая степень
*
* Выход:
* нет
*
* Возвращаемое значение:
* 1 - найдена
* 0 - не найдена
**********************************************************/[/COLOR]
int checkIfExist(list *phead, int power, int koeff)
{
list p = *phead;
while (p != NULL)
{
if (p->power == power)
{
p->koeff += koeff;
return 1;
}
p = p->next;
}
return 0;
}
[COLOR="SeaGreen"]/**********************************************************
* void addToHead(list *phead, int koeff, int power)
* добавляет элемент в начало списка
*
* Вход:
* phead - указатель на начало списка
* koeff - коэффициент
* power - степень X
*
* Выход:
* элемент добавлен в начало списка
*
* Возвращаемое значение:
* 1 - добавлено
* 0 - не добавлено
**********************************************************/[/COLOR]
int addToHead(list *phead, int koeff, int power)
{
list p;
if (checkIfExist(phead, power, koeff))
{
printf("Такая степень уже есть %d\n", power);
return 0;
}
p = malloc(sizeof(*p));
p->koeff = koeff;
p->power = power;
p->next = *phead;
*phead = p;
printf("Добавлено: %dx^%d\n", p->koeff, p->power);
return 1;
}
[COLOR="rgb(46, 139, 87)"]/**********************************************************
* void enterListElems(list *phead)
* осуществляет ввод элементов списка
*
* Вход:
* phead - указатель на начало списка
*
* Выход:
* список, заполненный элементами
*
* Возвращаемое значение:
* нет
**********************************************************/[/COLOR]
void enterListElems(list *phead)
{
int i_koeff = 1, i_power = 1;
while (i_koeff != 0)
{
printf("\nВвод\n");
printf("Kоэффициент: ");
scanf("%d", &i_koeff);
if (i_koeff == 0)
return;
printf("Cтепень: ");
scanf("%d", &i_power);
addToHead(phead, i_koeff, i_power);
}
}
[COLOR="rgb(46, 139, 87)"]/**********************************************************
* void del_node(list p, int delpower)
* осуществляет удаление "узла" между элементами
*
* Вход:
* p - где удаляем связку
* delpower - нужная степень (критерий удаления)
*
* Выход:
* список без некоторых связок
*
* Возвращаемое значение:
* нет
**********************************************************/[/COLOR]
void del_node(list p, int delpower)
{
list a;
a = p->next;
while (p->next != NULL)
{
if (a->power < delpower)
{
a = p->next;
p->next = a->next;
free(a);
}
else
{
p = p->next;
a = p->next;
}
}
}
[COLOR="rgb(46, 139, 87)"]/**********************************************************
* int Delete(list *phead, int delpower)
* осуществляет удаление нужных членов
*
* Вход:
* *phead - указатель на начало списка
* delpower - нужная степень (критерий удаления)
*
* Выход:
* новый список
*
* Возвращаемое значение:
* 0 - произведено удаление
* 1 - пустой список
**********************************************************/[/COLOR]
int Delete(list *phead, int delpower)
{
if (*phead == NULL)
return 1;
list p;
p = *phead;
while ((p != NULL) && (p->power < delpower))
p = p->next;
if (p != NULL)
{
del_node(p, p->power);
*phead = p;
}
else
{
list a;
p = *phead;
while (p->next != NULL)
{
a = p;
p = p->next;
free(a);
}
*phead = NULL;
}
return 0;
}
[COLOR="rgb(46, 139, 87)"]/**********************************************************
* void printList(list *phead)
* печатает список на экран
*
* Вход:
* phead - указатель на начало списка
*
* Выход:
* нет
*
* Возвращаемое значение:
* нет
**********************************************************/[/COLOR]
void printList(list *phead, char *name)
{
list p;
printf("\nList %s:\n", name);
for (p = *phead; p != NULL; p = p->next)
printf("%dx^%d\n", p->koeff, p->power);
printf("\n");
}Решение задачи: «Многочлен с целыми коэффициентами представить в виде списка»
textual
Листинг программы
p = (list)malloc(sizeof(*p));
Объяснение кода листинга программы
p- это переменная типа указатель, которая указывает на начало блока памяти, выделенного с помощью функцииmalloc. В данном случае, блок памяти выделен для списка.list- это структура данных, которая представляет собой список. В данном случае, список будет содержать элементы типаint.sizeof(*p)- это выражение, которое вычисляет размер одного элемента списка. В данном случае, размер одного элемента списка равен размеру указателя.malloc- это функция, которая выделяет память в динамической области памяти. В данном случае, функция выделяет память для списка.