C语言实现顺序线性表的表示、插入、删除
2017-11-14 13:29
316 查看
在线性表中,数据元素在逻辑上具有一对一的关系,线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表的数据元素。我们可以这样理解,线性表的顺序存储结构其实是用计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。因为内存地址是连续的,我们恰好可以通过这种特点来表示线性表,这样顺序线性表的特点是:数据元素不仅逻辑上相邻,在物理地址上也是相邻的。同样我们只要知道了存储顺序线性表的基地址,就可以随机的存取数据元素,所以顺序线性表是一种随机存取的存储结构。而程序设计语言中的数组也满足随机存取的特性,所以可以用C语言中的数组来描述线性表的顺序存储结构。
应当要注意的是,线性表是可变长的,所以得用动态分配数组去表示。我们可以通过结构体来定义顺序线性表的存储结构,定义一个数组指针elem来指向动态分配内存函数malloc所分配的地址,用一个整数length来记录当前线性表的长度,除此之外,还要定义一个保存顺序表当前分配的存储空间大小的变量listsize,当因插入元素空间不足时,可以进行再分配。以下是定义的具体代码:
以下是构造一个空的线性表
在顺序线性表L中第i个位置插入新的元素e
在顺序线性表L中删除第i个元素,并用e返回其值
应当要注意的是,线性表是可变长的,所以得用动态分配数组去表示。我们可以通过结构体来定义顺序线性表的存储结构,定义一个数组指针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; }
相关文章推荐
- C语言:实现线性表基本表示(数组元素的删除,插入,合并)
- C语言实现线性表的插入和删除操作
- 线性表的添加、删除、插入功能的顺序实现
- C语言线性表的顺序表示与实现实例详解
- c语言实现顺序表的插入,删除和求给定元素在表中的位序等运算
- 线性表的顺序表示和实现(C语言描述)
- 今天学了线性表顺序表示,自己写了一段代码!实现了 插入和删除!这也是第一次写博客
- (1)顺序表的操作 ① 输入一组整型元素序列,建立线性表的顺序存储结构。 ② 实现该线性表的遍历。 ③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。 ④ 在该顺序表中删除或插入指
- 线性表的顺序表示和实现(C语言)
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- 线性表的顺序表示(C语言实现)
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- 【数据结构】顺序线性表的插入、删除、合并实现
- 线性表的输入输出插入删除查找(顺序表示)
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- 对线性表理解以及C语言实现链表的插入删除等操作。
- C语言实现顺序表的初始化,插入,删除,查找
- 线性表的顺序表示和实现基本操作之插入元素
- 线性表之<顺序表sqlist>的储存及插入、删除-C代码实现
- 数据结构:线性表(顺序存储)顺序表类(实现顺序表的创建,输出,插入,删除功能)