编译器: visual studio 2022
1.源码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//建立有序表结构体
//初始化 同时完成 尾插法建立链表 和 开辟空间
// 打印表
//合并
//建立有序表结构体
typedef struct
{
int data;
struct Sqlist* next;
}Sqlist, * Linklist;
//尾插法建立链表
int Setuplist(Linklist l)
{
Linklist s = l; //s 不初始化有没有问题?
printf("请输入结点个数: ");
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
l = (Sqlist*)malloc(sizeof(Sqlist));
printf("请输入第 %d 个数据域: ", i);
//int m = 0;
//l->data = scanf("%d",&m); 这个为什么不行?
scanf("%d", &l->data);
l->next = NULL;
s->next = l;
s = l;
}
return n;
}
//打印链表
void Print(Linklist l, int ab)
{
Linklist L = l->next; //此时L是首元结点
while (L)
{
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
// 合并
void Unit(Linklist l1, Linklist l2, Linklist l3)
{
//遍历,对比l1,和l2 中元素大小(要用指针吗?)
//l3先指向小的,后指向大的
l1 = l1->next; //l1 此时是首元节点,
l2 = l2->next; //l2 此时是首元节点
while (l1 && l2)
{
if (l1->data <= l2->data) // l1->next 是首元结点还是第二个结点? 我认为是首元结点
{
l3->next = l1;
l3 = l3->next; // 此时l3是首元结点
l1 = l1->next; // l1 此时是第二节点
}
else
{
l3->next = l2;
l3 = l3->next;
l2 = l2->next;
}
}
if (l1)
{
l3->next = l1;
l3 = l3->next;
l1 = l1->next;
}
if (l2)
{
l3->next = l2;
l3 = l3->next;
l2 = l2->next;
}
}
//主函数
void main()
{
Linklist l1 = NULL;
Linklist l2 = NULL;
//尾插法建立链表
l1 = (Sqlist*)malloc(sizeof(Sqlist)); //先开辟头结点,在创建一个中间人,即尾结点
l2 = (Sqlist*)malloc(sizeof(Sqlist));
l1->next = NULL;
l2->next = NULL;
printf("链表l1 的建立: \n");
int a = Setuplist(l1); //a 是表l1的结点个数
printf("链表l2的建立: \n");
int b = Setuplist(l2); //b 是表l2的结点个数
//打印表
printf("打印链表l1: \n");
Print(l1, a);
printf("\n打印链表l2: \n");
Print(l2, b);
//合并
Linklist l3 = l1; // l3就是l1头结点, l3->next 才是首元结点
Unit(l1, l2, l3); //l3在自定义函数中建立看看
printf("\n打印链表l3: \n");
int c = a + b; //c 是链表l3 结点个数
Print(l3, c); // 132行不懂
}
2.效果图