您的位置:首页 > 其它

将La和Lb合并为一个新的线性表Lc的几种结构的归纳

2009-08-23 16:08 323 查看
在数据结构线性表一章中,提出了三种方法。

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、在空间上,链式表示在归并两个链表为一个链表时,不需要另建新的结点空间,而只需将原来两个链表中结点之间的关系解除,重新按元素非递减关系将所有结点连接成一个链表即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐