将带有头结点的2个线性单链表交替有规则的合并成为一个链表,今天做这个的时候,又犯了以前一个愚蠢的错误,对于有些代码,为了方便我就直接复制了,编译器查出来有错,我一直看不出来错误在哪里,++,那一块我直接就忽略了 ,代码不敢随便复制,我画个图我认为直接可以看出算法的思想,不想在BB了,其他的事都还没有做呢,
pa 是遍历La的指针,pb是遍历Lb的指针,Lc开始就指向La链,意思对La链进行操作,用r指针永远指向当前的最后一个,然后不停向后连接,对于这段代码可以在while的循环之后不用在考虑把剩下的(La,Lb的长度)连接在Lc后面,前提要是La要比Lb的链短,这也是很容易实现的
代码区
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}linklist;
linklist *initlist() //单链表的创建,
{
int d;
linklist *p,*head,*q;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
p=head;
scanf("%d",&d);
while(d) // 尾插法
{
q=(linklist*)malloc(sizeof(linklist));
q->data=d;
p->next=q;
p=q;
p->next=NULL;
scanf("%d",&d);
}
return head;
}
linklist *combine(linklist *La,linklist *Lb) //实现ab的交接插入
{
linklist *Lc;
linklist *pa=La,*pb=Lb,*r;
Lc=La;
pa=pa->next;
pb=pb->next;
r=Lc;
while(pa&&pb)
{
r->next=pa;
r=pa;
pa=pa->next;
r->next=pb;
r=pb;
pb=pb->next;
}
free(Lb);
return Lc;
}
print(linklist *head) // 输出
{
linklist *p;
p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main() // 主函数
{
linklist *La,*Lb,*Lc;
printf("创建La :");
La=initlist();
printf("创建Lb :");
Lb=initlist();
Lc=combine(La,Lb);
print(Lc);
return 0;
}
输出的结果(以0结束链表的创建)