顺序表是随机存储
/*
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef int Status;//Status 是函数类型(当return值为函数结果状态时使用)
typedef char ElemType;
//&表示引用,对原来的进行操作,并在运行时显示
typedef struct {
ElemType* elem;//存储空间基址,ElemTpype的类型可以改变
int length;//当前长度
int listsize;//当前分配的存储容量
}Sqlist;
//ElemType为用户类型,看题目要求定义(eg:对图书管理,就为Book* elem)
Status Ininlist_Sq(Sqlist& L) {
//构造一个空的线性链表。
L.elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));//分配存储内存
if (!L.elem)return(OVERFLOW);//存储分配失败;
L.length = 0;//空表长度为零
L.listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}//Initlist_Sq
Status ListInsert_Sq(Sqlist& L, int i, ElemType e) {
//在顺序表L中第i个位置前插入新的元素e
//i的合法值为1<=i<=L.length+1
ElemType* p, *q,*newbase;
if (i<1 || i>L.length + 1)return ERROR;//i值不合法
if (L.length >= L.listsize) { //当前存储已满,需增加分配
//c = (int*)relloc(a, b);就是将a的空间给b为整型(实际就是找一个新的地址,开辟空间b,把a放在更大的空间b中,将其内容复制一份给c)
newbase = (ElemType*)realloc(L.elem, (L.listsize + L.length) * sizeof(ElemType));
if (!newbase)exit (ERROR);//分配存储内存失败
L.elem = newbase;//新基址
L.listsize += LISTINCREMENT;//增加存储容量
}
q = &(L.elem[i - 1]);//q为插入位置
for (p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p;//插入位置及以后的元素向后移一位
*q = e;//插入e
++L.length;//表长加一
return OK;
}//ListInsert_Sq
Status Destorylist_Sq(Sqlist& L) {
if (!L.elem)return ERROR;//表示表L不存在
free(L.elem);//若表L存在,回收动态分配的存储空间
L.elem = NULL;
L.length = 0;
L.listsize = 0;
return OK;
}//Destorylist_Sq
int GetLength_Sq(Sqlist L) {
return (L.length);
}//GetLength_Sq
int LocateElem_Sq(Sqlist L, ElemType e) {
//在线性表中L中查找值为e的数据元素,并返回其序号(是第几个元素)
int i;
for (i = 0; i < L.length; i++)
if (L.elem[i] == e)return i + 1;//查找成功,返回序号;
else return 0;//查找失败,返回0;
}//LocateElem_Sq
Status GetElem(Sqlist L, int i, ElemType& e) {
//在表L中找到第i个元素的值给e,并返回;
if (i<1 || i>L.length - 1)return ERROR;//判断i值是否合法
e = L.elem[i - 1];//把第i个值赋给e
return OK;
}//GetElem_Sq
//顺序表的删除1
Status ListDelete_Sq(Sqlist& L, int i, ElemType& e) {
//在顺序表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=L.length
ElemType* p, * q;
if ((i < 1) || (i > L.length))return ERROR;//i值不合法
p = &(L.elem[i - 1]);//p为删除元素的位置
e = *p;//把删除的元素值赋给e返回
q = &(L.elem[L.length - 1]);//表尾元素的位置
for (++p; p <= q; ++p)
*(p - 1) = *p;//删除后元素左移
++L.length;//表长加一
return OK;
}//ListDelete_Sq
//顺序表删除2
Status ListDelete_Sq(Sqlist& L, int i, ElemType& e) {
//在顺序表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=L.length
int j;
if ((i < 1) || (i > L.length))return ERROR;//i值不合法
e = L.elem[i - 1];//把删除的元素值赋给e
for (j = i; j <= L.length - 1; j++)
L.elem[j - 1] = L.elem[j];
--L.length;
return OK;
}//ListDelete_Sq
//顺序表合并函数1(直接合并)
void MergeLest_Sq1(Sqlist La, Sqlist Lb, Sqlist& Lc) {
//La,Lb两个表都是递增表,Lc为构建的新表
ElemType* pa, * pb, * pc,*pa_last,*pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = La.length + Lb.length;//Lc当前需要分配的存储容量
Lc.length= La.length + Lb.length;//表Lc的长度
pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));//给表Lc分配所需内存.
if (!Lc.elem)exit(OVERFLOW);//分配内存失败
pa_last = La.elem + La.length - 1;//表La的最后一个地址
pb_last = Lb.elem + Lb.length - 1;//表Lb的最后一个地址
while (pa <= pa_last)*pc++ = *pa++;//在表Lc中增加表La
while (pb <= pa_last)*pc++ = *pb++;//在表Lc中接着增加Lb
}//MergeLest_Sq1
//顺序表合并函数2(升序合并)
void MergeLest_Sq2(Sqlist La, Sqlist Lb, Sqlist& Lc) {
//La,Lb两个表都是递增表,Lc为构建的新表
ElemType* pa, * pb, * pc, * pa_last, * pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = La.length + Lb.length;//Lc当前需要分配的存储容量
Lc.length = La.length + Lb.length;//表Lc的长度
pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));//给表Lc分配所需内存.
if (!Lc.elem)exit(OVERFLOW);//分配内存失败
pa_last = La.elem + La.length - 1;//表La的最后一个地址
pb_last = Lb.elem + Lb.length - 1;//表Lb的最后一个地址
while (pa <= pa_last && pb <= pb_last) {
if (*pa < *pb)*pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last)*pc++ = *pa++;//在表Lc中增加表La
while (pb <= pa_last)*pc++ = *pb++;//在表Lc中接着增加Lb
}//MergeLest_Sq2
*/