两个单链表的合并及求相同集合

2018-06-10  本文已影响0人  乔落_fe6f

两个单链表的合并及求相同集合

1.定义

2.初始化

3.查找

4.插入

5.删除

5.排序

   Status Bubble_sort(SingleList L)//冒泡排序法
   {
          if (!L.n)//判断单链表是否为空
               {
                    return ERROR;
                }
          Node *p;
          for (int i = 0; i < L.n-1; i++)
         {
              p = L.first;
                 for (int j=0;j<L.n-1;j++)
                      {
                          int temp;
                           if (p->element > p->link->element)
                                 {
                                   temp = p->element;
                                   p->element = p->link->element;
                                   p->link->element = temp;
                                }
                            p = p->link;
                          }
           }
          return OK;
      }

6.获取相同集合

    Status Get_Interserction(SingleList L, SingleList H,int *same)//获取
    {
        if (!L.n||!H.n)//判断两个单链表是否为空
          {
            return ERROR;
          }
        Node *p, *q;
        int k = 0;
        p = L.first;
       for (int j = 0; j < L.n; j++)
        {
         q = H.first;
         for (int i = 0; i < H.n; i++)
         {
           if (p->element == q->element)
           {
              same[k] = p->element;
              k++;
           }
           q = q->link;
         }
         p = p->link;
        }
         return k;
    }

7.输出

   Status Output(SingleList L)//输出链表
  {
    if (!L.n)//判断单链表是否为空
    {
      return ERROR;
    }
    Node *p;
    p = L.first;
    for (int i = 0; i < L.n; i++)
      {
         printf(" %d",p->element);
         p = p->link;
      }
     return OK;
  }

8.撤销

    Status Destroy(SingleList *L)//撤销单链表
     {
       if (!L->n)//判断单链表是否为空
           {
            return ERROR;
           }
      Node *p;
      for (int i = 0; i < L->n - 1; i++)
         {
           p = L->first->link;
           free(L->first);
           L->first = p;
         }
       return OK;
     }

9.主函数

   int main()
    {
      printf("链表L\n");
      SingleList L;
      if (Init(&L))
         {
           printf("初始化成功!\n");
           int x;
           printf("请输入单链表L的数据,以‘-1’结束\n");
           for (int i = 0;; i++)
             {
               scanf_s("%d", &x);
               if (x == -1)
                 {
                   break;
                 }
               Insert(&L, i - 1, x);
             }
           Bubble_sort(L);
         }
      else
        {
        printf("初始化失败!\n");
        }
      printf("链表H\n");
      SingleList H;
      if (Init(&H))
     {
    printf("初始化成功!\n");
    int x;
    printf("请输入单链表H的数据,以‘-1’结束\n");
    for (int i = 0;; i++)
    {
        scanf_s("%d", &x);
        if (x == -1)
        {
            break;
        }
        Insert(&H, i - 1, x);
    }
    Bubble_sort(H);
}
else
{
    printf("初始化失败!\n");
}
system("CLS");
printf("链表L\n");
Output(L);
printf("\n");
printf("链表H\n");
Output(H);
printf("\n");
printf("合并单链表L和H形成G链表\n");
SingleList G;
if (Init(&G))
{
    printf("初始化成功!\n");
    for (int i = 0; i < L.n + H.n; i++)
    {
        Insert(&G, i - 1, 0);
    }
    Node *p1, *p2, *p3;
    p1 = G.first;
    p2 = L.first;
    p3 = H.first;
    for (int i = 0; i < L.n; i++)
    {
        p1->element = p2->element;
        p1 = p1->link;
        p2 = p2->link;
    }
    for (int j = 0; j < H.n; j++)
    {
        p1->element = p3->element;
        p1 = p1->link;
        p3 = p3->link;
    }
    /*
    另一种合并两单链表的方法
    for (int i = 0; i <L.n; i++)
    {
    Insert(&G, i-1,p2->element);
    p2 = p2->link;
    }
    for (int i = 0; i < H.n; i++)
    {
    Insert(&G, i+L.n- 1, p3->element);
    p3 = p3->link;
    }
    */
    Bubble_sort(G);
    printf("链表G:\n");
    Output(G);
    printf("\n");
}
else
{
    printf("初始化失败!\n");
}
printf("链表L和H的交集:\n");
int *same = new int[100];
int k=Get_Interserction(L,H,same);
for(int i=0;i<k;i++)
{
    printf(" %d", same[i]);
}
printf("\n");
    }

10.运行结果


TIM图片20180610094452.png TIM图片20180610094501.png
TIM图片20180610094506.png
上一篇 下一篇

猜你喜欢

热点阅读