顺序表的基本运算

来源:互联网 发布:mac死机如何强制重启 编辑:程序博客网 时间:2024/05/05 14:45
#include<malloc.h>   // malloc()等#include<stdio.h>    // NULL, printf()等// 函数结果状态代码#define TRUE 1#define FALSE 0#define OVERFLOW -2#define OK 1#define ERROR 0typedef 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:初始化空顺序表LStatus 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:销毁顺序表Lvoid DestroyList(SqList &L) {   free(L.elem); //释放表的数组存储空间 L.elem=NULL; //清空指向数组的指针及表示表长度、数组尺寸的指示变量 L.length=0; L.listsize=0;}
在顺序表L中第i个位置前插入新元素e:

//运算3:在顺序表L中第i个位置前插入新元素eStatus ListInsert(SqList &L,int i,ElemType e) { //算法2.4ElemType *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.5if(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--;   // 表长减1return 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
原创粉丝点击