C语言求教merge(struct node *p,struct node *q)哪里出错了?

#include "stdio.h"
#include "stdlib.h"
struct node
{
int data;
struct node next;
};
struct node *creat(int *a)
{
struct node*h,*p,*q;
int i;
h=p=(struct node
)malloc(sizeof(struct node));
for(i=0;i {
q=(struct node*)malloc(sizeof(struct node));
q->data=a[i];
p->next=q;
p=q;
}
p->next=0;
return h;
}
void output(struct node*h)
{
struct node*p;
p=h->next;
if(p==NULL)
printf("The list is NULL!\n");
else
{
printf("\nHead");
while(p->next!=0)
{
printf("->%d",p->data);
p=p->next;
}
printf("->End\n");
}
}
void merge(struct node *p,struct node *q)
{
struct node *s,*r;
r=p;
while(r->next!=NULL)
{
if(r->next->datanext->data)
{
s=r->next;
r=s->next;
s->next=r;
r=s;
r=r->next;
}
else if(r->next->data>q->next->data)
{
s=q->next;
q->next=s->next;
s->next=q;
r->next=s;
r=r->next;
}
else
{
r=r->next;
s=q->next;
q=q->next;
free(s);
}
}
if(q->next!=NULL)
{
r->next=q->next;
free(q);
}
}

void main()
{
struct node *p,*q;
int a[10]={1,2,3,4,5,7,9,11,13,15};
int b[10]={1,2,3,4,5,8,10,12,14,16};
p=creat(a);
printf("The first list before merging:\n");
output(p);
q=creat(b);
printf("The second list before merging:\n");
output(q);
merge(p,q);
printf("The list after merging:\n");
output(p);

}
===C程序题:假设链表p和链表q中的结点值都是整数,且按结点值递增次序链接起来的带表头结点的单链表,在每个链表中,每个结点的值各不相同,但链表p和链表q可能有值相同的结点。下面函数将链表q合并到链表p中,使得合并后的链表仍为按结点值递增有序的单链表,且链表中每个结点的值各不相同。====求教void merge(struct node *p,struct node *q)哪里出错了,导致以上程序运行结果不对呢?

else if(r->next->data>q->next->data)
{
s=q->next;
q->next=s->next;
s->next=q;
r->next=s;
r=r->next;
}
在r=r->next的时候出现错误。

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

struct node* create(int* a, int ilength)
{
    struct node* h,*p, *q;
    int i = 0;
    h = p = (struct node*)malloc(sizeof(struct node));
    for (int i = 0; i < ilength; i++)
    {
        q = (struct node*)malloc(sizeof(struct node));
        q->data = a[i];
        p->next = q;
        p = q;
    }
    p->next = 0;
    return h;
}

void output(struct node* h)
{
    struct node*p = h->next;
    if (p == NULL)
    {
        return;
    }

    printf("\nHead");
    while (p != NULL)
    {
        printf("->%d", p->data);
        p = p->next;
    }

    printf("->End\n");
}

void merge(struct node *p, struct node *qM)
{
    struct node *s, *r;
    r = p->next;
    struct node* q = qM->next;

    while (r != NULL && q != NULL)
    {
        if (r->data < q->data)
        {
            if (r->next != NULL && r->next->data > q->data)
            {
                s = r->next;
                r->next = q;
                r = q;
                q = q->next;
                r->next = s;
            }
            else
            {
                r = r->next;
            }
        }
        else if (r->data == q->data)
        {
            s = q;
            q = q->next;
            free(s);
        }
        else if (r->data > q->data)
        {
            s = q;
            q = q->next;
            s->next = r;
            if (p->next == r)
            {
                p->next = s;
            }
            r = s;
        }
    }

    if (q != NULL)
    {
        r = p;
        while (r->next != NULL)
        {
            r = r->next;
        }
        r->next = q;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    struct node *p,*q;
    int a[10]={1,20,30,40,50,70,90,110,130,150};
    int b[10]={1,2,3,4,5,8,10,12,14,16};
    p=create(a, 10);
    printf("The first list before merging:\n");
    output(p);
    q=create(b, 10);
    printf("The second list before merging:\n");
    output(q);
    merge(p,q);
    printf("The list after merging:\n");
    output(p);
    return 0;
} 

void output(struct node*h)
{
struct node*p;
p=h->next;
if(p==NULL)
printf("The list is NULL!\n");
else
{
printf("\nHead");
while(p!=0)
{
printf("->%d",p->data);
p=p->next;
}
printf("->End\n");
}
}
void merge(struct node *p,struct node *q)
{

    struct node *m=p->next,*n=q->next,*s,*t;
    while(NULL!=n)
    {
            if(m->data==n->data)
            {
                    s=n;
                    if(n==NULL)
                            return;

                    n=n->next;
                    free(s);
            }else if(m->data<n->data)
            {
                    s=m;
                    m=m->next;
                    if(m==NULL)
                    {
                            s->next=n;

                            s->next->next=NULL;
                            return;
                    }
            }else
            {
                    if(n->next==NULL)
                            return;
                    t=n->next;

                    n->next=m;
                    s->next=n;
                    n=t;
            }
    }

因为你的next已经空了吧?断点看下,如果是空的next的话就会出错了