Многочлен с целыми коэффициентами представить в виде списка - 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");
}

Код к задаче: «Многочлен с целыми коэффициентами представить в виде списка - C (СИ)»

textual
p = (list)malloc(sizeof(*p));

13   голосов, оценка 4.077 из 5


СОХРАНИТЬ ССЫЛКУ