C 将一个单链表拆分为两个单链表-一个包含偶数数据的节点,另一个包含奇数数据的节点

C 将一个单链表拆分为两个单链表-一个包含偶数数据的节点,另一个包含奇数数据的节点,c,data-structures,singly-linked-list,C,Data Structures,Singly Linked List,我尝试对上述问题进行编码,但遇到了分段错误。以下是我编写的代码: #include<stdio.h> #include<stdlib.h> #include<math.h> struct oddeven { int data; struct oddeven *link; }; typedef struct oddeven

我尝试对上述问题进行编码,但遇到了分段错误。以下是我编写的代码:

       #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;
            } 
      }
#包括
#包括
#包括
奇偶结构
{
int数据;
结构奇偶*链接;
};
typedef-struct-m;
int main()
{
intz;
m*head=NULL,*ptr,*电流;
m*x,*y,*q,*head1=NULL,*current1,*head2=NULL,*current2;
而(1)
{
int-ch;
ptr=(m*)malloc(sizeof(m));
printf(“输入数据:”);
scanf(“%d”和&ptr->data);
ptr->link=NULL;
if(head==NULL)
{
水头=ptr;
电流=ptr;
}
其他的
{
当前->链接=ptr;
电流=ptr;
}
printf(“是否要继续?Y=1/N=0”);
scanf(“%d”和“ch”);
如果(ch!=1)
打破
}
x=头部;
while(x!=NULL)
{
z=x->数据;
如果(z%2==0)
{
ptr=(m*)malloc(sizeof(m));
ptr->data=z;
ptr->link=NULL;
if(head1==NULL)
{
head1=ptr;
电流1=ptr;
}
其他的
{
current1->link=ptr;
电流1=ptr;
}
}
其他的
{
ptr=(m*)malloc(sizeof(m));
ptr->data=z;
ptr->link=NULL;
如果(head2=NULL)
{
头2=ptr;
电流2=ptr;
}
其他的
{
current2->link=ptr;
电流2=ptr;
}
}
x=x->link;
}
y=头1;
q=人头2;
while(y!=NULL)
{
printf(“%d\t”,y->data);
y=y->链接;
}
printf(“\n”);
while(q!=NULL)
{
printf(“%d\t”,q->data);
q=q->link;
} 
}
我不知道我哪里出了问题。任何帮助都将不胜感激。
它接受输入,但之后会显示分段错误。将给定的单链表一分为二,我可以分别存储奇数值和偶数值。我尝试了不同的方法,但无法使其工作。

@vladfrommosco提到了您的程序出现故障的一个原因,但它太复杂了。这里有一个更简单的版本。对于单链表,当
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");
}

为什么在拆分列表时需要分配更多节点内存?您只需将每个节点重新链接到“偶数”列表或“奇数”列表即可。@if语句中有一个输入错误。if(head2=NULL)必须是if(head2==NULL)@游戏神请注意,您的方法不会执行原始列表的拆分。这是否回答了您的问题?
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