《数据结构》实验报告(三)之有序表的归并

二、实验内容

        设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;

}

程序测试及运行结果:

分析与讨论:

        求两个集合的并集该算法是求两个集合s1和s2的并集,并将结果存入s引用参数所表示的集合中带回。首先把s1集合复制到s中,然后把s2中的每个元素依次插入到集合s中,当然重复的元素不应该被插入,最后在s中就得到了s1和s2的并集,也就是在s所对应的实际参数集合中得到并集。

通过本次实验,让我对链表的掌握更加熟悉,同时,对线性表有了一定的理解,可以自己构建一个线性表。此外,个人的编程能力得到了一定的提升,对数据结构的体会也不断丰富。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值