线性表的数组实现和链表实现



线性表的顺序存储实现

//线性表用数组来实现 
typedef struct PolyNode *Polynomial;
struct PolyNode{
	int coef;//系数 
	int expon;//exponential指数 
	Polynomial link;
};

typedef struct LNode *List;
struct LNode{
	ElementType Data[MAXSIZE];//数组类型 
	int Last;//最后一个元素 
};
struct LNode L;
List PtrL;//线性表结构的指针 
//访问下标为i的元素:L.Data[i]或PtrL->Data[i]
//线性表的长度:L.Last+1或PtrL->Last+1 

//1.初始化(建立空的顺序表)
List MakeEmpty()
{
	List PtrL;
	PtrL=(List)malloc(sizeof(struct LNode));//产生头结点,并使L指向头结点 
	PtrL->Last=-1;//=0表示第一个元素,=-1表示无元素 
	return PtrL;//返回结构指针 
} 

//2.查找
int Find(ElementType X,List PtrL)//List PtrL线性表结构的指针/在线性表中找到X所在的位置 
{
	int i=0;
	while(i<=PtrL->Last&&PtrL->Data[i]!=X)
		i++;
	if(i>PtrL->Last)
		return -1;//如果没找到,返回-1 
	else
		return i;//找到后返回存储位置 
} 
//查找成功的平均比较次数为(n+1)/2,平均时间性能为O(n)

//3.插入操作实现
void Insert(ElementType X,int i,List PtrL)
{
	int j;
	if(PtrL->Last==MAXSIZE-1){//表空间已满,不能插入 
		printf("表满");
		return;
	}
	if(i<1||i>PtrL->Last+2){//检查插入位置的合法性 
		printf("位置不合法");
		return;
	}
	for(j=PtrL->Last;j>=i-1;j--)
		PtrL->Data[j+1]=PtrL->Data[j];//将ai~an倒序向后移动 
		PtrL->Data[i-1]=X;//新元素插入 
		PtrL->Last++;//Last仍指向最后元素 
	return;
} 
//平均移动次数为n/2,平均时间性能为O(n)

//4.删除操作实现
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++)
		PtrL->Data[i-1]=PtrL->Data[i];//将ai+1~an顺序向前移动 
		PtrL->Last--;//Last仍指向最后元素 
		return;
} 
//平均移动次数为n/2,平均时间性能为O(n)


线性表的链式存储实现

//链表
typedef struct LNode *List ;
struct LNode{
	ElementType Data;
	List Next;
};
struct Lnode L;
List PtrL;

//1.求表长——链表遍历 
int Length(List PtrL)//链表头指针  
{
	List p=PtrL;//p指向表的第一个结点 
	int j=0;
	while(p){
		p=p->Next;//最后一个结点是NULL 
		j++;//当前p指向的是第j个结点 
	}
	return j;
} 
//时间性能为表长O(n) 

//2.查找
//(1)按序号查找:FindKth;
List FindKth(int K,List PtrL)
{
	List p=PtrL;//p指向表头 
	int i=1;
	while(p!=NULL&&i<K){
		p=p->Next;
		i++; 
	}
	if(i==K)
		return p;//找到第K个,返回指针 
	else
		return NULL;//否则返回空 
} 

//(2)按值查找
List Find(ElementType X,List PtrL)
{
	List p=PtrL;
	while(p!=NULL&&p->Data!=X)//p->Data!=X没找到 
		p=p->Next;
	return p;
} 

//3.插入
List Insert(ElementType X,int i,List PtrL)//将X插入到PtrL的第i个位置 
{
	List p,s;
	if(i==1){//新结点插入在表头 i-1=0,在链表中是不存在的,所以要做特殊处理 
		s=(List)malloc(sizeof(struct LNode));//申请填装结点 
		s->Data=X;
		s->Next=PtrL;
		return s;//返回新表头指针 
	}
	p=FindKth(i-1,PtrL);//查找第i-1个结点 
	if(p==NULL){//第i-1个结点不存在,不能插入 
		printf("参数i错误");
		return NULL;
	}
	else{
		s=(List)malloc(sizeof(struct LNode));//申请填装结点 
		s->Data=X;
		s->Next=p->Next;//新结点插入在第i-1个结点的后面 
		p->Next=s;
		return PtrL;
	}
} 

//4.删除
List Delete(int i,List PtrL)
{
	List p,s;
	if(i==1){//若要删除的是表的第一个结点 
		s=PtrL;//s指向第一个结点 
		if(PtrL!=NULL)//从链表中删除 
			PtrL=PtrL->Next;
		else
			return NULL;//第一种情况是PtrL本身就是空白,这是删除不成功 
		free(s);//释放被删除结点 
		return PtrL;
	}
	p=FindKth(i-1,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;//s指向第i个结点 
		p->Next=s->Next;//从链表中删除 
		free(s);//释放被删除结点 
		return PtrL;
	}
} 








  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值