将La和Lb合并为一个新的线性表Lc的几种结构的归纳
2009-08-23 16:08
323 查看
在数据结构线性表一章中,提出了三种方法。
1、总的方法,并没有涉及具体的存储类型。此处给出了具体的思想。
2、利用线性表的顺序表示给出了顺序表的合并的算法。
首先线性表的动态分配顺序存储结构如下:
算法如下:
3、利用线性表的链式表示给出了顺序表的合并的算法。
首先线性表的单链表存储结构为:
算法为:
归纳:
1、线性表示和链式表示在时间复杂度上是一致的。
2、在空间上,链式表示在归并两个链表为一个链表时,不需要另建新的结点空间,而只需将原来两个链表中结点之间的关系解除,重新按元素非递减关系将所有结点连接成一个链表即可。
1、总的方法,并没有涉及具体的存储类型。此处给出了具体的思想。
void MergeList(List La, List Lb, List &Lc) { //已知线性表La和Lb中的数据元素按值非递减排列 //归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列 InitList(Lc); int ai, bj; int i = j = 1; int k = 0; La_len = ListLength(La); Lb_len = ListLength(Lb); while( (i <= La_len) && (j <= Lb_len) ) { GetElem(La, i, ai); GetElem(Lb, j, bj); if(ai <= bj) { ListInsert(Lc, ++k, ai); ++i; } else { ListInsert(Lc, ++k, bj); ++j; } } while(i <= La_len) { GetElem(La, i++,ai); ListInsert(Lc, ++k, ai); } while (j <= Lb_len) { GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj); } } //MergeList
2、利用线性表的顺序表示给出了顺序表的合并的算法。
首先线性表的动态分配顺序存储结构如下:
#define LIST_INTI_SIZE 100 //线性表的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量 }Sqlist;
算法如下:
oid MergeList_Sq(Sqlist La, Sqlist Lb, Sqlist &Lc) { //已知线性表La和Lb中的数据元素按值非递减排列 //归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列 ElemType *pa, *pb, *pc, *pa_last, *pb_last; pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length + Lb.length; pc = Lc.elem = (ElemType *) malloc(Lc.listsize * sizeof(ElemType)); if(!Lc.elem) exit(OVERFLOW); //存储空间失败 pa_last = La.elem + La.length - 1; pb_last = Lb.elem + Lb.length - 1; while(pa <= pa_last && pb < pb_last) { if( *pa < *pb) *pc++ = *pa++; else *pc++ = *pb++; } while(pa < pa_last) *pc++ = *pa++; while(pb < pb_last) *pc++ = *pa++; } //MergeList_Sq
3、利用线性表的链式表示给出了顺序表的合并的算法。
首先线性表的单链表存储结构为:
typedef struct LNode { ElemType data; struct *next; }LNode, *LinkList; //若L为LinkList型的变量,则L为单链表的头指针,它指向表中第一个结点
算法为:
void 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的头结点 }//MergeList_L
归纳:
1、线性表示和链式表示在时间复杂度上是一致的。
2、在空间上,链式表示在归并两个链表为一个链表时,不需要另建新的结点空间,而只需将原来两个链表中结点之间的关系解除,重新按元素非递减关系将所有结点连接成一个链表即可。
相关文章推荐
- 线性链表之将单调递增的la和lb中的数据元素按值递增,将la和lb合并为新的线性表lc,使lc中的元素仍然单调递增
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 数据结构中La表的数据合并到Lb表中
- 数据结构中La表的数据合并到Lb表中
- 线性表LA和LB非递减有序排列,将LA,LB进行归并为新的线性表LC,要求LC中的数据元素扔非递减有序列排列
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
- 怎样把网站js文件合并成一个?几种方法可以实现
- [VB.NET]vb.net中如何将两个结构不同的DATATABLE合并成一个DATATABLE
- 131. 一个链表的结点结构,合并非递归和递归
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
- 关于结构相同,数据不同的数据库进行一个表数据合并入另一个数据库中的表
- 把元素递增的线性表La和Lb合并为Lc,且Lc的中的元素递减排列,使用原空间
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
- (使用树结构来支持并查集操作8.4.2)POJ 2236 Wireless Network(判断两个元素是否在同一个集合&&有条件的合并)
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- java编程实现将两个有序单链表LA,LB合并成新的LA
- 数据结构5:线性表中把属于la中而不属于lb中的元素放到la中
- 数据结构——算法之(033)(两个有序单链表合并为一个有序的单链表)
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
- 将la,lb链表合并成lc。