C语言填空题求教--链表合并问题,并求大侠给出详细解释

void merge(struct node *p,struct node *q)
{
struct node *s,*r;
r=p;
while()//填空1
{
if(r->next->datanext->data)

     () //填空2


    else if(r->next->data>q->next->data)
    {
        s=q->next;
       ()=s->next;//填空3
        s->next=();//填空4
        ()=s;//填空5
        ();//填空6
    }
    else
    {
        r=r->next;
        s=q->next;
        ();//填空7
        free(s);
    }
}
if()//填空8
{
    r->next=q->next;
    free(q);
}

}

C语言填空题求教===假设链表p和链表q中的结点值都是整数,且按结点值递增次序链接起来的带表头结点的单链表,在每个链表中,每个结点的值各不相同,但链表p和链表q可能有值相同的结点。下面函数将链表q合并到链表p中,使得合并后的链表仍为按结点值递增有序的单链表,且链表中每个结点的值各不相同。

你的源码里第一个if处有错误哦~

void merge(struct node *p,struct node *q)   //合并两个单链表,使之有序递增
{
struct node *s,*r;
r=p;                                                              //使指针r指向链表p的头结点
while(r->next != NULL  ||  q->next != NULL)  {                            // 当两张链表都没遍历结束时
if(r->next->data < q->next->data)    //r中结点数据小于q中结点数据,r继续向后遍历
r = r->next;

    else if(r->next->data > q->next->data)  {    //当q结点数据小于r结点数据,应当插入,此操作为链表插入,操作完成后指针后移继续遍历
        s = q->next;
        q->next = s->next;                                            //填空3
        s->next = r->next ;                                           //填空4
        r->next = s;                                                       //填空5
        r = r->next;                                                       //填空6
    }
    else  {
        r=r->next;
        s=q->next;
        q->next = s->next;                                          //因为数据重复,所以可将s所占用的空间释放(删除链表节点)
        free(s);
    }
}
if(r->next == NULL)                                                //链表r已遍历结束,直接将链表q的数据全部挪过来(指针相接)并释放q的占用空间
{
    r->next=q->next;
    free(q);
}
}