| 二、实验内容 设La和Lb是两个具有相同数据对象的线性表,都按元素非递减有序的形式存放。要将两个表合并成一个新的非递减有序的线性表Lc。 如:La ={3,5,8,11} Lb ={2,6,8,9,11,15,20} Lc ={2,3,5,6,8,8,9,11,11,15,20} 程序代码:(不允许粘图,重点语句加上注释)
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef struct LNode
{
int data;//顺序表的基址
struct LNode* next;
}LNode, * LinkList;
//初始化线性表
Status InitList(LinkList& L)
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(0);
L->next = NULL;
return 1;
}
Status CreateList(LinkList L, int n) //头插法
{
LinkList p, q;
p = L;//第一步,取到头结点,两个指针指向同一内存,改变p指向的内存,L指向的内存不变,L仍为头结点
printf("请输入%d个数:\n", n);
for (int i = 1; i <= n; i++)
{
q = (LinkList)malloc(sizeof(LNode));
if (!p)
{
printf("p的初始化出现问题!\n");
return 0;
}
scanf("%d", &q->data);
q->next = p->next;//第二步链接两个结点
p->next = q;//第二步链接两个结点
p = q;//关键的一步,更换位置,进行下次循环
}
return 1;
}
//输出线性表
Status GetLinkList(LinkList L) //顺序输出这个链表
{
if (!L->next)
{
printf("链表没有节点,不能输出!\n");
return 0;
}
LinkList p;
p = L->next;
while (p)
{
printf("%d,", p->data);
p = p->next;
}
return 1;
}
//合并线性表
Status MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc) {
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;//用La头结点作为Lc的头结点
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa; pc = pa; pa = pa->next;
}
else { pc->next = pb; pc = pb; pb = pb->next; }
}
pc->next = pa ? pa : pb;//插入剩余段
free(Lb);//释放Lb的头结点
return 1;
}
int main()
{
LinkList L1, L2, L3;
int n, m;
InitList(L1);
InitList(L2);
printf("请输入La中数据的个数:");
scanf("%d", &m);
CreateList(L1, m);
printf("请输入Lb中数据的个数:");
scanf("%d", &n);
CreateList(L2, n);
GetLinkList(L1);
printf("\n");
GetLinkList(L2);
printf("\n");
printf("合并后的Lc为:\n");
MergeList_L(L1, L2, L3);
GetLinkList(L3);
return 0;
}
程序测试及运行结果: |