#include<stdio.h>
//#include
typedef struct node{
int data;
struct node *next;
} linknode,*link;
//linknode mynode;//mynode是一个struct node结构体
//link ptr_node;//ptr_node是一个指向struct node结构体的指针。
//合并
link Union(link la,link lb) /*合并链表*/
{
link rt=NULL,now=NULL,nc=NULL;
while (la&&lb) //la,lb都不为空
{
if (la->data>=lb->data)
{
nc=la;//大的在前先赋值给nc
la=la->next;
}
else {
nc=lb;
lb=lb->next;
}
if (rt) {
now->next=nc;
now=now->next;
}
else rt=now=nc;
}
if (la)
now->next=la;
else
now->next=lb;
return rt;
}
//反转,因为现在la,lb都是递减的,题目要求递增
link reverse(link *lp) /*反转列表*/
{
printf("\nlp\n");
prt(lp);
link f=lp,m=NULL,l=NULL;
while (f) //头->10 变成 头<-10
{
m=f->next; //m为10的下一个指针 即m指向8
f->next=l; //当前结点指向前一个节点
l=f; //指针前移 和上面一句连起来看就是f->next指向f
f=m; //f=f->next f是指向8的指针
}
return lp=l;//返回l
}
//插入
link insert(link la,int c)
{
printf("insert\n");
linknode *lb=NULL;
if (la) //如果la有值
{
la->next=insert(la->next,c);//la->next没有值,执行else,这里就是循环嵌套,知道next为空执行insert函数else条件
lb=la;
prt(la);
printf("link\n");
}
else // la为空
{
lb=malloc(sizeof(linknode));
lb->data=c;
lb->next=NULL;
}
return lb;//返回lb
}
void prt(link p)
{
while (p) {//p有值
printf("%d ",p->data);
p=p->next;
}
}
int main(void)
{
link la=NULL, lb=NULL;//定义指向结构体的两个指针 la lb是指针
int i;
for (i = 10; i>0; i-=2)
{
printf("la\t");
la=insert(la,i);//10,8,6,4,2
printf("lb\t");
lb=insert(lb,i-1);//9,7,5,3,1
}
printf("A:\t");
prt(la);
printf("\nB:\t");
prt(lb);
la=reverse((la=Union(la,lb),la));
printf("\nA+B:\t");
prt(la);
return 0;
}
两个递减单链表按照递增的顺序合并为一个单链表
于 2022-10-11 22:19:17 首次发布