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);
}
}