线性表的顺序表示与实现(C语言版)
本例为纯C语言实现, 无C++部分
// 本例为纯C语言实现,所用编译器为C编译器,非C++编译器
// 线性表的顺序表示与实现
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //线性表存储空间初始分配量
#define LIST_INCREMENT 10 //线性表存储空间的分配增量
typedef struct _SqList{
int length; //当前长度
int listSize; //当前分配的存储容量
int* elem; //存储空间基址
}SqList;
int initList(SqList* L);
int insertListElem(SqList* L, int i, int e);
int deleteListElem(SqList* L, int i, int* e);
int mergeList(SqList La, SqList Lb, SqList* Lc);
int main(){
int i; // 循环条件所用
int ee; // 返回元素的值
int* e = ⅇ // 指针e指向返回元素的的值
SqList list,La,Lb,Lc,*l;
l = &list;
if( initList(l) && initList(&La) && initList(&Lb) ){
// 如果初始化成功线性表成功,向线性表中插入元5个元素
for( i=1;i<=5;i++ ){
insertListElem( l, i, i+5);
insertListElem(&La, i, i);
insertListElem(&Lb, i, i+3);
}
printf("线性表l为: \n");
for(i=0;i<l->length;i++){
printf("%d ",l->elem[i]);
}
printf("\n");
printf("线性表La为: \n");
for(i=0;i<La.length;i++){
printf("%d ",La.elem[i]);
}
printf("\n");
printf("线性表Lb为: \n");
for(i=0;i<Lb.length;i++){
printf("%d ",Lb.elem[i]);
}
printf("\n");
}
else{
printf("初始化线性表失败!");
}
printf("\n");
// 删除线性表中的第3个元素
deleteListElem(l,3,e);
printf("线性表l删除的元素为: %d\n", *e);
printf("线性表l删除元素e后的为: \n");
for(i=0;i<l->length;i++){
printf("%d ",l->elem[i]);
}
printf("\n");
printf("\n");
// 合并线性表
if( mergeList(La, Lb, &Lc) ){
printf("线性表La和线性表Lb合并后的线性表Lc为: \n");
for( i=0; i<Lc.length; i++ ){
printf("%d ", Lc.elem[i]);
}
}
else{
printf("合并线性表失败!");
}
return 0;
}
int initList(SqList* L){ // int InitList(SqList& L){ (C++)
// 构造一个空的线性表 L
L->elem = (int* )malloc(LIST_INIT_SIZE*sizeof(int));
if(!L->elem){
printf("存储空间分配失败!");
return 0;
}
L->length = 0;
L->listSize = LIST_INIT_SIZE;
return 1;
}
int insertListElem(SqList* L, int i, int e){ // int InsertList(SqList &L, int i, SqList e){ (C++)
// 在线性表L的第i个元素之前插入元素e
if( i<1 || i>(L->length+1) ){
// 当插入位置在第1个元素之前或在最后一个元素的后面的后面插入元素则返回错误
printf("线性表插入元素位置错误!");
return 0;
}
if(L->length>=L->listSize){
// 如果存储空间不择,则分配空间
int* newBase = (int* )realloc(L->elem, (L->listSize + LIST_INCREMENT)*sizeof(int));
if( !newBase ){
// 存储空间分配失败
printf("增加存储空间失败!");
return 0;
}
L->elem = newBase; // 将新的存储空间基址给L.elem
L->listSize += LIST_INCREMENT; // 更新存储空间容量
}
int* q = &L->elem[i-1]; // 指针q指向元素e要插入的位置
int* p;
for( p=&L->elem[L->length-1]; p>=q; p--){
*(p+1) = *p; // 将q指向的元素以及后面的元素后移
}
*q = e; // 将元素e插入线性表
++L->length;
return 1;
}
int deleteListElem(SqList* L, int i, int* e){
// 删除第i个元素,并用e指向其值
if(i<1 || i>L->length){
// 如果第i个元素不存在,返回错误
printf("第%d个元素不存在!",i);
return 0;
}
int* q = &L->elem[i-1]; // 指针q指向要删除的元素
int* p = L->elem + L->length-1; // 指针p指向最后一个元素
*e = *q; // 将要删除的元素赋值给指针e所指向的地址
for(; q<p; q++) {
// q后面的所有元素皆前移一位
*q = *(q+1);
}
--L->length;
return 1;
}
int mergeList(SqList La, SqList Lb, SqList* Lc){
// 合并线性表,按照非递减顺序排列
// 线性表a和b的首地址
int* qa = La.elem;
int* qb = Lb.elem;
int* qc;
// 更新线性表c的长度和存储空间为a的长度和b的长度之和
Lc->listSize = Lc->length = La.length + Lb.length;
// 为线性表c分配空间
Lc->elem = (int* )malloc(Lc->listSize*sizeof(int));
if(!Lc->elem){
// 存储空间分配失败返回0
printf("Lc存储空间分配失败!");
return 0;
}
qc = Lc->elem;
// 线性表a和b的尾地址
int* pa = La.elem + La.length - 1;
int* pb = Lb.elem + Lb.length - 1;
// 将线性表a中的元素和b中的元素插入c
while(qa<=pa && qb<=pb){
if(*qa <= *qb){
*qc++ = *qa++;
}
else{
*qc++ = *qb++;
}
}
while(qa<=pa){
*qc++ = *qa++;
}
while(qb<=pb){
*qc++ = *qb++;
}
return 1;
}