📄 sqlist.h
字号:
/***************************************************************************************************
Copyleft!
FileName: Sqlist.h
Author: cjhacker
Version: 1.0
Description: Linear list ADT
Function List:
Status InitList_Sq( SqList &L ); //Initial List
void DestroyList_Sq( SqList &L ); //Destroy List
Status LengthTest( SqList L, int i ); //Test if the value of i is legal
int ListLength( SqList L ); //Retrun the Lengtn of List
Status GetElem( SqList L, int i, ElemType &e ); //Assign ith Element to e
Status ListInsert_Sq( SqList &L, int i, ElemType e ); //Insert
Status ListDelete_Sq( SqList &L, int i, ElemType &e ); //Delete
Status Print( SqList L, int i ); //Print ith Element
***************************************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include "Gdefine.h"
#include "ElemType.h"
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配
#define LIST_INCREMENT 20 //线性表存储空间的分配增量
/*Linear List Structure : Sqlist*/
typedef struct
{
ElemType *elem; //基地址
int length; //目前表长,就像strlen( )函数返回的是字段长度(而非存储长度)
int listsize; //表长
}SqList;
/*Function Declaration*/
Status InitList_Sq( SqList &L ); //Initial List
void DestroyList_Sq( SqList &L ); //Destroy List
Status LengthTest( SqList L, int i ); //Test if the value of i is legal
int ListLength( SqList L ); //Retrun the Lengtn of List
Status GetElem( SqList L, int i, ElemType &e ); //Assign ith Element to e
Status ListInsert_Sq( SqList &L, int i, ElemType e ); //Insert
Status ListDelete_Sq( SqList &L, int i, ElemType &e ); //Delete
Status Print( SqList L, int i ); //Print ith Element
/******************************
参数:线形表结构L
功能:构造一个空的线性表L
返回:分配成功返回OK
分配失败返回OVERFLOW
******************************/
Status InitList_Sq( SqList &L )
{
if ( L.elem != NULL )
{
DestroyList_Sq( L ); //若再次执行本函数时将原来的数组空间释放
}
L.elem = ( ElemType * ) malloc ( LIST_INIT_SIZE * sizeof( ElemType ) );
if ( !L.elem )
{
return OVERFLOW; //存储分配失败
}
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}
/********************
参数:线形表结构L
功能:释放线形表L
********************/
void DestroyList_Sq( SqList &L )
{
ElemType *ptr;
for ( ptr=L.elem; ptr < L.elem + L.listsize; ptr++ )
{
free( L.elem ); //释放顺序表 L 所占存储空间
}
L.elem = 0;
L.listsize = 0;
L.length = 0;
}
/**************************
参数:线形表结构L
功能:测试i值是否合法
返回:合法返回OK
不合法返回ERROR
**************************/
Status LengthTest( SqList L, int i )
{
if ( ( i < 1 ) || ( i > L.length ) ) //i值不合法
{
return ERROR;
}
return OK;
}
/***************************************************
参数:线形表结构L,插入位置i,插入元素e
功能:在顺序线性表L中第i个位置之前插入新的元素e
i的合法值为1≤i≤ListLength_Sq(L)+1
返回:成功返回OK
i值不合法返回ERROR
分配空间失败返回OVERFLOW
***************************************************/
Status ListInsert_Sq( SqList &L, int i, ElemType e )
{
ElemType *newbase, *q, *p;
if ( ERROR == LengthTest( L, i ) )
{
return ERROR; //i值不合法
}
if ( L.length >= L.listsize )
{
/*当前存储空间已满,增加分配*/
newbase = ( ElemType * ) realloc ( L.elem,
( L.listsize + LIST_INCREMENT ) * sizeof( ElemType ) );
if ( !newbase )
{
return OVERFLOW; //存储分配失败
}
L.elem = newbase; //新基址
L.listsize += LIST_INCREMENT; //增加存储容量
}
q = &( L.elem[ i-1 ] ); //q为插入位置
for ( p = &( L.elem[ L.length-1 ] ); p >= q; --p )
{
*(p+1) = *p;
}
*q = e; //插入e
++L.length; //表增长1
return OK;
}
/****************************************************
参数:输入参数:线形表结构L,删除位置i
输出参数:删除元素后值返回给e
功能:在顺序线性表L中删除第i个元素,并用e返回其值
i的合法值为1≤i≤ListLength_Sq(L)
返回:成功返回OK
i值不合法返回ERROR
****************************************************/
Status ListDelete_Sq( SqList &L, int i , ElemType &e )
{
ElemType *q, *p;
if ( ERROR == LengthTest( L, i ) )
{
return ERROR; //i值不合法
}
p = &( L.elem[ i-1 ] ); //p为被删除元素的位置
e = *p;
q = L.elem + L.length - 1; //表尾元素的位置
for ( ++p; p <= q; ++p )
{
*(p-1) = *p; //被删除元素之后的元素左移
}
--L.length; //表长减1
return OK;
}
/*********************************
参数:线形表结构L
功能:返回L中数据元素的个数
*********************************/
int ListLength( SqList L )
{
return L.length;
}
/******************************************
参数:输入参数:线形表结构L,数据位置i
输出参数:返回值赋给e
功能:用e返回L中第i个数据元素的值
返回:无该元素返回ERROR
******************************************/
Status GetElem(SqList L, int i, ElemType &e)
{
if ( ERROR == LengthTest( L, i ) )
{
return ERROR; //i值不合法
}
e = L.elem[ i ];
return OK;
}
/************************************
参数:线形表结构L,数据元素位置i
功能:输出顺序表第i个数据元素
返回:无该元素返回ERROR
************************************/
Status Print( SqList L, int i )
{
if ( ERROR == LengthTest( L, i ) )
{
return ERROR; //i值不合法
}
/*输出项目信息*/
printf( "%-12d %-8d %-4d %-4d %-12s %-4d\n",
( L.elem+i )->school_id,( L.elem+i )->item,
( L.elem+i )->item_Od, ( L.elem+i )->order,
( L.elem+i )->name, ( L.elem+i )->score );
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -