写在前面:数据结构与算法篇,分享技术,共同进步,有不足请见谅,相关意见可评论告知 ~
赣江凌凌求学中, 庐陵飘飘子然兮; 算法悠悠与结构, 热爱漫漫可相抵;
文章目录
头文件及其相关操作函数声明函数功能顺序创建顺序表初始化顺序表显示顺序表显示表长按位查找 按位获取元素按位插入按位删除按值查找并集
主函数输出结果合并算法输出结果
头文件及其相关操作
头文件、宏定义、结构体、布尔定义
# include <stdio.h>
# include <stdlib.h>
# include <cstdlib>
#define MAXSIZE 20
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW -1
typedef int ElemType
;
typedef struct
{
ElemType
*elem
;
ElemType data
[MAXSIZE
];
int length
;
int listsize
;
}SqList
;
typedef enum Bool
{
FALSE
,TRUE
}Bool
;
函数声明
Bool
CreatList(SqList
* L
) ;
Bool
InitList(SqList
* L
) ;
Bool
GetElem(SqList L
, int i
, ElemType
* e
) ;
void display(SqList L
);
int ListLength(SqList L
) ;
Bool
ListDelete(SqList
*L
,int i
,ElemType
* e
) ;
int LocateElem(SqList L
,ElemType e
) ;
Bool
UnionList(SqList
* L1
,SqList
* L2
,SqList
* L
) ;
void Merge() ;
void MergeList_Sq(SqList La
,SqList Lb
,SqList
&Lc
) ;
函数功能
顺序创建顺序表
Bool
CreatList(SqList
* L
)
{
int i
;
printf("请输入创建表的长度(0-20)?\n");
scanf("%d",&(L
->length
));
if(L
->length
<0||L
->length
>MAXSIZE
)
return FALSE
;
for(i
=1;i
<=L
->length
;i
++)
{
L
->data
[i
-1]=i
;
}
return TRUE
;
}
初始化顺序表
Bool
InitList(SqList
* L
){
L
->elem
= (ElemType
*)malloc(LIST_INIT_SIZE
* sizeof(ElemType
)) ;
if(! L
->elem
) exit(OVERFLOW
);
L
->length
= 0 ;
L
->listsize
= LIST_INIT_SIZE
;
return TRUE
;
}
显示顺序表
void display(SqList L
)
{
int i
;
for(i
=0;i
<L
.length
;i
++)
printf("%d ",L
.data
[i
]);
printf("\n");
}
显示表长
int ListLength(SqList L
)
{
return L
.length
;
}
按位查找 按位获取元素
Bool
GetElem(SqList L
, int i
, ElemType
* e
)
{
if(L
.length
==0 || i
<1|| i
>L
.length
)
return FALSE
;
*e
=L
.data
[i
-1];
return TRUE
;
}
按位插入
{
int k
;
if(L
->length
==MAXSIZE
|| i
<1|| i
>L
->length
+1)
return FALSE
;
if(i
<=L
->length
)
{
for(k
=L
->length
-1;k
>=i
-1;k
--)
L
->data
[k
+1]=L
->data
[k
];
}
L
->data
[i
-1]=e
;
L
->length
++;
return TRUE
;
}
按位删除
Bool
ListDelete(SqList
*L
,int i
,ElemType
* e
){
int j
;
if(L
->length
> MAXSIZE
|| i
<1 || L
->length
==0)
return FALSE
;
*e
=L
->data
[i
-1] ;
if(i
<L
->length
){
for(j
=i
-1 ; j
<L
->length
-1 ;j
++)
L
->data
[j
] = L
->data
[j
+1] ;
}
L
->length
-- ;
return TRUE
;
}
按值查找
int LocateElem(SqList L
,ElemType e
)
{
int i
=0;
for(i
=0;i
<L
.length
;i
++)
if(L
.data
[i
]==e
)
return i
+1;
return 0;
}
并集
Bool
UnionList(SqList
* L1
,SqList
* L2
,SqList
* L
)
{
int i
,j
;
L
->length
=0;
for(i
=0;i
<L1
->length
;i
++)
{
L
->data
[i
]=L1
->data
[i
];
}
for(j
=0;j
<L2
->length
;j
++)
if(LocateElem(*L1
,L2
->data
[j
])==0)
{
if(i
>=MAXSIZE
)
return FALSE
;
L
->data
[i
]=L2
->data
[j
];
i
++;
}
L
->length
=i
;
return TRUE
;
}
主函数
int main(){
ElemType e
;
int i
,j
,line
,num
,num1
,num2
,num3
,num4
,num5
;
SqList List
;
ElemType elem
;
SqList L1
,L2
,L3
,L4
;
Bool flag
;
printf("1、顺序自动创建创建顺序表\n") ;
if(!CreatList(&List
))
printf("顺序表创建失败!\n");
else
printf("顺序表创建成功!\n");
printf("创建的顺序表为\n") ;
display(List
);
printf("\n\n");
printf("2、自定义创建创建顺序表\n") ;
InitList(&L1
);
InitList(&L2
);
printf("请输入L1初始长度和初始值");
scanf("%d",&line
);
for(i
=1;i
<=line
;i
++){
scanf("%d",&e
);
ListInsert(&L1
,i
,e
);
}
printf("请输入L2初始长度和初始值");
scanf("%d",&line
);
for(j
=1;j
<=line
;j
++){
scanf("%d",&e
);
ListInsert(&L2
,j
,e
);
}
printf("顺序表L1为\n") ;
display(L1
) ;
printf("顺序表 L2为\n") ;
display(L2
) ;
printf("\n\n");
printf("以下操作对象为顺序表L1\n") ;
printf("3、顺序表的按位查找并获取\n") ;
printf("请输入要查找的位序\n") ;
scanf("%d",&num
);
printf("\n\n") ;
GetElem(L1
,num
,&elem
);
printf("顺序表L1的第%d个元素是%d",num
,elem
);
printf("\n\n");
printf("4、顺序表的按元素获取位置\n") ;
printf("请输入要查找的元素\n") ;
scanf("%d",&num4
);
num5
= LocateElem(L1
,num4
) ;
printf("%d是顺序表的第%d个元素",num4
,num5
);
printf("\n\n");
printf("5、顺序表的按位插入\n") ;
printf("请输入要查入的位序\n") ;
scanf("%d",&num1
);
printf("请输入要查入的元素\n") ;
scanf("%d",&num2
);
printf("在位序为%d的地方插入%d\n",num1
,num2
) ;
ListInsert(&L1
,num1
,num2
);
printf("插入后的链表如下") ;
display(L1
);
printf("\n\n");
printf("6、顺序表的按位删除\n") ;
printf("请输入要删除元素的位序\n") ;
scanf("%d",&num3
);
ListDelete(&L1
,num3
,&elem
) ;
printf("删除第%d个元素是%d\n",num3
,elem
);
printf("删除后该表的长度为;%d\n",ListLength(L1
)) ;
printf("删除后的链表如下") ;
display(L1
) ;
printf("\n\n");
printf("7、顺序表的并集\n") ;
flag
=UnionList(&L1
,&L2
,&L3
);
if(!flag
)
printf("合并后,顺序表的长度超过最大范围");
printf("该表的长度为:%d\n",ListLength(L3
));
display(L3
);
}
输出结果
合并算法
核心算法
void MergeList_Sq(SqList La
,SqList Lb
,SqList
&Lc
){
int *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
++=*pb
++;
}
void merge(){
ElemType e
;
int i
,j
,line
;
SqList La
,Lb
;
InitList_Sq(La
);
InitList_Sq(Lb
);
printf("请输入La初始长度和初始值:");
scanf("%d",&line
);
for(i
=1;i
<=line
;i
++){
scanf("%d",&e
);
ListInsert_Sq(La
,i
,e
);
}
printf("请输入Lb初始长度和初始值:");
scanf("%d",&line
);
for(j
=1;j
<=line
;j
++){
scanf("%d",&e
);
ListInsert_Sq(Lb
,j
,e
);
}
ListPrint(La
);
ListPrint(Lb
);
for(i
=0;i
<Lb
.length
;i
++){
bool repate
= false
;
for(j
=0;j
<La
.length
;j
++){
if(Lb
.elem
[i
]==La
.elem
[j
]){
repate
= true
;
}
}
if(!repate
){
ListInsert_Sq(La
,La
.length
+1.,e
= Lb
.elem
[i
]);
}
}
ListPrint(La
);
}
void merges(){
ElemType e
;
int i
,j
,line
;
SqList La
,Lb
,Lc
;
InitList_Sq(La
);
InitList_Sq(Lb
);
printf("请输入La初始长度和初始值:");
scanf("%d",&line
);
for(i
=1;i
<=line
;i
++){
scanf("%d",&e
);
ListInsert_Sq(La
,i
,e
);
}
printf("请输入Lb初始长度和初始值:");
scanf("%d",&line
);
for(j
=1;j
<=line
;j
++){
scanf("%d",&e
);
ListInsert_Sq(Lb
,j
,e
);
}
ListPrint(La
);
ListPrint(Lb
);
MergeList_Sq(La
,Lb
,Lc
);
ListPrint(Lc
);
}
输出结果