顺序线性表的存储与实现(C语言版)

本文详细介绍了一种基于C语言的线性表顺序存储结构的实现方法,包括初始化、销毁、清空、判断是否为空、获取长度等基本操作,以及插入、删除、查找等高级操作。通过具体代码示例,展示了如何进行线性表的动态内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码实现

#include<stdio.h>//printf(),scanf()
#include<stdlib.h>//exit(),malloc()
//函数结果状态代码 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status,ElemType均是函数的类型 
typedef int Status;
typedef int ElemType; 
//线性表动态分配顺序存储结构 
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef struct {	
	ElemType *elem;//存储空间基址 
	int length;//当前长度
	int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位) 
}SqList;
//操作结果:构造一个空的线性表L 
Status InitList_Sq(SqList &L){
	L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);//存储分配失败
	L.length=0;//空表长度为0
	L.listsize=LIST_INIT_SIZE;//初始存储容量
	return OK; 
}
//初始条件:线性表L已存在
//操作结果:摧毁线性表L 
Status DestroyList_Sq(SqList &L){
	if(L.elem!=NULL){
		free(L.elem);
		L.length=0;
		L.listsize=0;
		printf("摧毁顺序线性表!\n");
	}
	return 0;
} 
//初始条件:线性表L已存在
//操作结果:将L重置为空表 
Status ClearList_Sq(SqList &L){
	if(L.elem!=NULL){
		L.length=0;
		printf("置为空表!\n");
	}
}
//初始条件:线性表L已存在
//操作结果:若L为空表,则返回TRUE,否则返回FALSE 
Status ListEmpty_Sq(SqList L){
	if(L.elem!=NULL&&L.length==0){
		printf("空表!\n");
		return TRUE;
	}
	else{
		printf("非空表!\n");
		return FALSE;
	}
}
//初始条件:线性表L已存在
//操作结果:返回L中数据元素个数 
int ListLength_Sq(SqList L){
	if(L.elem!=NULL)
		return L.length;
	else
		return ERROR;
}
//初始条件:线性单链表已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值 
Status GetElem_Sq(SqList L,int i,ElemType &e){
	if(ListEmpty_Sq(L))
		return ERROR;
	if(i<1||i>L.length){
		printf("不存在第%d个元素!\n",i);
		return ERROR;
	}
	e=L.elem[i-1];
	return e;
}
Status compare(ElemType a,ElemType b){
	if(a==b)
		return TRUE;
	return FALSE;
}
//初始条件:线性表L已存在
//操作结果:返回L中第1个与e满足关系compare{}的数据元素的位序,若这样的数据元素不存在,则返回值为0  
int LocateElem_Sq(SqList L,ElemType e,Status (*compare)(ElemType,ElemType)){
	int i=1;//i的初值为第1个元素的位序 
	ElemType *p=L.elem; //p的初值为第1个元素的存储位置 
	while(i<=L.length&&!(*compare)(*p++,e))++i;
	if(i<=L.length)return i;
	else return 0;
} 
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义 
int PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e){
	int i=2;
	while(i<=L.length){
		if(cur_e==L.elem[i-1]);{
			pre_e=L.elem[i-2];
			return OK;
		}
		i++;
	}
	return FALSE;
}
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义 
int NextElem_Sq(SqList L,ElemType cur_e,ElemType &next_e){
	int i=1;
	while(i<L.length){
		if(cur_e==L.elem[i-1]);{
			next_e=L.elem[i];
			return OK;
		}
		i++;
	}
	return FALSE;
}
//初始条件:线性表L已存在,1<=i<=listlength(L)+1
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 
Status  ListInsert_Sq(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1) return ERROR;//i值不合法
	if(L.length>=L.listsize){//当前存储空间已满,增加分配 
		ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)exit(OVERFLOW);//存储分配失败 
		L.elem=newbase;//新基址 
		L.listsize+=LISTINCREMENT;//增加存储容量 
	}
	ElemType *q=&(L.elem[i-1]);//q为插入位置
	for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p)
		*(p+1)=*p;//插入位置及之后的元素右移
		*q=e;//插入e
		++L.length;//表长增1 
	return OK;
}
//初始条件:线性表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 
Status ListDelete_Sq(SqList &L,int i,ElemType &e){
	if(i<1||i>L.length)return ERROR;//i值不合法 
	ElemType *p=&(L.elem[i-1]);//p为被删除元素的位置 
	e=*p;//被删除元素的值赋给e 
	ElemType *q=L.elem+L.length-1;//表尾元素的位置 
	for(++p;p<=q;++p)
		*(p-1)=*p;//被删除元素之后的元素左移 
	--L.length;
	return OK; 
}
Status visit(ElemType e){
	printf("%d ",e);
	return true;
}
//初始条件:线性表L已存在
//操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败 
Status ListTraverse_Sq(SqList L,Status (*visit)(ElemType)){
	int i=1;
	ElemType *p=L.elem;
	while(i<=L.length&&(*visit)(*p++))++i;
	return OK;
}
int main(){
	SqList  L;
	ElemType e,pre_e,next_e;
	InitList_Sq(L);
	ListInsert_Sq(L,1,3);
	ListInsert_Sq(L,2,7);
	ListInsert_Sq(L,3,9);
	ListInsert_Sq(L,4,1);
	ListInsert_Sq(L,5,44);
	ListInsert_Sq(L,6,15);
	ListTraverse_Sq(L,visit);
	printf("\n");
	printf("List length is %d\n",ListLength_Sq(L));
	printf("第5个数为: %d\n",GetElem_Sq(L,5,e));
	e=15;
	printf("15所在的位置为: %d\n",LocateElem_Sq(L,15,compare));
	PriorElem_Sq(L,e,pre_e);
	NextElem_Sq(L,e,next_e);	
	printf("e的前驱为: %d,  后继为: %d\n",pre_e,next_e);
	ListDelete_Sq(L,3,e);
	printf("所删除的值为: %d\n",e);
	printf("遍历: ");
	ListTraverse_Sq(L,visit);
	printf("\n");
	ListEmpty_Sq(L);
	ClearList_Sq(L);
	ListEmpty_Sq(L);
	DestroyList_Sq(L);
	return 0;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值