线性表的合并

一般集合的并集问题

【问题描述】

已知两个集合A与B,现要求一个新的集合A=AUB;

例如:A=(1,2,4,6,7),B=(2,4,8,9);

合并后   A=(1,2,4,6,7,8,9)

1.创建结点

1 typedef struct Lnode
2 {
3      int data;
4      struct Lnode * next;
5
6 }Lnode,*PLnode;

2.创建线性表

 1 PLnode createList(PLnode L)
 2 {
 3     L = (PLnode)malloc(sizeof(Lnode));
 4     PLnode Ptail = L;
 5     L->next = NULL;
 6
 7     printf("input length:\n");
 8     scanf("%d",&L->data);
 9
10     for(int i = 1;i<=L->data;i++)
11     {
12         PLnode pnew = (PLnode)malloc(sizeof(Lnode));
13         printf("input data:\n");
14         scanf("%d",&pnew->data);
15
16         Ptail->next = pnew;
17         Ptail = pnew;
18         Ptail->next = NULL;
19
20     }
21     return L;
22 }

3.从LA中查找元素e

 1 bool locateElem(PLnode LA,int e)
 2 {
 3     PLnode p = LA;
 4     for(int i =1;i<=LA->data;i++)
 5     {
 6         p = p->next;
 7         if(p->data == e)
 8         {
 9             return false;     //如果有相同元素返回false
10         }
11     }
12     return true;
13 }

4.插入操作

 1 void insertList(PLnode LA,int e)
 2 {
 3     PLnode p = LA;
 4
 5     for(int i=1;i<=LA->data;i++)
 6     {
 7         p = p->next;
 8     }
 9
10     PLnode pnew = new Lnode;
11     pnew->data = e;
12     p->next = pnew;
13     pnew->next=NULL;
14     LA->data++;            //长度增加
15 }

5.合并

 1 void mergeList(PLnode LA,PLnode LB)
 2 {
 3     int len2 = LB->data;
 4
 5     PLnode p = LB;
 6     for(int i=1;i<=len2;i++)
 7     {
 8       p = p->next;
 9       if(locateElem(LA,p->data))    //如果没有相同的元素就插入
10       {
11           insertList(LA,p->data);
12       }
13     }
14 }

6.完整代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 typedef struct Lnode
  5 {
  6      int data;
  7      struct Lnode * next;
  8
  9 }Lnode,*PLnode;
 10
 11 PLnode createList(PLnode L);
 12 void traverse(PLnode L);
 13 void insertList(PLnode LA,int e);
 14 bool locateElem(PLnode LA,int e);
 15 void mergeList(PLnode LA,PLnode LB);
 16 int main()
 17 {
 18     PLnode LA;
 19     PLnode LB;
 20
 21     LA = createList(LA);    //创建线性表LA,再将头指针赋值给LA;
 22     LB = createList(LB);    //创建线性表LA,再将头指针赋值给LA;
 23
 24     traverse(LA);           //传入头指针
 25     traverse(LB);           //传入头指针
 26     mergeList(LA,LB);       //集合并集
 27     traverse(LA);           //再输出验证一下
 28     return 0;
 29 }
 30 PLnode createList(PLnode L)
 31 {
 32     L = (PLnode)malloc(sizeof(Lnode));
 33     PLnode Ptail = L;
 34     L->next = NULL;
 35
 36     printf("input length:\n");
 37     scanf("%d",&L->data);
 38
 39     for(int i = 1;i<=L->data;i++)
 40     {
 41         PLnode pnew = (PLnode)malloc(sizeof(Lnode));
 42         printf("input data:\n");
 43         scanf("%d",&pnew->data);
 44
 45         Ptail->next = pnew;
 46         Ptail = pnew;
 47         Ptail->next = NULL;
 48
 49     }
 50     return L;
 51 }
 52
 53 void traverse(PLnode L)
 54 {
 55     PLnode p = L;
 56     while(p->next!=NULL)
 57     {
 58         printf("%d ",p->next->data);
 59         p=p->next;
 60     }
 61     printf("\n");
 62 }
 63
 64 void mergeList(PLnode LA,PLnode LB)
 65 {
 66     int len2 = LB->data;
 67
 68     PLnode p = LB;
 69     for(int i=1;i<=len2;i++)
 70     {
 71       p = p->next;
 72       if(locateElem(LA,p->data))
 73       {
 74           insertList(LA,p->data);
 75       }
 76     }
 77
 78
 79 }
 80
 81 bool locateElem(PLnode LA,int e)
 82 {
 83     PLnode p = LA;
 84     for(int i =1;i<=LA->data;i++)
 85     {
 86         p = p->next;
 87         if(p->data == e)
 88         {
 89             return false;
 90         }
 91     }
 92     return true;
 93 }
 94
 95 void insertList(PLnode LA,int e)
 96 {
 97     PLnode p = LA;
 98
 99     for(int i=1;i<=LA->data;i++)
100     {
101         p = p->next;
102     }
103
104     PLnode pnew = new Lnode;
105     pnew->data = e;
106     p->next = pnew;
107     pnew->next=NULL;
108     LA->data++;
109 }

原文地址:https://www.cnblogs.com/wwww2/p/11623701.html

时间: 2024-11-07 22:55:48

线性表的合并的相关文章

线性表算法-合并

线性表算法-合并

利用线性链表基本操作完成两个有序线性表的合并

La.Lb线性链表升序排列,将结果放在Lc链表里.之前有文章写过两个有序链表的合并 区别在于,前面的做法是保留La的头节点,free掉Lb的头节点,将余下节点串起来.这种方法是面向过程编程 而现在讨论的做法,是单独建立一个Lc链表,利用一些已经写好的基本操作函数来完成,这种模块化编程做法实际上还简单些.不光模块函数里写不了几行,在调用这些函数时减少了不必要的琐碎过程的思考时间. 该做法的核心思想:将每轮比较过后偏小的那个节点从相应链表中删除(这是头节点的指针不会指向该节点了,但该节点的空间依旧保

数据结构之线性表

线性表是最简单最常用的一种数据结构,在生活中各个方面都有应用. 线性表的定义:线性表大多数情况下是除了第一个位置的数据元素只存在后继元素,最后一个位置的数据元素只存在前驱元素外,所有数据元素都存在前驱和后继的一个有限序列.举个简单的例子就是:字母表中除了 a 只存在后继 b,z 只存在前驱 y之外,剩余的所有字母全部都有前驱和后继.为什么是大多数情况下,是因为线性表的链式存储结构中除了单向链表,还有循环链表和双向链表. 线性表的存储结构:顺序存储(数组实现,需要预先分配连续的内存空间)和链式存储

线性表的顺序实现

线性表的顺序表示和实现时间:2006/02/14测试环境:TC2.0 #include "stdio.h" #define TRUE 1 #define FALSE 0 #define List_Init_Size 30 #define List_Increment 10 typedef int ElemType; typedef struct { ElemType *elem; int length; int listsize; }Sqlist; /*初始化一个线性表*/ int I

数据结构总结 第二章 线性表 抽象数据类型的具体实现

#include<stdio.h> #include<stdlib.h> #include<iostream> #define MAXSIZE 1000 #define ERROR 0 #define OK 1 using namespace std; typedef int Status; typedef int ElemType; /////////////线性表定义(顺序表)//////////////////////// typedef struct { Ele

数据结构实验 —— 线性表

顺序表 #include<iostream> #include<stdio.h> #include<stdlib.h> //线性表动态 分配顺序存储结构 #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的线性增量 #define ERROR -1 //定义错误 ERROR #define OK 1 typedef int Status;//状态码 typedef int

数据结构学习小结2 (第二章:线性表)

一.小结(1)认为最重要的内容小结:1.链表和顺序表的操作的代码实现.(初始化.创建.取值.查找.删除.插入)2.线性表的应用:线性表的合并:有序表的合并3.一元多项式的和的代码实现. (2)其他杂七杂八的收获:1.更深理解了->的含义:->是指针的指向运算符,通常与结构体一起使用.[从小组成员上获得的收获]2.通过作业和视频学习了单链表的逆转的实现3.尾指针不为空,尾指针->next才为空4.看了老师“带你打代码”里面有序表合并的代码写法,让我更熟悉一些操作,譬如: 新建一个结点: (

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺