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