线性表的操作集合

线性表的操作集合

本文只含有简单的线性表的插入删除,查找等操作。
一. 线性表的顺序存储

存储结构:

  typedef  int Position;     
  typedef  struct LNode *PtrTLNode;  //PtrTLNode为指向LNode类型的指针;
  struct LNode
{
	ElementType  Data[MAXSIZE];
	Position   Last;
	
};
 
  typedef  PtrTLNode List;

初始化线性表:

List MakeEmpty ()
{
   List L;
   L=(List) malloc(sizeof(struct  LNode));
   L->Last=-1;
   return L;
 } 

顺序表的查找:

Position Find(List L,ElementType X)
 {
 	if(!L) return -1;  //如果找不到返回错误值-1;
 	int i=0;
 	while(i<=L->Last&&L->Data[i]!=X)
 	{
 		i++;
	 }
	 if(i>L->Last)  return -1;
	 else return i;   //返回找到的元素值的存储位置;
 }

顺序表的插入(主要要注意,传过来的线性表是否满了,再判断要插入的位置是否合理)

 bool Insert( List L, ElementType X, Position P ) //**传过来的p参数,是要插入的元素在链表中的位置;**
{
    if(L->Last==MAXSIZE-1)  //先判断表是否是满的
    {
      printf("FULL");
	  return false;	
	}
 
	 if(P>L->Last+1||P<0)  //判断给的插入位置是否合理;
      {
		printf("ILLEGAL POSITION");
		return false;
	} 
	
	int i=L->Last;
	for(;i>=P;i--)  //把从p位置开始的参数一个一个往后挪;
	{
		L->Data[i+1]=L->Data[i];
	}
	L->Data[P]=X;
	L->Last++;
	return true;
}

一. 线性表的链式存储

存储结构

typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

创建空表

 List  MakeEmpty(List L)
 {
 	L=(List)malloc(sizeof(struct LNode));
 	L->Next=NULL; //带头结点; 
 	return L; 
 }

链表的长度遍历

int  Length(List L)
 {
 	Position temp;
 	temp=L;
	 int num-0;
	 while(temp) 
	 {
	 	temp=temp->Next;
	 	num++;
	 }
	 return num;
 }

链表的查找(按照所给得值查找,并返回查找位置)

Position Find(List L ,ElementType X)
 {
 	Position  temp;
 	temp=L;
 	while(temp&&temp->Data!=X)
 	{
 		temp=temp->Next;
	 }
	return temp;
 }

链表的查找(按照所给的位置查找,返回查找到的值)

ElementType Find(List L ,int  site) //不带头结点 
 {
    Position   temp;
	temp=L;
	while(site>1&&temp)
	{
		temp=temp->Next;
		site--;
		}	
 	if(site==0&&temp) return temp->Data;
 	else return -1;
 }

链表元素的插入(不带有头结点)

bool InsertElement(List L,ElementType  X,int i)
 {
 	Position  temp;
 	temp=(List)malloc(sizeof(struct LNode));
 	temp->Data=X;
 	temp->Next=NULL;
 	if(i<1)  return false;
 	if(i==1)  
 	{
 		temp->Next=L;
 		return temp;
	 }
	 else {
	 	int cnt=1;
	 	Position  pre;
	 	pre=L;
	 	while(pre&&cnt<i-1) //注意这里要循环i-2次; 
	 	{
	 		pre=pre->Next;
	 		cnt++;
		 }
		 if(pre==NULL||cnt!=i-1)
		 {
		 	printf("插入位置有误\n");
		 	free(temp);
		 	return false;
		 }
		 else {
		 	  temp->Next=pre->Next;
		 	  pre->Next=temp;
		 	   return true; 
		 	
		 }
	 }
 }

链表元素的插入(带头结点)

bool InsertElement(List L,ElementType  X,int i) //不用单独考虑头结点 
  {
  	Position   temp;
  	temp=(List)malloc(sizeof(struct LNode));
  	int cnt=1;
  	Position  pre;
  	pre=L;
  	while(pre&&cnt<i)  //注意此处i的范围
  	{
  	   pre=pre->Next;
  	   cnt++;
	  }
	  if(cnt!=i||!pre)
	  {
	  	printf("插入位置错误\n");
	  	free(temp);
	  	return false;
	  }
	  else {
	  	temp->Next=pre->Next;
	  	pre->Next=temp;
	  	return true;
	  }
  	
  }

链表元素的删除

bool  DeletElement(List  L,int i) //带头结点,删除第i个元素; 
  {
  	  Position  temp,pre;
  	  cnt=1;
  	  pre=L;
  	  while(cnt<i&&temp!=NULL)
  	  {
  	  	pre->Next=pre;
  	  	cnt++;
		}
		if(cnt!=i||!temp) 
		{
			printf("要删除的元素不合法\n");
			return false;
		}
		else {
			temp=pre->Next;
			pre->Next=temp->Next;
			free(temp);
			return true;
		}
  }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一蓑烟雨荏平生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值