数据结构——链表和数组

关于数组和链表的基本操作总结

/**
* 线性表的顺序结构实现
* @author masterYHH
* Date 2020.08.08
*/
//线性表的结构体:
typedef struct LNode *List;
struct LNode
{
	Elemtype Data[MAXSIZE];
	int Last;//用来记录顺序表最后一个元素的下标,即a[n-1]
}
struct LNode L;
List PtrL;
//初始化
List makeEmpty()
{
	List PtrL = (List)malloc(sizeof(struct LNode));//申请,填装结点
	PtrL->Last = -1;//设置表长为空
	return PtrL;
}
//查找
int Find(List PtrL,Elemtype X)
{
	int i = 0;
	while(i <= Ptrl->Last && PtrL->Data[i] != X)
	{
		i++;
	}
	if(i > PtrL->Last)
		return NULL;
	else
		return i;
}
//插入
void Insert(List PtrL,Elemtype X,int i)
{
	int j = 0;
	if(PtrL->Last == MAXSIZE-1)
	{
		printf("表满,无法插入!");
		return NULL;
	}
	if(i < 1 || i > PtrL->Last + 2)
	{
		printf("插入位置不合法!");
		return NULL;
	}
	for(j = PtrL->Last;j >=i-1;j--)
	{
		PtrL->Data[j+1] = PtrL->Data[j];
	}
		PtrL->Data[i-1] = X;
		PtrL->Last++;
		return;
}
//删除
void Delete(List PtrL,int i)
{
	int j = 0;
	if(i < 1 || i > PtrL->Last + 1)
	{
		printf("删除位置不合法!");
		return NULL}
	for(j = i;j <= PtrL->Last;j++)
	{
		PtrL->Data[j-1] = PtrL->Data[j];
	}
	PtrL->Last--;
	return;
}
/**线性表的链式存储结构和基本操作
* @author 15223789730@163.com
* Date 2020.12.08
*/
//链式结构体
typedef struct LNode *List;
struct LNode
{
	Elemtype Data;
	List Next;
} 
List PtrL;
struct LNode;
//初始化
List InitLink()
{
	List p = NULL;//创建头指针
	List PtrL = (List)malloc(sizeof(struct LNode));//创建首元结点
	PtrL->Data = 1;
	PtrL->Next = NULL;//初始化首元结点
	p = PtrL;
	for(int i = 2; i <= 5; i++)
	{
		List x = (List)malloc(sizeof(struct LNode));//创建一个新的结点复用
		x->Data = i;
		x->next=NULL;//初始化
		PtrL->Next = x;//建立结点间逻辑关系
		PtrL = PtrL->Next;//更新结点
	}
	return p;//通过头指针访问整个链表即可
}
//求表长
int Length(List PtrL)
{
	List p = PtrL;
	int i = 0;
	while(p)
	{
		p = p->Next;
		i++;
	}
	return i;
}
//查找
1.按值查找
List Find(List PtrL,Elemtype X)
{
	List p = PtrL;
	while(p != NULL && p->Data != X)
	{
		p = p->Next;
	}
	if(p == NULL)
		return NULL;
	else
		return p;
}
2.按序号查找
List FinKth(List PtrL,int K)
{
	int i = 1;
	List p = PtrL;
	while(p !=NULL && i < K)
	{
		p = p->Next;
		i++;
	}
	if(p == NULL)
		return NULL;
	else
		return p;
}
//插入
List Insert(List PtrL,int i,Elemtype X)
{
	List p = NULL;
	List s = NULL;
	if( i == 1)//特殊情况:所要插入的结点作为首元结点插入
	{
		s = (List)malloc(sizeof(struct LNode));
		s->Data = X;
		s->Next = PtrL;
		return s;
	}
	p = FindKth(PtrL,i-1)if(p == NULL)
	{
		printf("无法插入!");
		return NULL;
	}
	else
	{
		s = (List)malloc(sizeof(struct LNode));
		s->Next = p->Next;
		s->Data = X;
		p->Next = s;
	}
	return PtrL;
}
List Delete(List PtrL,int i)
{
	List p,s;
	if( i == 1)
	{
		s = PtrL;
		if(PtrL !=NULL)
			PtrL = PtrL->Next;//从链表中删除
		else
			return NULL;
		free(s);
		return PtrL;
	}
	p = FindKth(PtrL,i-1);
	if(p == NULL)
	{
		printf("无法找到第%d个结点!",i-1);
		return NULL;
	}
	else if(p->Next == NULL)
	{
		printf("无法找到第%d个结点!",i);
		return NULL;
	}
	else
	{
		s = p->Next;
		p->Next = s->Next;
		free(s);
		return PtrL;

	}
}
/**
*线性表的顺序实现
*@author 15223789730@163.com
*@Date 2020.08.10
*/
//线性表的顺序结构
结构体定义如下:
typedef struct LNode *List;
struct LNode
{
	ElementType Data[MAXSIZE];
	int length;
}
struct LNode L;
List PtrL;
//初始化
List makeEmpty()
{
	List PtrL = (List)malloc(MAXSIZE * sizeof(struct LNode));//申请,填装结点
	PtrL->length = -1;
	return PtrL;
}
//查找
int Find(List PtrL,ElementType X)
{
	int i = 0;
	while(i < PtrL->length && PtrL->Data[i] != X)
	{
		i++;
	}	
	if(i >= PtrL->length)
		return NULL; 
	else 
		return i;
}
//插入
List Insert(List PtrL,int i,ElementType X)
{
	if(PtrL->length == MAXSIZE)
	{
		printf("表满,无法插入!");
		return NULL}
	if(i < 1 || i >= PtrL->length)
	{
		printf("插入位置不合法!");
		return NULL;
	}
	while(int j = PtrL->length-1; j >=i-1;j--)
	{
		PtrL->Data[j+1] = PtrL->[j];
	}
	PtrL->Data[i-1] = X;
	PtrL->length++;
	return PtrL;
}
//删除
List Delete(List PtrL,int i)
{
	if(i < 1 || i >PtrL->length)
	{
		printf("删除位置不合法!");
		return PtrL;
	}
	while(int j = i ;j < PtrL->length;j++)
	{
		PtrL->Data[j-1] = PtrL->Data[j];
	}
	PtrL->length--;
	return PtrL;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值