Многочлен с целыми коэффициентами представить в виде списка - 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
- это функция, которая выделяет память в динамической области памяти. В данном случае, функция выделяет память для списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д