2014 dxdy logo

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

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




 
 Односвязный список. Удаление
Сообщение17.06.2018, 14:04 
Здравствуйте. Пытаюсь разораться с односвязными списками, но не понимаю, как удалять элементы в моем задание. Написал функцию 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 
 i  Тема перемещена из форума «Программирование» в форум «Карантин»
Приведите пример того, что "не работает", а именно:
- укажите данные, которые требуется ввести;
- укажите результат, который предполагается получить.

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

 
 
 
 Posted automatically
Сообщение17.06.2018, 18:18 
 i  Тема перемещена из форума «Карантин» в форум «Программирование»


-- 17.06.2018, 19:05 --

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

 
 
 
 Re: Односвязный список. Удаление
Сообщение17.06.2018, 19:13 
Первое замечание (маловажное): ваша функция пытается удалить чётные степени. А в примере показано удаление нечётных.
Второе замечание (важное): функция 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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group