美文网首页
两个单链表的合并及求相同集合

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

作者: 乔落_fe6f | 来源:发表于2018-06-10 09:58 被阅读0次

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

1.定义

  •  #include<stdio.h> 
     #include<stdlib.h>
     #define OK 1
     #define ERROR 0
     typedef int ElemType;
     typedef int Status;
     typedef struct Node//单链表节点
     {
        ElemType element;
        struct Node *link;
     }Node;
     typedef struct//链表
     {
        struct Node *first;
        int n;
     }SingleList;//单链表
     Status Init(SingleList *L);//初始化
     Status Find(SingleList L, int i, ElemType *x);//查找
     Status Insert(SingleList *L, int i, ElemType x);//插入
     Status Delete(SingleList *L, int i);//删除
     Status Bubble_sort(SingleList L);//有序递增排序
     Status Get_Interserction(SingleList L, SingleList H, int* same);
     //两单链表的交集
    Status Output(SingleList L);//输出
    Status Destoroy(SingleList *L);//撤销
    

2.初始化

  •  Status Init(SingleList *L)//链表初始化
     {
       L->first = NULL;
       L->n = 0;
       return OK;
     }
    

3.查找

  •  Status Find(SingleListL,int i,ElemType *x)//查找
     {
       if (i<0||i>L.n-1)//判断i是否越界
         {
               return ERROR;
         }
       Node *p;
       int j;
       p = L.first;
       for (j=0;j<i;j++)
        {
              p = p->link;
        }
       *x = p->element;
        return OK;
     }
    

4.插入

  •   Status Insert(SingleList *L, int i, ElemType x)//插入
       {
         if (i<-1 || i>L->n - 1)//判断i是否越界
           {
               return ERROR;
           }
         Node *p,*q;
         int j;
         p = L->first;
         for (j = 0; j<i; j++)
           {
               p = p->link;
           }
         q = (Node*)malloc(sizeof(Node));//申请空间
         q->element = x;
         if (i > -1)
           {
              q->link = p->link;
              p->link = q;
           }
         else
           {
              q->link = L->first;
              L->first = q;
           }
         L->n++;
         return OK;
       }
    

5.删除

  • Status Delete(SingleList *L, int i)//删除节点
     {
       if (!L->n)//判断单链表是否为空
         {
             return ERROR;
         }
       if (i<0 || i>L->n - 1)//判断i是否越界
        {
             return ERROR;
        }
       int j;
       Node *p, *q;
       if (i ==0)//删除为头节点
        {
           q = L->first->link;
           free(L->first);
           L->first = q;
        }
       else
       {
          q = L->first;
          p = L->first;
          for (j = 0; j < i - 1; i++)
           {
               q = p->link;
           }
          p = q->link;
          q->link = p->link;
          free(p);
       }
       L->n--;
      return OK;
     }
    

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

相关文章

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

    两个单链表的合并及求相同集合 1.定义 #include #include #define OK 1 #de...

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 2022-02-23 链表专栏

    链表基础 类别 1、合并两个有序链表2、合并 k 个有序链表3、寻找单链表的倒数第 k 个节点4、寻找单链表的中点...

  • 链表算法归纳

    1.单链表反转 2.链表中环的检测 3.两个有序的链表合并 4.删除链表倒数第n个结点 5.求链表的中间结点

  • 链表

    1 合并两个链表 2 链表判环 并返回入环节点的值 3 两个无环单链表是否相交 4 合并两个有序链表 5 链表排序

  • 两个有序单链表的合并

    Java实现两个有序单链表的合并 两个有序链表合并时,首先新建一个链表,存储最终的结果。 分情况讨论合并的方式:1...

  • leetcode 单链表的各种算法

    1 递归实现:合并两个有序的单链表 2 递归实现:单链表逆序存入vector 3 循环实现:快慢指针找到单链表中间...

  • 合并两个有序单链表

    一、问题描述 给定两个单链表,都是递增有序的,将它们合并,使合并后的链表仍然有序。 二、解题思路 这种链表的问题我...

  • 2018-07-26

    合并有顺序的数组 打印两个有序链表的公共部分 在单链表和双链表中删除倒数第k个节点 单链表 双链表 删除链表的中间...

网友评论

      本文标题:两个单链表的合并及求相同集合

      本文链接:https://www.haomeiwen.com/subject/racfeftx.html