2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Односвязный список. Удаление
Сообщение17.06.2018, 14:04 


16/12/17
27
Здравствуйте. Пытаюсь разораться с односвязными списками, но не понимаю, как удалять элементы в моем задание. Написал функцию delateNode, но не работает. Что не так?

код: [ скачать ] [ спрятать ]
Используется синтаксис C

#include <stdio.h>
#include <stdlib.h>
//Написать функцию, которая удаляет из многочлена все слагаемые с нечетными степенями.
struct Node {

    unsigned degree;
    int coefficient;

    struct Node* next;
};
typedef struct Node Node;

struct Polynom {
    Node* head;
    Node* tail;
};
typedef struct Polynom Polynom;

//выделяет память под вершину и возвращает указатель на эту вершину

Node* createNode(int coeff, int degree){
        Node* node=(Node*)calloc(1, sizeof(Node)); //выделяем память под корень списка
    node->coefficient=coeff;
    node->degree=degree;
    node->next=NULL;  //последний узел списка вот
    return node;
}

//вызывает createNode, ставит указатель на новую вершину в хвост данного списка
Node* addNode (int degree, int coeff, Node* tail) {
// создаем вершину
    Node* item=createNode(degree, coeff);
// прикрепляем к хвосту вершину
    tail->next=item;
// возвращаем указатель на эту вершину
    return item;
}

void printList(Node* head){
        Node* current = head;
    while(current){
    printf("%dx^%d", current->coefficient, current->degree);
    current = current->next;
    if (current && current->coefficient > 0) printf ("+");
     }
     printf("\n");
}

//принимает последовательность коэф-тов и создает нужный список.
Polynom* createPolynom(){
        Polynom* poly =(Polynom*)calloc(1, sizeof(Polynom));    
    int amount, c , d;
    printf("введите кол-во одночленов:");
    scanf("%d", &amount);
    scanf("%d %d", &c, &d);
    poly->head=createNode(c, d);
    poly->tail = poly->head;
    for(int i=0; i<amount-1;i++){
    scanf("%d %d", &c,&d);
    poly->tail = addNode(c,d, poly->tail);
}
return poly;

}
void deleteNode(Node* head){
        Node* current=head;  //указатель на 1 элемент(корень)
        Node* node1;
        Node* node2=NULL;
               
                node1=current->next; //нода, которая следует за текущей
               
                if(current->degree%2==0){
                       
                        if(current==head) //если это первый элемент
                        head=node1; //то первый элемент становится следующим
                        if(!node1) //если нода последний элмент
                        node1=node2;
                        if(node2)
                        node2->next=node1;
                       
                        free(current);
                       
                        current=node1;
       
       
}
}

int main(){
    Polynom* polynom;
    polynom = createPolynom();
    printList(polynom->head);
    deleteNode(polynom->head);
    printList(polynom->head);
        return 0;
}


 

Например, пользователь вводит с клавиатуры такой многочлен с нужным количеством одночленов (по парам коэффициент и степень):
Используется синтаксис C
 4
 2 1
-5 2
 1 4
-3 5
 

Программа выводит на экран:
Используется синтаксис C
введите кол-во одночленов:4
 2 1
-5 2
 1 4
-3 5
2x-5x^2+x^4-3x^5
2x-5x^2+x^4-3x^5
 

Но должно получиться:
Используется синтаксис C
введите кол-во одночленов:4
 2 1
-5 2
 1 4
-3 5
2x-5x^2+x^4-3x^5
-5x^2+x^4
 

То есть в моем коде пока не работает функция удаления нечетных степеней

 Профиль  
                  
 
 Posted automatically
Сообщение17.06.2018, 14:22 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Программирование» в форум «Карантин»
Приведите пример того, что "не работает", а именно:
- укажите данные, которые требуется ввести;
- укажите результат, который предполагается получить.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение17.06.2018, 18:18 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Программирование»


-- 17.06.2018, 19:05 --

Ну, начнем с того, что что-нибудь интересное в Вашем коде в функции deleteNode происходит с четными степенями. По-видимому, это не совсем то, что предполагалось.

 Профиль  
                  
 
 Re: Односвязный список. Удаление
Сообщение17.06.2018, 19:13 
Заслуженный участник


26/05/14
981
Первое замечание (маловажное): ваша функция пытается удалить чётные степени. А в примере показано удаление нечётных.
Второе замечание (важное): функция deleteNode принимает аргумент head по значению. Когда вы попытаетесь изменить значение head внутри функции, это изменение будет невидимым снаружи. Снаружи переменная polynom->head останется неизменной. А так как вы удалили память на которую она ссылается, то ваша программа некорректна.
Третье замечание (тоже важное): функция deleteNode может удалить не более одного элемента. В вашем примере удаляются несколько одночленов.

Чтобы поправить ситуацию переделайте функцию deleteNode. Я приведу псевдокод, а вы перенесите его на C:
Код:
def deleteNode(head):
    # lets process empty list
    if head is None:
        return None
    # do something with tail of list
    head.next = ???(head.next)
    # do something with head of list
    if this_node_should_be_deleted(head):
        # skip node
        head = head.next
    return head

# how to use the function?
polynom.head = deleteNode(polynom.head)



Это только один из возможных способов сделать дело.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group