I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

/*******************************************************************************
/* <PRE>
/* 版权所有    : -
/* 模块名      : 线性表
/* 文件名      : sqlist.cpp
/* 功能描述    : 线性表的顺序表示与实现 
/* 作者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 备注        : -
/* -----------------------------------------------------------------------------
/* 修改记录    :
/* 日 期        版本     修改人        修改内容
/* 2011/01/01   1.0      <xxx>         创建
/* </PRE>
******************************************************************************
*/
#include 
<stdio.h>
#include 
<stdlib.h>

/******************************************************************************
/* 数据类型和常量定义
/*****************************************************************************
*/
#define TURE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define OVERFLOW    -2

typedef 
int Status;
typedef 
int ElemType;

/******************************************************************************
/* 数据结构声明
/*****************************************************************************
*/
/* 线性表的动态分配顺序存储结构 */
#define LIST_INIT_SIZE 2   /* 线性存储空间的初始分配量 */
#define LISTINCREMENT  1   /* 线性存储空间的分配增量 */

typedef 
struct {
    ElemType 
*elem;        /* 存储空间基址 */
    
int length;            /* 当前长度 */
    
int listsize;          /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
} SqList;


/*******************************************************************************
/* <FUNC>
/* 函数名   : InitList_Sq
/* 功能     : 构造空线性表
/* 参数     : -
/* 返回值   : -
/* 备注     : 构造一个空的线性表
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InitList_Sq(SqList 
&L) {
    L.elem 
= (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    
if (!L.elem) exit(OVERFLOW);
    L.length 
= 0;                //空表长度为0
    L.listsize = LIST_INIT_SIZE; //初始存储容量
    return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : ListInsert_Sq
/* 功能     : 在线性表中插入元素
/* 参数     : -
/* 返回值   : -
/* 备注     : 在顺序线性表L中第i个位置之前插入新的元素e, i的合法值为 1<= i <= ListLength_Sq(L) + 1
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status ListInsert_Sq(SqList 
&L, int i, ElemType e) {
    ElemType 
*newbase = NULL;
    ElemType 
*= NULL;
    ElemType 
*= NULL;
    
if (i <1 || i >L.length + 1return ERROR;
    
if (L.length >= L.listsize) {
        newbase 
= (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
        
if (!newbase) exit(OVERFLOW);
        L.elem 
= newbase;
        L.listsize 
+= LISTINCREMENT;
    }
    q 
= &(L.elem[i - 1]);
    
for (p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1= *p;
    
    
*= e;
    
++L.length;
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : ListDelete_Sq
/* 功能     : 删除线性表中的元素
/* 参数     : -
/* 返回值   : -
/* 备注     : 在顺序线性表L中删除第i个元素, 并用e返回其值, i的合法值为 1<= i <= ListLength_Sq(L)
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status ListDelete_Sq(SqList 
&L, int i, ElemType &e) {
    ElemType 
*= NULL;
    ElemType 
*= NULL;
    
if ((i < 1|| (i > L.length)) return ERROR;
    p 
= &(L.elem[i - 1]);
    e 
= *p;
    q 
= L.elem + L.length - 1;    //表尾元素位置
    for (++p; p <= q; ++p) *(p - 1= *p; //被删除元素之后的元素左移
    --L.length;
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : ListTraverse
/* 功能     : 遍历线性表
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status ListTraverse_Sq(SqList 
&L, Status (*Visit)(ElemType)) {
    ElemType 
*= NULL;
    ElemType 
*= NULL;
    
if (L.length == 0return ERROR;
    p 
= &(L.elem[0]);
    q 
= L.elem + L.length - 1;    //表尾元素位置
    for (; p <= q; ++p) Visit(*p);
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : Visit
/* 功能     : 访问线性表中的元素
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status Visit(ElemType e)
{
    printf(
"%d ", e);
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : main
/* 功能     : 测试函数
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void main()
{
    SqList L;  InitList_Sq(L); ElemType e;

    
//遍历空表
    if (OK == ListTraverse_Sq(L, Visit)) printf("visit succeed!\n");

    
//插入元素
    if (OK == ListInsert_Sq(L, 110)) printf("insert succeed!\n");
    
if (OK == ListInsert_Sq(L, 220)) printf("insert succeed!\n");
    
if (OK == ListInsert_Sq(L, 130)) printf("insert succeed!\n");
    
if (OK == ListInsert_Sq(L, 240)) printf("insert succeed!\n");
    
if (OK == ListInsert_Sq(L, 150)) printf("insert succeed!\n");
    
    
//遍历非空表
    if (OK == ListTraverse_Sq(L, Visit)) printf("visit succeed!\n");

    
//删除元素
    if (OK == ListDelete_Sq(L, 1, e)) printf("delete %d succeed!\n", e);
    
if (OK == ListDelete_Sq(L, 3, e)) printf("delete %d succeed!\n", e);
    
if (OK == ListDelete_Sq(L, 2, e)) printf("delete %d succeed!\n", e);

    
//遍历非空表
    if (OK == ListTraverse_Sq(L, Visit)) printf("visit succeed!\n");
}

 

posted on 2011-04-05 13:44  jcsu  阅读(543)  评论(0编辑  收藏  举报