顺序表的基本运算

#include<malloc.h>   // malloc()等
#include<stdio.h>    // NULL, printf()等
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status;    // Status是函数的类型,其值是函数结果状态代码,如OK等
//-------- 线性表的动态分配顺序存储结构 -----------
#define LIST_INIT_SIZE 100   //顺序表存储空间初始尺寸
#define LIST_INCREMENT 10  //顺序表存储空间分配增量
typedef int ElemType;          //顺序表元素的数据类型为整数
//存储结构定义:顺序表
typedef struct {
	ElemType *elem;  //存储表元素的数组指针
	int length;        //表长度
	int listsize;       //数组尺寸
} SqList;

初始化空顺序表L:

//运算1:初始化空顺序表L
Status InitList(SqList &L) {// 算法2.3
  L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //分配数组空间
  if (!L.elem) return OVERFLOW; //若分配失败,函数结束(返回值=-2)
  L.length=0;  //表长度初值为0
  L.listsize=LIST_INIT_SIZE; //表空间初始尺寸
return OK;
}
销毁顺序表L:

//运算2:销毁顺序表L
void DestroyList(SqList &L) { 
  free(L.elem); //释放表的数组存储空间
 L.elem=NULL; //清空指向数组的指针及表示表长度、数组尺寸的指示变量
 L.length=0;
 L.listsize=0;
}
在顺序表L中第i个位置前插入新元素e:

//运算3:在顺序表L中第i个位置前插入新元素e
Status ListInsert(SqList &L,int i,ElemType e) { //算法2.4
ElemType *newbase;
  if(i<1||i>L.length+1) 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; // 增加存储容量
}
删除L的第i个元素,并用e返回其值:

//运算4:删除L的第i个元素,并用e返回其值
Status ListDelete(SqList &L,int i,ElemType &e)  {//算法2.5
	if(i<1||i>L.length)  return ERROR; //若i值不合法,则退出函数
e=L.elem[i-1];
	for(int j=i-1; j<L.length -1; j++) L.elem[j]=L.elem[j+1];
	L.length--;   // 表长减1
	return OK;
}
返回L中数据元素个数:

//运算5:返回L中数据元素个数
int ListLength(SqList L)  { 
return L.length;
}
用e返回L中第i个元素的值:

//运算6:用e返回L中第i个元素的值
Status GetElem(SqList L,int i,ElemType &e) {
 if(i<1||i>L.length) return ERROR;
 e=L.elem[i-1];
 return OK;
}
查找指定值元素位置:

//运算7:查找指定值元素位置
Status Equal(ElemType t1,ElemType t2)  
{  
    if(t1==t2)  
        return OK;  
    return ERROR;  
}  
  
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType t1,ElemType t2))  
{  
    for(int i=1;i!=L.length+1;i++)  
        if((*compare)(L.elem[i-1],e))//函数指针的用法  
            return i;  
    return 0;  
}  
其他:

//--- 插入新元素 ---
for(int j=L.length-1; j>=i-1; j--) L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;

  L.length++;  //表长度增1
  return OK;
}

//辅助函数:显示顺序表元素
//写法1:
void print(SqList L) {
	for(int i=1; i<=L.length; i++) {		
		printf("%5d", L.elem[i-1]);
	}
	printf("\n");
}
//写法2:
//print中不能直接访问顺序表的内部结构,只能通过运算ListLength、GetElem间接访问;
void print(SqList L) 
{
	ElemType e;
	int x=ListLength(L);
	for(int i=1; i<=x; i++) 
	{	
	  	GetElem(L,i,e);
		printf("%5d",e);
	}
	printf("\n");
}

Main函数:

void main(void) {
SqList L; //声明顺序表变量
	InitList(L);
	//****具体操作****
	print(L);
	DestroyList(L);
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值