Функция разделяет четные и нечетные числа, используя связанный список - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь, получить номер от пользователя и создать 2 связанных списка, один с только четными числами, другой с нечетными числами, я должен вернуть количество вставленных общих чисел, и передать по ссылке связанные списки. моя главная проблема с возвратом двух новых связанных списков, вот что я сделал до сих пор. Я получаю ошибку Ошибка C2440 «функция»: невозможно преобразовать из «узла **» в «узел».

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct node{
        int data;
        struct node *next;
    }node;

    struct node* head;
    int get_values(node,node);

    void main() {
        node *even_node,*odd_node;
        get_values(&even_node,&odd_node);

    }
    int get_values(node *even, node *odd) {
        int value, counter_total = 0;
        node  *curr_even;
        node  *curr_odd;
        head = NULL;
        printf("enter value:");
        scanf_s("%d", &value);
        if (value == -1) {
            return NULL;
        }
        if (value % 2 == 0) {
            even = (node*)malloc(sizeof(node));
            curr_even = even;
            even->data = value;
            counter_total++;
        }
        else {
            odd = (node*)malloc(sizeof(node));
            curr_odd = odd;
            odd->data = value;
            counter_total++;
        }
        //2nd and on insertion.
        while (value != -1) {
            printf("enter a value positive value");
            scanf_s("%d", &value);
            if (value == -1) {
                curr_even->next = NULL;
                curr_odd->next = NULL;
                break;
            }

            else if (value % 2 == 0) {
                curr_even->next = (node *)malloc(sizeof(node));
                curr_even = curr_even->next;
                curr_even->data = value;//current value
                counter_total++;
            }
            else {
                curr_odd->next = (node*)malloc(sizeof(node));
                curr_odd = curr_odd->next;
                curr_odd->data = value; //current value
                counter_total++;
            }

            return counter_total;
        }
    }

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

С вашим кодом не так много вещей.

  1. Определение функции для getvalues должно иметь двойной указатель.
  2. В функции вы malloc используете параметры функции. Пока вам нужно malloc локальную переменную и добавить ее в список.
  3. Вы добавляете ненужное дублирование кода, когда достаточно одного цикла do while.

См. Фиксированный код ниже

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node *next;
}node;

struct node* head;
int get_values(node **,node **);

void main() {
    node *even_node= NULL,*odd_node= NULL;
    get_values(&even_node,&odd_node);

}
int get_values(node **even, node **odd) {
    int value, counter_total = 0;
    node  *curr_even;
    node  *curr_odd;
node  *new_node;

do
{
  printf("enter value:");
  scanf("%d", &value);
  if (value == -1) {
      return counter_total;
  }
  if (value % 2 == 0) 
  {
      new_node = (node*)malloc(sizeof(node));
      new_node -> data = value;
      new_node -> next = NULL;
      if (*even == NULL)
      {
        *even = new_node;
        curr_even = *even;        
      }
      else
      {
         curr_even ->next = new_node;
         curr_even = curr_even -> next;
      }
      counter_total++;
  }
  else 
  {
      new_node = (node*)malloc(sizeof(node));
      new_node -> data = value;
      new_node -> next = NULL;

      if (*even == NULL)
      {
        *even = new_node;
        curr_even = *even;        
      }
      else
      {
        curr_even ->next = new_node;
        curr_even = curr_even -> next;
      }
      counter_total++;
  }
}while (1);
}
0 голосов
/ 04 апреля 2019

Если вы хотите пройти по ссылке, вы можете сделать это, как показано ниже.

int get_values(node **even, node **odd) {
    int value, counter_total = 0;

    printf("enter value:");
    scanf_s("%d", &value);

    while (value != -1) {
        if (value % 2 == 0) {
            while(*even != NULL) even= &(*even)->next; //Move the pointer till last node. 

            *even = (node *)malloc(sizeof(node));
            (*even)->data = value;//current value
            (*even)->next = NULL;
            counter_total++;
        }
        else {
            while(*odd != NULL) odd= &(*odd)->next;
            *odd = (node *)malloc(sizeof(node));
            (*odd)->data = value;//current value
            (*odd)->next = NULL;
            counter_total++;
        }
        printf("enter a value positive value");
        scanf_s("%d", &value);
    }

    return counter_total;
}
...