线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

实现工具:dev
顺序表功能:
创建一个空的线性表;
在线性表中插入元素;
在线性表中删除元素;
在线性表中查找元素;
代码:(详解请看注释)

#include<stdio.h>
#include<stdlib.h>//动态分配需要的头文件
#define LIST_INIT_SIZE 100
#define LISTNCREAMENT 10
#define OK 1
#define FALSE 0
#define OVERFLOW 2//溢出 
typedef float ElemType;
typedef int Status;
//线性表动态分配内存的顺序存储结构 
typedef struct
{
	ElemType *elem;//存储的基地址 
	int length;//当前长度 
	int listsize;//当前分配的最大容量 
}SqList;
ElemType * p,* q,e;//注意,e要定义为全局变量 
ElemType * newbase;//若存储不够的话,新分配的基地址 
//创建线性表 (空表) 
Status InitList_Sq(SqList &L)
{
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//为顺序表分配一片连续的存储空间 
	L.length=0;//初始化当前长度 
	L.listsize=LIST_INIT_SIZE;//初始化当前最大容量 
	return OK; 
}
//线性表的插入
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
	if(i<1||i>L.length+1)//注意长度+1 
	{
		return FALSE;
	}
	if(L.length>L.listsize)//若长度超过了当前最大容量,则需要新开辟空间 
	{
		//realloc的使用 
		newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTNCREAMENT)*sizeof(ElemType));
		if(!newbase)//判断新空间是否开辟 
		{
			exit(OVERFLOW);
		}
		L.elem=newbase;//将结构体中的数据更新 
		L.listsize+=LISTNCREAMENT;
	}
	q=&(L.elem[i-1]);//p指向的是第i个元素 
	for(p=&L.elem[L.length-1];p>=q;--p)
	//插入时,需要从最后一个元素开始往后挪
	//p指向的是数据中的最后一个元素,其中第i个元素也要进行挪位 
	{
		*(p+1)=*p; 
	}
	*q=e;//将插入的元素e插入进去 
	++L.length;//顺序表的长度加一  
	return OK;
 } 
//删除操作
ElemType ListDelete_Sq(SqList &L,int i, ElemType &e)
{
	if(i<1||i>L.length)//注意边界 
	{
		return FALSE;
	}
	p=&L.elem[i-1];//p是要删除的第i个元素 
	e=*p;//将删除的元素赋值给e 
	q=L.elem+L.length-1;//表尾元素的位置 
	for(++p;p<=q;++p)//将元素往前移动 
	{
		*(p-1)=*p;
	}
	--L.length;//长度减一 
	return e; 
 } 
//查找
int LocateElem_Sq(SqList L,ElemType e)
{
	int i;
	i=1;
	while(i<=L.length&&L.elem[i-1]!=e)
	{
		++i;
	}
	if(i<L.length)
	{
		return i;
	}
	else return FALSE;
 } 
int main()
{
	Status i,j;
	SqList La;
	//创建空表 
	InitList_Sq(La);
	//将表赋值为1 2 3 4 5 
	for(i=1;i<=5;i++)
	{
		ListInsert_Sq(La,i,i);
	}
	//输出顺序表 
	for(i=0;i<5;i++)
	{
		printf("%f ",La.elem[i]);
	}
	printf("\n");
	//在顺序表的第二个位置插入11 
	ListInsert_Sq(La,2,11);
	//输出新表 
	for(i=0;i<La.length;i++)
	{
		printf("%f ",La.elem[i]);
	}
	printf("\n");
	//删除顺序表的第4个元素 
	ListDelete_Sq(La,4,e);
	for(i=0;i<La.length;i++)
	{
		printf("%f ",La.elem[i]);
	}
	printf("\n");
	//查找顺序表中元素11,并返回其位置 
	j=LocateElem_Sq(La,11);
	printf("%d ",j);
	return 0;
}

控制台输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值