C语言代码:对于两列顺序递增数字数组,用链表形式实现合并递增输出
说明:两个不定长的递增数组,要求用链表形式实现合并递增输出
例如:
int a[]={3,5,7};
int b[]={2,4,6,8,9,10,13,16};
输出:2 3 4 5 6 7 8 9 10 13 16
代码:
#include <stdio.h>
#include <stdlib.h>
#define true 1;
#define false 0;
typedef int bool;
int main(){
int a[]={3,5,7};
int b[]={2,4,6,8,9,10,13,16};
struct list{
int var;
struct list *next;
};
struct list *head1,*head2,*ptr,*ptr2,*p1,*p2;
head1=malloc(sizeof(struct list));
head1->var=a[0];
head1->next=NULL;
p1=head1;
for(int i=1;i<sizeof(a)/sizeof(int);i++){
head1->next=malloc(sizeof(struct list));
head1=head1->next;
head1->var=a[i];
head1->next=NULL;
}
head1=p1;
while(p1){
printf("%d ",p1->var);
p1=p1->next;
}
printf("\n");
head2=malloc(sizeof(struct list));
head2->var=b[0];
head2->next=NULL;
p2=head2;
for(int i=1;i<sizeof(b)/sizeof(int);i++){
head2->next=malloc(sizeof(struct list));
head2=head2->next;
head2->var=b[i];
head2->next=NULL;
}
head2=p2;
while(p2){
printf("%d ",p2->var);
p2=p2->next;
}
printf("\n");
if(head1->var > head2->var){
ptr = head1;
head1 = head2;
head2 = ptr;
}
p1=head1; p2=head2;
while(head1){
while(head2){
ptr=head1->next; //记录插入前head1->next的位置
if(head1->next == NULL){ //head1的尾结点,直接拼接head2剩下节点到head1,退出循环head2
head1->next=head2;
head1=head1->next;
goto end;
}
if(head1->var<=head2->var && head2->var<head1->next->var ){ //判断head2节点比head1当前节点大,比head1下节点小,插入
ptr2=head2->next;
head1->next=head2;
head1=head1->next;
head1->next=ptr; //插入后指定head1->next的位置
head2=ptr2;
}
else{ //不符合head2插入head1,head1节点向后位移一位
head1=head1->next;
}
}
head1=head1->next;
}
end:
while(p1){
printf("%d ",p1->var);
p1=p1->next;
}
printf("\n");
return 0;
}