⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlist.h

📁 这是我的数据结构作业<运动会分数统计系统>的代码,可读性很好.大家可以做为参考.cjhacker.
💻 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 + -