线性表 顺序存储结构与链式存储结构

线性表是由同类型数据元素构成有序序列的线性结构
表起始位置成为表头,表结束位置成为表尾
这里给出线性表的顺序存储和链式存储 
链式存储的主要优点是便于数据修改,相对于顺序存储来说,主要缺点是存储空间的利用效率较低,
因为分配给元素的存储单位有一部分用来存储相邻结点的存储地址,由于链式存储逻辑上相邻的元素在存储空间中不一定相邻
所以不能对元素进行随机存取; 
typedef struct LNode *List;
struct LNode{
	ElementType data[MAXSIZE];
	int Last;//last指向表的最后一位 
}; 
struct LNode L;
List PtrL;
//访问下标为i的元素:L.Data[i]或 PtrL->Data[i]
//线性表的长度:L.Last+1或PtrL->Last+1;
List MakeEmpty()  //1.初始化(建立空的顺序表) 
{	List PtrL;
	PtrL=(List )malloc(sizeof(struct LNode));//申请空间 
	PtrL->Last=-1;
	return PtrL;
} 
int Find(ElementType X,List PtrL)//找X在线性表中的位置,
{
	int i=0;
	while(i<=PtrL->Last&&PtrL->Data[i]!=X){ //当线性表没有扫描完而且还没找到x时进行while循环 
		i++;
	}
	if(i>PtrL->Last) return -1;// 扫描完了线性表,结果还没找到 
	else return i; //找到了 他的位置是i 
} 
void Insert(ElementType X,int i,List PtrL){//在PtrL中第i个位置插入X 
	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;//插入,因为从0开始计数所以在i-1的位置进行插入操作 
  	PtrL->Last++; //因为多了一个元素,所以last++,last指向最后元素 
  	return;
}
void Delete(int i,List PtrL){
	int j;
	if(i<1||i>PtrL->Last+1){//检测空表及删除位置的合法性 
		printf("不存在第%d个元素");
		return; 
	}
	for(j=i;j<=PtrL->Last;j++){//将ai+1~an向前移动 
		PtrL->Data[j-1]=PtrL->Data[j];
	}
	PtrL->Last--; //last指向最后一位 
	return;
}


//链式存储,不要求逻辑上相邻的两个元素物理上也相邻 
typedef struct LNode *List;
struct LNode{
	ElementType data;
	List Next;//套娃 
}; 
struct LNode L;
List PtrL;
int Length(List PtrL){ //求表长 
	List p=PtrL; //p指向表的第一个结点
	int j=0;
	while(p){
		p=p->Next;
		j++; // 当前p指向的是第j个结点 
	} 
	return j;
}
List FindKth(int K,List PtrL){ //查找,按序号查找 
	List p=PtrL;
	int i=1;
	while(p!=NULL&&i<K){
		p=pp->Next;
		i++;
	}
	if(i==k) return p;//找到第k个,返回指针; 
	else return NULL;//否则返回空 
}
List Find(ElementType X,List PtrL){//查找,按数值查找 
	List p=PtrL;
	while(p!=NULL&&p->Data!=X){
		p=p->Next;
	}
	return p;
}
List Insert(ElementType X,int i,List PtrL){ //插入操作实现 ,在ptrl表中,在i位置插入x 
	List p,s;
	if(i==1){ //新节点插入在表头 
		s=(List)malloc(sizeof(struct LNode));//申请装填结点 
		s->Data=X;//s点的数据存储为x 
		s->Next=PtrL;//s的指针指向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;
	}
}
List Delete(int i,List PtrL){
	List p,s;
	if(i==1){ //若要删除的是表的第一个结点 
		s=PtrL;  //s指向第一个结点 
		if(PtrL!=NULL) PtrL=PtrL->Next;//从链表中删除 
		else return NULL;
		fress(s);//释放被删除的结点 
		return PtrL;
	}
	p=FindKth(i-1,PtrL);
	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:
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值