您的位置:首页 > 编程语言 > C语言/C++

C语言实现顺序线性表的表示、插入、删除

2017-11-14 13:29 316 查看
     在线性表中,数据元素在逻辑上具有一对一的关系,线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表的数据元素。我们可以这样理解,线性表的顺序存储结构其实是用计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。因为内存地址是连续的,我们恰好可以通过这种特点来表示线性表,这样顺序线性表的特点是:数据元素不仅逻辑上相邻,在物理地址上也是相邻的。同样我们只要知道了存储顺序线性表的基地址,就可以随机的存取数据元素,所以顺序线性表是一种随机存取的存储结构。而程序设计语言中的数组也满足随机存取的特性,所以可以用C语言中的数组来描述线性表的顺序存储结构。

应当要注意的是,线性表是可变长的,所以得用动态分配数组去表示。我们可以通过结构体来定义顺序线性表的存储结构,定义一个数组指针elem来指向动态分配内存函数malloc所分配的地址,用一个整数length来记录当前线性表的长度,除此之外,还要定义一个保存顺序表当前分配的存储空间大小的变量listsize,当因插入元素空间不足时,可以进行再分配。以下是定义的具体代码:

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2  //溢出
typedef int Status;
/*
*使用c语言中的一维数组来描述顺序线性表
**/
#define LIST_INIT_SIZE 5 //线性表存储空间的初始分配量
#define LISTINCREMENT  10    //线性表存储空间的分配增量

/*
*定义线性表的结构
**/
typedef struct{
int * elem;    //存储空间基地址(数组指针,指向预分配数组的首地址)
int length;    //当前线性表的长度
int listsize;  //当前分配的存储容量
}SqList;


以下是构造一个空的线性表

/*
*func:InitList()
*desc:构造一个空的线性表L
*@param:&L SqList
*@return OK int
*/
Status InitList(SqList &L){
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); //动态开辟一维数组
if(!L.elem) exit(OVERFLOW);  //存储分配失败
L.length=0;     //空表长度初始化为0
L.listsize=LIST_INIT_SIZE;  //存储的初始容量
return OK;
}

在顺序线性表L中第i个位置插入新的元素e

/*
*fun:ListInsert_Sq()
*desc:在顺序线性表L中第i个位置之前插入新的元素e
*@param:&L SqList
*@param: i int
*@param: e int
*@ret OK int
*/
Status ListInsert_Sq(SqList &L,int i,int e){
//i需要满足1<=i<=ListLength_Sq(L)+1
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize){      //当前存储空间已满,增加分配
int *newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase) exit(OVERFLOW); //存储分配失败
L.elem=newbase;              //新地址
L.listsize+=LISTINCREMENT;   //增加存储容量
}
int *q=&(L.elem[i-1]);  //q为插入的位置(注意数组的下标是从0开始计数)
for(int *p=&(L.elem[L.length-1]);p>=q;p--) *(p+1)=*p; //插入位置及之后的元素后移
*q=e;                  //插入e
L.length+=1;           //表长增1
return OK;
}


在顺序线性表L中删除第i个元素,并用e返回其值

/*
*fun:ListDelete_Sq()
*desc:在顺序线性表L中删除第i个元素,并用e值返回
*@param:&L SqList
*@param: i int
*@param: e int
*@ret OK int
*/
Status ListDelete_Sq(SqList &L,int i,int &e){
//i的合法性为1<=i<=ListLength_Sq(L)
if(i<1||i>L.length) return ERROR;
e=L.elem[i-1];        //把被删除的元素赋给e
int *p=&L.elem[i-1];  //指针p为被删除元素的位置
for(int *q=p+1;q<=p+(L.length-i);q++) *(q-1)=*q; //被删除位置之后的元素都往前移
L.length-=1;              //表长减一
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐