顺序表的合并(元素赋值法)
对于”顺序表的合并“,则从算法2.2可直接写出形式上极为相似的算法2.7.显然,算法2.7的操作为”元素赋值法“。算法的时间复杂度为(A.len+B.len)。
实现后加上了备注,代码条理还算清晰就拿出来分享一下。
代码:
#include<iostream>//ZJJ数据据结构-线性表2.6
using namespace std;
typedef int ElemType;
#define List_Init_Size 5//线性表初始长度
#define LISTINCREMENT 5//线性表每次扩充长度
//线性表结构
typedef struct {
int* elem;//基地址
int len;//顺序表当前长度
int lisesize;//顺序表当前分配的储存空间
}Sqlist;
void InitList(Sqlist* L)//线性表初始化
{
L->elem = (ElemType*)malloc(List_Init_Size * sizeof(ElemType));//使用malloc,申请一段连续的储存空间
if (!L->elem) {
cout << "空间申请失败" << endl;
exit(0);//结束程序
}
L->len = 0;
L->lisesize = LISTINCREMENT;
}
void ListShow(Sqlist* L)//输出函数
{
for (int i = 0;i < L->len;i++)
{
cout << L->elem[i] << " ";
}cout << endl;
}
void MergetList(Sqlist A, Sqlist B,Sqlist *C)//合并函数
{
int *pa, *pb, *pc,*pa_last,*pb_last,*pc_last;
pa = A.elem;
pb = B.elem;
C->lisesize = C->len = A.len + B.len;
pc = C->elem = (ElemType*)malloc(C->lisesize * sizeof(ElemType));
if (!C->elem) {
cout << "空间申请失败" << endl;
exit(0);
}
pa_last = A.elem + A.len - 1;
pb_last = B.elem + B.len - 1;
while (pa <=pa_last && pb <=pb_last) {
if (*pa < *pb) {
*pc++ = *pa++;
}else if (*pa > *pb) {
*pc++ = *pb++;
}
else {
*pc++ = *pa++;
*pc++ = *pb++;
}
}
while (pa <= pa_last) {
*pc++ = *pa++;
}
while (pb <= pb_last) {
*pc++ = *pb++;
}
}
int main()
{
Sqlist A, B,C;
InitList(&A);//初始化线性表
InitList(&B);
InitList(&C);
int m;
cout << "输入顺序线性表A的长度: ";
cin >> m;
A.len = m;
cout << "输入数组:" << endl;
for (int i = 0;i < A.len;i++) {
cin >> A.elem[i];
}
int n;
cout << "输入顺序线性表B的长度: ";
cin >> n;
B.len = n;
cout << "输入数组:" << endl;
for (int j = 0;j < B.len;j++) {
cin >> B.elem[j];
}
MergetList(A, B, &C);
cout << "C列表:" << endl;
ListShow(&C);
system("pause");
}
代码实现:
有无欠缺的,欢迎指正。