线性表:由同类型数据元素构成有序序列的线性结构
1、表中元素个数称为线性表的长度
2、线性表没有元素时,称为空表
3、表起始位置称表头,表结束位置称表尾
话不多说,上代码:
/*---------------------------线性表操作集------------------------------------*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1 //返回值
#define ERROR 0
#define OVERFLOW -1
typedef int Elemtype; //数据类型
typedef int Status; //返回值类型
void test1();
//线性表的动态分配顺序存储结构
#define LIST_SIZE 100 //线性表存储空间的起始分配量
#define LIST_RE_SIZE 100 //线性表存储空间的扩展量
typedef struct SqList{
Elemtype *Elem; //存储空间的基地址
int length; //当前的长度
int listsize; //当前分配的存储量大小
}SqList;
//创建一个空的线性表
Status Init_SqList(SqList *L){
//传入一个新建的线性表,给线性表申请空间
L->Elem=(Elemtype*)malloc(LIST_SIZE*sizeof(Elemtype));//申请空间
if(!L->Elem) return OVERFLOW; //申请失败,退出
L->length=0; //当前长度为0
L->listsize=LIST_SIZE; //当前容量为0
return OK;
}
//往线性表中插入一个元素
Status Insert_SqList(SqList *L,Elemtype e,int i){
//传入一个线性表、想要传入的数据和位置
//在顺序线性表L中第i个位置之前插入一个新的元素e
Elemtype *newList;
int *p; //指向要插入的位置
int *q;
//查看i是否合法
if(i<1||i>L->length+1) return ERROR; //i不合法
//查看存储空间是否已满
if(L->length>L->listsize) { //当前的存储空间已满,需要增加分配
newList=(Elemtype*)realloc(L->Elem,(L->length+LIST_RE_SIZE)*sizeof(Elemtype)); //增加分配
if(!newList) return OVERFLOW; //空间分配失败
L->Elem=newList;
L->listsize+=LIST_RE_SIZE;
}
//找到要插入元素的位置并且插入
p=&(L->Elem[i-1]); //p为插入元素的位置
for(q=&(L->Elem[L->length-1]);p<=q;--q){ //遍历插入位置 之后的数据
*(q+1)=*q; //往后移动一格
}
*p=e;
++L->length;
return OK;
}
//在顺序表里删除一个元素
Status Delete_SqList(SqList *L,Elemtype *e,int i){
//传入一个顺序表、要删除的数据的位置
//用e把删除的数据带出来
Elemtype *p;
Elemtype *q;
//判断i是否合法
if(i<1||i>L->length) return ERROR; //i不合法
//找到要删除的元素
p=&(L->Elem[i-1]); //p为要删除的元素
*e=*p;
q=&(L->Elem[L->length-1]);
p++;
for(p;p<q;++p){
*(p-1)=*p;
}
--L->length;
return OK;
}
//合并两个顺序表
Status Merge_SqList(SqList La,SqList Lb,SqList *Lc){
//已知顺序线性表La和Lb的元素按值非递减排序
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排序
Elemtype *pa,*pa_last;
Elemtype *pb,*pb_last;
Elemtype *pc;
//初始化各参数
pa=La.Elem;
pb=Lb.Elem;
pa_last=La.Elem+La.length-1;
pb_last=Lb.Elem+Lb.length-1;
Lc->listsize=Lc->length=La.length+Lb.length;
pc=Lc->Elem=(Elemtype*)malloc(Lc->listsize*sizeof(Elemtype));
//判断内存是否分配成功
if(!Lc->Elem) return OVERFLOW;
//归并
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++;
}
return OK;
}
//主函数
int main(void){
test1();
system("pause");
return 0;
}
//测试代码1
void test1(){
SqList q,p,f;
int a;
if(Init_SqList(&q)) printf("OK\n");
if(Insert_SqList(&q,22,1)) printf("Write OK\n");
printf("%d\n",q.Elem[0]);
if(Delete_SqList(&q,&a,1));
printf("%d\n",a);
if(Insert_SqList(&q,244,1)) printf("Write OK\n");
if(Init_SqList(&p)) printf("OK\n");
if(Insert_SqList(&p,344,1)) printf("Write OK\n");
if(Init_SqList(&f)) printf("OK\n");
if(Merge_SqList(p,q,&f)) printf("%d %d\n",f.Elem[0],f.Elem[1]);
}
如果使用vscode,需要加上头文件和特定函数:
#include <stdilb>
int main(){
/*代码*/
system("pause");
}
实现: