线性表的归并
2015-10-20 16:16
531 查看
已知LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设
LA={3,5,8,11}
LB={2,6,8,9,11,15,20}
则
LC={2,3,5,6,8,8,9,11,11,15,20}
代码实现:
(1)顺序表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
(2)单链表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
---------------------结果预览-------------------
LA={3,5,8,11}
LB={2,6,8,9,11,15,20}
则
LC={2,3,5,6,8,8,9,11,11,15,20}
代码实现:
(1)顺序表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{ int *elem; int length; int listsize; }SqList;
int InitList_Sq(SqList &L){ L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE; return OK; } int ListInsert_Sq(SqList &L,int i,int e){ if(i<1||i>L.length+1) return ERROR; if(L.length>=L.listsize){ int *newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; } int *p,*q; q=&(L.elem[i-1]); for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L.length; return OK; } int MergeList(SqList La,SqList Lb,SqList &Lc){ int *pa=La.elem; int *pb=Lb.elem; Lc.length=La.length+Lb.length; Lc.listsize=Lc.length; Lc.elem=(int *)malloc(Lc.listsize*sizeof(int)); int *pc=Lc.elem; if(!Lc.elem) exit(OVERFLOW); int *pa_last=La.elem+La.length-1; int *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){ //插入La的剩余元素 *pc++=*pa++; } while(pb<=pb_last){ //插入Lb的剩余元素 *pc++=*pb++; } } int ListLength(SqList L){ return L.length; } int ListTraverse(SqList L){ int i; for(i=0;i<L.length;i++){ printf("%d ",L.elem[i]); } printf("\n"); }
int main(){ SqList La,Lb,Lc; //创建表La,La={3,5,8,11} InitList_Sq(La); ListInsert_Sq(La,1,3); ListInsert_Sq(La,2,5); ListInsert_Sq(La,3,8); ListInsert_Sq(La,4,11); printf("La:\n"); ListTraverse(La); //创建表Lb,Lb={2,6,8,9,11,15,20} InitList_Sq(Lb); ListInsert_Sq(Lb,1,2); ListInsert_Sq(Lb,2,6); ListInsert_Sq(Lb,3,8); ListInsert_Sq(Lb,4,9); ListInsert_Sq(Lb,5,11); ListInsert_Sq(Lb,6,15); ListInsert_Sq(Lb,7,20); printf("Lb:\n"); ListTraverse(Lb); InitList_Sq(Lc); MergeList(La,Lb,Lc); printf("Lc:\n"); ListTraverse(Lc); }
(2)单链表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
typedef struct LNode{ int date; struct LNode *next; }LNode,*LinkList;
int CreatList_L(LinkList &L){ L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; } int ListInsert_L(LinkList &L,int i,int e){ LinkList p=L; int j=0; while(p&&j<i-1){ p=p->next; ++j; } if(!p||j>i-1) return ERROR; LNode *s; s=(LinkList)malloc(sizeof(LNode)); s->date=e; s->next=p->next; p->next=s; return OK; } int MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){ LNode *pa=La->next; LNode *pb=Lb->next; LNode *pc=La; Lc=pc; while(pa&&pb){ if(pa->date<=pb->date){ pc->next=pa; pc=pa; pa=pa->next; }else{ pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; free(Lb); } int ListLength(LinkList L){ int length=0; LinkList p=L; while(p!=NULL){ ++length; p=p->next; } return length; } int ListTraverse(LinkList L){ int length=ListLength(L); for(int i=0;i<length-1;i++){ printf("%d ",L->next->date); L=L->next; } printf("\n"); }
int main() { LinkList La,Lb,Lc; CreatList_L(La); ListInsert_L(La,1,3); ListInsert_L(La,2,5); ListInsert_L(La,3,8); ListInsert_L(La,4,11); printf("La:\n"); ListTraverse(La); CreatList_L(Lb); ListInsert_L(Lb,1,2); ListInsert_L(Lb,2,6); ListInsert_L(Lb,3,8); ListInsert_L(Lb,4,9); ListInsert_L(Lb,5,11); ListInsert_L(Lb,6,15); ListInsert_L(Lb,7,20); printf("Lb:\n"); ListTraverse(Lb); CreatList_L(Lc); MergeList(La,Lb,Lc); printf("Lc:\n"); ListTraverse(Lc); }
---------------------结果预览-------------------
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java线性表排序示例分享
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- C++归并算法实例