线性表的顺序存储实现(数组)

数据对象集:线性表是n(\geqslant 0)个元素构成的有序序列(a_{1},a_{2},\cdots ,a_{n})

操作集:线性表L\in List,整数i表示位置,元素X\in ElementType

线性表主要操作如下:

List MakeEmpty(); //初始化一个空线性表
ElementType FinKth(int K,List PtrL);//根据位序K,返回相应元素(按序号查找)
int Find(ElementType X,List PtrL,int Pst[]);//在线性表中查找X的位置(按值查找)
void insert(ElementType X,int i,List PtrL);//在位序i前插入一个新元素X
void Delete(int i,List PtrL);//删除指定位序的元素
int Length(List PtrL); //返回线性表L的长度

1.初始化

/*初始化
 *实现功能:建立空的线性表
 *传入形参:无
 *返回值:线性表指针  
*/
List MakeEmpty() 
{
	List PtrL;
	PtrL = (List)malloc(sizeof(LNode));
	PtrL->Last = -1;//表示线性表中没有元素 
	return PtrL;
}

2.根据位序,查找对应元素

/*按位序查找 
 *实现功能:根据位序K,返回相应元素
 *传入形参:位序 K,线性表指针 L 
 *返回值:与K相对应的元素 
*/ 
ElementType FinKth(int K,List PtrL)
{
	if(K > List->Last+1 || K < 0){
		printf("该位置无元素!");
	}
	
	return PtrL->Data[K-1];
 }

3.给出一个数,查找在数组中的位置

/*按值查找 
 *实现功能:在线性表中查找X出现的位置 
 *传入形参:要查找的数 X,指向线性表的指针 L,位置数组指针 Pst 
 *返回值:无 
*/
void Find(ElementType X,List PtrL,int* Pst)
{
	int p;
	int i = 0;
	
	for(p = 0; p <= PtrL->Last; p++){
		if(PtrL->Data[p] == X){
			Pst[i+1] = p;
			i++;
		}
	} 
	Pst[0] = i; //Pst的第一个位置用来存储该数出现的次数 
	
	return;
 }

       将一个位置表(Pst)的表头传入,将该数出现的次数存在第一个空间Pst[0]中,将具体出现的位置分别存入随后的空间Pst[i]中。这样做,可以直接对主函数中的Pst数组进行赋值,避免了c语言只能返回一个值的情况。

4.在指定的位置前插入一个数

 /*插入
  *实现功能:在位序i(1<= i <= N+1)前插入一个值为X的新元素
  *传入形参:准备插入的数 X,插入位置 i,线性表指针 L 
  *返回值:无 
 */
void insert(ElementType X,int i,List PtrL)
{
	int j;
	 
	if(PtrL->Last == MAXSIZE -1){		//表空间已满不能插入 
		printf("表满");
		return; 
	} 
	
	//检查插入位置的合法性 
	if(i <= 1 || i > PtrL->Last+2){		//当 i=0时,就人直观观察来说,是没有第0个元素的
		printf("插入位置不合法");	//当 i=Last + 1时,将插入的数放于最后一个数前.
		return;				//当 i= Last + 2,即将插入的数放于表末尾,这是可行的 
	}
	
	for(j = PtrL->Last; j >= i-1; j--)
		PtrL->Data[j+1] = PtrL->Data[j];    //将表中i后的数,逐个从后往前向后挪,以空出插入位置。 
	PtrL->Data[i-1] = X;
	PtrL->Last++;
	return;
 }
	PtrL->Last++;
	return;
 }

5.删除指定位序上的数

 /*删除
  *实现功能:删除指定位序的元素
  *传入形参:删除位置 i,线性表指针 L
  *返回值:无 
 */
void Delete(int i,List PtrL)
{
	int j;
	
	//检查删除位置的合法性
	if( i < 1 || i > PtrL->Last + 1){
		printf("不存在第%d个元素",i);
		return;
	}
	
	for(j = i; j <= PtrL->Last; j++)		//将表中i后的数,逐个从前往后向前挪,以覆盖删除位置。
		PtrL->Data[j-1] = PtrL->Data[j];
	PtrL->Last--;
	return;
 }

6.求表长

/*求长度 
 *实现功能:求得线性表的长度 
 *传入形参:线性表指针 L
 *返回值:线性表长度 
*/
int Length(List PtrL)
{
	return PtrL->Last + 1;
 } 

以下为测试主程序:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

typedef int ElementType;

typedef struct LNode{
	ElementType Data[MAXSIZE];
	int Last;//表示最后一个元素所在的位置 
}LNode;
typedef LNode* List;//定义一个指向Node的指针 

List MakeEmpty(); //初始化一个空线性表
ElementType FinKth(int K,List PtrL);//根据位序K,返回相应元素(按序号查找)
void Find(ElementType X,List PtrL,int *Pst);//在线性表中查找X的位置(按值查找)
void insert(ElementType X,int i,List PtrL);//在位序i前插入一个新元素X
void Delete(int i,List PtrL);//删除指定位序的元素
int Length(List PtrL); //返回线性表L的长度

int main()
{
	int i;
	List L;
	
	L = MakeEmpty();
	
	printf("输入元素:");
	do{
		scanf("%d",&L->Data[L->Last+1]);
		L->Last++;
		
		if(getchar() == '\n')
			break;
	}while(1);
	
	printf("查找元素\n请输入位序:");
	int K;
	scanf("%d",&K);
	printf("在该位置上的元素是:%d",FinKth(K,L));
	printf("\n\n");
	
	printf("查找位序\n请输入要查找的数:");
	int X;
	int Pst[MAXSIZE];
	scanf("%d",&X);
	Find(X,L,Pst);
	if(Pst[0] == 0){ //该数出现的次数为0
		printf("表中未找到该数!");
	}else{
		printf("该数出现的位置下标分别为:");	
		for(i = 1; i <= Pst[0]; i++)
			printf("%d ",Pst[i]);	
	}
	 
	printf("插入\n请输入要插入的数:");
	scanf("%d",&X);
	printf("请输入插入位置:");
	scanf("%d",&i);
	insert(X,i,L);
	printf("\n");
	
	printf("线性表如下:\n");
	for(i = 0; i <= L->Last; i++)
		printf("%d ",L->Data[i]);
	printf("\n\n");
	
	printf("删除\n请输入要删除的位置:");
	scanf("%d",&i);
	Delete(i,L);
	printf("\n");
	 
	printf("线性表如下:\n");
	for(i = 0; i <= L->Last; i++)
		printf("%d ",L->Data[i]);
	
	free(L);
 }

下面是测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值