构造顺序表--合并两个按元素从小到大排列的顺序表
2015-04-21 19:30
435 查看
/*******************************顺序表***************************/
#include<stdio.h>
#include<stdlib.h>//malloc,realloc,exit
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct{ //结构
ElemType *elem; //L.elem[i]表示第i+1个位置的元素的值,等价于*(L.elem+i)
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L){ //初始化
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//malloc
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){ //插入元素
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//realloc
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);//
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)//删除元素 //实参前加&,主函数中值被修改,相当于实参是指针
{
ElemType *p,*q;
q=L.elem +L.length-1;
e=L.elem[i-1];
for(p=L.elem+i;p<=q;p++)
{
*(p-1)=*p;
}
L.length--;
return OK;
}
void MergeList(SqList La,SqList Lb,SqList &Lc)//把两个按元素从小到大排列的顺序表合并
{
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc.length=0;
Lc.listsize=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++;//*pc=*pa; pa++; pc++;
else if(*pa=*pb) {*pc++=*pa++; pb++; }
else *pc++=*pb++;
Lc.length++;
}
while(pa<=pa_last) {*pc++=*pa++; Lc.length++;}
while(pb<=pb_last) {*pc++=*pb++; Lc.length++;}
}
#include<stdio.h>
#include<stdlib.h>//malloc,realloc,exit
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct{ //结构
ElemType *elem; //L.elem[i]表示第i+1个位置的元素的值,等价于*(L.elem+i)
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L){ //初始化
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//malloc
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){ //插入元素
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//realloc
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);//
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)//删除元素 //实参前加&,主函数中值被修改,相当于实参是指针
{
ElemType *p,*q;
q=L.elem +L.length-1;
e=L.elem[i-1];
for(p=L.elem+i;p<=q;p++)
{
*(p-1)=*p;
}
L.length--;
return OK;
}
void MergeList(SqList La,SqList Lb,SqList &Lc)//把两个按元素从小到大排列的顺序表合并
{
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc.length=0;
Lc.listsize=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++;//*pc=*pa; pa++; pc++;
else if(*pa=*pb) {*pc++=*pa++; pb++; }
else *pc++=*pb++;
Lc.length++;
}
while(pa<=pa_last) {*pc++=*pa++; Lc.length++;}
while(pb<=pb_last) {*pc++=*pb++; Lc.length++;}
}
相关文章推荐
- 合并顺序表,合并后的表元素按从小到大排列
- 顺序表的应用举例(顺序表A和顺序表B的元素都是非递减排列,利用顺序表的基本运算,将它们合并成一个顺序表C,要求C也是非递减序列。)
- 合并两个无序数组,并且按照从小到大的顺序排列
- 合并两个单链表(单链表元素均按值非递减排列)
- .定义两个数组,首先把两个数组合并成一个新数组,然后把新数组中的所有元素逆序排列,需要实现的效果如图-2所示。
- .定义两个数组,首先把两个数组合并成一个新数组,然后把新数组中的所有元素逆序排列,需要实现的效果如图-2所示。
- 有两个磁盘文件“A"和”B",各存放一行字母,先要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件“C"中去。
- 数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
- 链表操作:按值的顺序从小到大, 合并两个链表
- 项目-排序函数模板将数组a中的前size个元素按从小到大顺序排列。试设计这个函数模板。
- 飛飛(七十八)(补)将数组a中的前size个元素按从小到大顺序排列
- 将两个顺序表的合并为顺序表
- 9.28机试 定义两个数组,首先把两个数组合并成一个新数组,然后把新数组中的所有元素逆序排列
- 有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并 (按字母顺序排列), 输出到一个新文件C中
- 合并两个顺序表,并删除重复元素
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- 数据结构中线性表的基本操作-合并两个线性表-按照元素升序排列
- 顺序表的创建,插入,删除,查找,逆序以及合并两个有序的顺序表
- 算法:给定两个已从小到大排好序的整型数组arrA和arrB,将两个数组合并成arrC,使得arrC也要按从小到大的顺序排好序
- (4)按从小到大的顺序排列数组中的元素