Разделите один связанный список на 2 связанных списка: один содержит узлы с четными данными, а другой - с нечетными данными - PullRequest
0 голосов
/ 04 марта 2020

Я пытался кодировать вышеупомянутую проблему, но получаю ошибку сегментации. Ниже приведен код, который я написал:

       #include<stdio.h>
       #include<stdlib.h>
       #include<math.h>
       struct oddeven
       {
           int data;
           struct oddeven *link;
       };
       typedef struct oddeven m;
       int main()
       {
            int z;
            m *head=NULL,*ptr,*current;
            m *x,*y,*q,*head1=NULL,*current1,*head2=NULL,*current2; 
            while(1)
            {
                 int ch;
                 ptr=(m*)malloc(sizeof(m));
                 printf("Enter the data: ");
                 scanf("%d",&ptr->data);
                 ptr->link=NULL;
                 if(head==NULL)
                 {
                     head=ptr;
                     current=ptr;
                 }
                 else 
                 {
                     current->link=ptr;
                     current=ptr;
                 }
                 printf("Do you want to continue?Y=1/N=0");
                 scanf("%d",&ch);
                 if(ch!=1)
                     break;
             }
             x=head;
             while(x!=NULL)
             {
                  z=x->data;
                  if(z%2==0)
                  {
                       ptr=(m*)malloc(sizeof(m));
                       ptr->data=z;
                       ptr->link=NULL;
                       if(head1==NULL)
                       {
                            head1=ptr;
                            current1=ptr;
                       }
                       else
                       {
                            current1->link=ptr;
                            current1=ptr;
                       }

                  }
                 else
                 {
                       ptr=(m*)malloc(sizeof(m));
                       ptr->data=z;
                       ptr->link=NULL;
                       if(head2=NULL)
                       {
                            head2=ptr;
                            current2=ptr;
                       }
                       else
                       {
                           current2->link=ptr;
                           current2=ptr;
                       }
                  }
                  x=x->link;    
            }
            y=head1;
            q=head2;
            while (y!=NULL)
            {
                printf("%d\t",y->data); 
                y=y->link;
            }
            printf("\n");
            while (q!=NULL)
            {
                  printf("%d\t",q->data);
                  q=q->link;
            } 
      }

Я не могу понять, где я ошибаюсь. Любая помощь приветствуется. Он принимает входные данные, но после этого говорит ошибку сегментации. Разделите данный один связанный список на два, где я могу хранить нечетные значения и четные значения отдельно. Я пробовал разные методы, но не смог заставить его работать.

1 Ответ

0 голосов
/ 04 марта 2020

@ VladfromMoscow упоминает одну из причин, по которой ваша программа дает сбой, но она все равно слишком сложна. Вот более простая версия. С односвязным списком вам не нужна отдельная операция для первого элемента, когда head == NULL. Вам не нужны новые узлы при разбиении, просто перекомпоновайте.

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

struct oddeven {
   int data;
   struct oddeven *link;
};

typedef struct oddeven m;

int main(void) {
    int num;
    m *head = NULL, *ptr;

    // read the list and end it with any letter or non-digit
    while(scanf("%d", &num) == 1) {
        ptr = malloc(sizeof *ptr);
        if(ptr == NULL) {
            exit(1);
        }
        ptr->data = num;
        ptr->link = head;
        head = ptr;
    }

    // split the list
    m *x, *odd = NULL, *even = NULL, *next;
    x = head;
    while(x != NULL) {
        next = x->link;           // remember what the link was
        if(x->data % 2 == 0) {
            x->link = even;
            even = x;
        }
        else {
            x->link = odd;
            odd = x;
        }
        x = next;    
    }

    // output the odds
    m *y = odd;
    while (y != NULL) {
        printf("%d\t", y->data); 
        y = y->link;
    }
    printf("\n");

    // output the evens
    m *q = even;
    while (q != NULL) {
        printf("%d\t", q->data);
        q = q->link;
    } 
    printf("\n");
}

Сеанс программы:

1 5 8 3 44 9 0 1 4 3 6 77 3 42 q
1       5       3       9       1       3       77      3
8       44      0       4       6       42
...