DataStructure----LinerList,线性表C实现

//=============================================================================

//LinerList.h

//=============================================================================

//初始化队列的长度
#define LIST_INIT_SIZE 100
//队列长度不足重新申请空间的默认增长幅度
#define LISTINCREMENT  10
//若干信号量定义
#define TRUE           1
#define FALSE          0
#define OK             1
#define ERROR          0
#define OVERFLOW       'o'
#define OUTB           -2  //越界错误

//状态返回值类型定义
typedef int Status;

//队列元素定义
typedef struct Elemtyp
{
  //不同需要的元素修改此处
 int elem;
}ElemType;
//队列的类型定义
typedef struct Sq
{
  ElemType *head;
  int      length;
  int      listsize;
}Sqlist;
//==============================================================
//函数声明部分:
//==============================================================
//线性表操作的工具函数
//比较函数
Status Compare ( ElemType e1, ElemType e2);
//访问函数
void Visit (Sqlist);
//线性表复制函数,把L1复制到L2中
Status Copy ( Sqlist L1, Sqlist L2);
//线性表的初始化
Status Init_Sq ( Sqlist &L );
//线性表空间的释放
Status Destory_Sq (Sqlist &L );
//线性表的清空
Status Clear_Sq ( Sqlist &L );
//判断是否空表
Status IsEmpty_Sq ( Sqlist L );
//获取当前表长
int    Length_Sq ( Sqlist L );
//获取表中指定元素的值
Status GetElem_Sq ( Sqlist L, int i, ElemType &e );
//确定指定元素在表当中的位置
int    LocateElem_Sq ( Sqlist L, ElemType e);
//返回指定位置元素的前驱
Status PriorElem ( Sqlist L, ElemType cur_e, ElemType &pri_e);
//返回指定位置元素的后继
Status NextElem ( Sqlist L, ElemType cur_e, ElemType &nex_e);
//对线性表的插入操作
Status ListInsert ( Sqlist &L, ElemType e, int pos);
//对线性表的删除操作
Status ListDelete ( Sqlist &L, ElemType &e, int pos);
//对线性表的遍历
Status Traverse ( Sqlist L);

//===============================================================================

//LinerList.cpp

//===============================================================================

//线性表加载文件
#include "stdafx.h"
#include "LinerList.h" //线性表定义文件
#include <malloc.h>


//函数实现部分
Status Init_Sq ( Sqlist &L)
{
   L.head = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
   if ( !L.head) return OVERFLOW;
   L.length = 0;
   L.listsize = LIST_INIT_SIZE;
  
   return OK;
}//Init_Sq
Status Destory_Sq ( Sqlist &L)
{
   if ( !L.head) return ERROR;
   free(&L);
   L.head=NULL;
   return OK;
}//Destory_Sq
Status Clear_Sq ( Sqlist &L)
{
 int i;//内循环计数
 if ( !L.head) return ERROR;
 for(i = 0; i<L.length; i++)
  L.head[i].elem = 0;
 return OK;
}//Clear_Sq
Status IsEmpty_Sq ( Sqlist L)
{
 if( !L.head) return TRUE;
 return FALSE;
}//IsEmpty_Sq
int Length_Sq ( Sqlist L)
{
 return L.length;
}//Length_Sq
Status GetElme_Sq ( Sqlist L, int pos, ElemType &e)
{
    if( !L.head) return ERROR;
  else if( pos < 0 || pos >= L.length)
   return OVERFLOW;
 e = L.head[pos-1];
 return OK;
}//GetElem_Sq
Status Compare ( ElemType e1, ElemType e2)
{
 if( e1.elem == e2.elem)
  return TRUE;
 return FALSE;
}//Compare
int    LocateElem_Sq ( Sqlist L, ElemType e)
{
 int i=0;//计数并记录位置
 Status s;//判断是否找到
    if ( !L.head) return ERROR; 
 for ( ; i < L.length; i++)
 {
  s = Compare ( L.head [ i - 1 ], L.head [ i - 2] );
  if ( s) break;
 }
 if( s) return i;
 return -1;
}//LocateElem_Sq
Status PriorElem ( Sqlist L, ElemType cur_e, ElemType &pri_e)
{
 int _pos = 0;
 _pos = LocateElem_Sq ( L, cur_e);
 if ( _pos == -1) return ERROR;
   else if ( _pos == 0 ) return OUTB;
 pri_e = L.head[ _pos-1 ];
 return OK;
}//PriorElem
Status NextElem ( Sqlist L, ElemType cur_e, ElemType &nex_e)
{
 int _pos = 0;
 _pos = LocateElem_Sq ( L, cur_e);
 if ( _pos == -1) return ERROR;
  else if( _pos == L.length-1 ) return OUTB;
 nex_e = L.head [ _pos+1 ];
 return OK;
}//NextElem
Status Copy ( Sqlist L1, Sqlist &L2)
{
  if ( L1.head || L2.head) return ERROR;
    else if ( L1.length <= L2.length ) return ERROR;
  for ( int i = 0; i < L1.length; i++)
   L2.head [ i ] = L1.head [ i ];
  return OK;
}//Copy
Status ListInsert ( Sqlist &L, ElemType e, int pos)
{
 ElemType *newbase;
 if ( !L.head) return ERROR;
  else if ( pos < 1 || pos > L.length+1 ) return OUTB;
 if ( L.length == L.listsize)
 {
   newbase = ( ElemType *)realloc( L.head, ( L.length+LISTINCREMENT)
   * sizeof ( ElemType) );
         L.head = newbase;
 }
 for (int i = L.length; i >= pos-1; --i)  
   L.head [ i + 1 ] = L.head [ i ];

    L.head [ i ] = e;
 L.length++;
 return OK;
}//ListInsert
Status ListDelete ( Sqlist &L, ElemType &e, int pos)
{
 if( !L.head) return ERROR;
   else if ( pos < 0 || pos >= L.length ) return OUTB;
 for ( int i = pos-1; i < L.length-1; i++)
  L.head [ i ] = L.head [ i+1 ];
 L.length--;
 return OK;
}//ListDelete
void Visit ( Sqlist L)
{
  for ( int i = 0; i < L.length-1; i++)
   printf ( " %d /n", L.head [ i ].elem);
}//Visit
Status Traverse ( Sqlist L)
{
 if ( !L.head) return ERROR;
 Visit( L);
 return OK;
}//Traverse

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值