#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100//图书可能达到的最大长度
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status 是函数的类型,其值是函数结果状态码
typedef char ElemType;
typedef struct{//图书信息定义
char num[20];//图书编号
char name[10];//图书名
float price;//图书价格
}Book;
typedef struct{
Book *elem;//存储空间的基地址 ElemType data[] 数组动态分配
int length; //图书表中当前图书个数
}SqList;//图书表的顺序存储结构类型为 SqList
//线性表L的初始化
Status InitList_Sq(SqList &L) {//参数为引用类型 构造一个空的顺序表
// L.elem=(Book*)malloc(sizeof(Book)*MAXSIZE);//为顺序表分配空间
L.elem=new Book[MAXSIZE];
if(!L.elem){
exit(OVERFLOW);
}
L.length=0;
return OK;
}
//销毁线性表
void DestroyList(SqList &L){
if(L.elem){
delete(L.elem);//释放存储空间
}
}
//清空线性表
void ClearList(SqList &L) {
L.length=0;
}
//求线性表的长度
int GetLength(SqList L) {
return L.length;
}
//判断线性表是否为空
int IsEmpty(SqList L) {
if(L.length==0) return 1;
else return 0;
}
//得到第i个元素的值
int GetElem(SqList L,int i,Book &e){//Book &e:ElemType &e
if(i<1||i>L.length){
return OVERFLOW;
}
else{
e=L.elem[i-1];
return OK;
}
}
//按值查找
int LocateElemt(SqList L,Book e){
for(int i=0;i<L.length;i++){
if(e==L.elem[i])
return i+1;//查找成功返回元素e的序号
}
return 0;//查找失败返回0
// 平均查找长度ASL(n+1)/2
/*也可以用以下代码实现
int i=0;
while(i<L.length&&L.elem[i]!=e){
i++;
}
if(i<L.length) return i+1;
else return 0;*/
}
//顺序表的插入
Status ListInsert_Sq(SqList &L,int i,Book e) {
if(i<1||i>L.length+1) return ERROR;
if(L.length==MAXSIZE) return ERROR;
for(j=L.length-1;j>=i-1;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
L.length++;
return OK;
/* 平均移动次数n/2
可插入n+1个位置,需移动次数(0,1,2....n)
*/
}
//顺序表的删除
Status ListDelete_Sq(SqList &L,int i) {
if(i<1||i>L.length) return ERROR;
for(j=i;j<=L.length-1;j++){
L.elem[j-1]=L.elem[j];
}
L.length--;
return OK;
/*平均移动次数 (n-1)/2 */
}
main(){
SqList L;
int a= InitList_Sq(L);
printf("%d",a);
/*
随机存取法
时间复杂度:
插入、删除、查找:平均时间复杂度O(n)
空间复杂度:
O(1):没有占用辅助空间
优点:
存储密度大(节点本身所占存储量/结点结构所占存储量)
可以随机存取表中任一元素
缺点:
在插入、删除时,需要移动大量元素
属于静态存储形式,数据元素的个数不能自由扩充
*/
}
线性表-顺序表上基本操作的实现
最新推荐文章于 2024-11-03 22:57:39 发布