单链表(多个)

//2022.9.28 建立多个正序单链表并合并 
#include<stdio.h>
#include<stdlib.h>

typedef struct node {
int data;
struct node* next;
}node;



node* initlist() {
node* l, * t;
l = (node*)malloc(sizeof(node));
if (!l)
exit(0);
l->next = NULL;
t = l;
return l;//返回头指针
}
//创建链表
void creat(node* l, int n) {
node* p, * t;
t = l;
int i;
for (i = 1; i <= n; i++)
{
p = (node*)malloc(sizeof(node));
if (!p)
exit(0);
scanf("%d", &p->data);
p->next = NULL;
t->next = p;
t = p;
}
}
//历遍(输出)
void output(node* l) {
node* p;
p = l->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//合并链表
node* merge(node* l1, node* l2) {
node* p, * i, * j, * t;
i = l1->next;
j = l2->next;
//比较两个链表第一个节点的大小
if(i->data<=j->data){
t = l1;
}
else {
t = l2;
}
//将头节点给临时变量p
p = t;
while (i && j) {
if (i->data < j->data)//判断那一个作为第一个节点
{
p->next = i;
p = i;
i = i->next;
}
else {
p->next = j;
p = j;
j = j->next;
}
//如果其中一个链表较长将剩余的加在后面
if (i) {
p->next = i;
}
else if(j)
{
p->next = j;
}
}
return t;
}
void main() {
int n, m;
node* l1, * l2, * l;
l1 = initlist();
l2 = initlist();
printf("请输入l1链表的长度:");
scanf("%d", &n);
printf("请输入了l1中的元素:");
creat(l1, n);
printf("输出l1的结果:\n");
output(l1);
printf("请输入l2链表的长度:");
scanf("%d", &m);
printf("请输入了l2中的元素:");
creat(l2, m);
printf("输出l2的结果:\n");
output(l2);
l = merge(l1, l2);
printf("输出合并链表l的值:\n");
output(l);
}