奇数值结点链表实现过程中的段错误

这是我代码出现问题的地方(蓝条处):请大家帮忙看看怎么解决问题。不太懂链表。谢谢!

img


以下是题目

img

img

代码


```c
struct ListNode *readlist(){
   struct  ListNode *head=NULL,*q,*p;
    int number;
    while( 1){
        scanf("%d",&number);
        if(number==-1){
            break;
        }
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        q->data=number;
        q->next=NULL;
        if(head!=NULL){
            p->next=q;
        }else{
            head=q;
        }
        p=q;
    }
    //printlist(head);
    return head;
    
}
struct ListNode *getodd( struct ListNode **L ){
   struct ListNode *head=NULL,*head2=NULL,*p=*L,*tail=NULL,*tail2=NULL;
    
    while(p!=NULL){//不能是p->next!=NULL不然最后一个结点会不执行;
        if(p->data%2!=0){
            if(head==NULL){
                head=p;
            }else{
                tail->next=p;
            }
            tail=p;
        }else{
            if(head2==NULL){
                head2=p;
            }else{
                tail2->next=p;
            }
            tail2=p;
        }
        p=p->next;
    }
    tail->next=NULL;
    tail2->next=NULL;
    *L=head2;
    return head;
}

```

修改如下,改动处见注释,供参考:

struct ListNode *readlist(){
    struct  ListNode *head=NULL,*q,*p;
    int number;
    while( 1){
        scanf("%d",&number);
        if(number == -1){
            break;
        }
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        q->data=number;
        q->next=NULL;
        if(head!=NULL){
            p->next=q;
        }else{
            head=q;
        }
        p=q;
    }
    //printlist(head);
    return head;

}
struct ListNode *getodd( struct ListNode **L ){
   struct ListNode *head=NULL,*head2=NULL,*p=*L,*tail=NULL,*tail2=NULL;

    while(p!=NULL){//不能是p->next!=NULL不然最后一个结点会不执行;
        if(p->data%2!=0){
            if(head==NULL){
                head = p;
            }else{
                tail->next=p;
            }
            tail=p;
        }else{
            if(head2==NULL){
                head2 = p;
            }else{
                tail2->next=p;
            }
            tail2=p;
        }
        p=p->next;
        if (tail)  tail->next=NULL;  // 修改
        if (tail2) tail2->next=NULL; // 修改
    }//修改
    *L = head2;
    return head;
}