第二讲线性结构.线性表


应用场景

多项式


一、线性表是什么?

顺序存储链式存储

二、抽象数据集

抽象数据集

三、顺序存储

1)定义,初始化,查找:

//线性表的定义与操作-顺序表 
typedef int Position;
typedef struct LNode{
	ElementType Data[MAXSIZE];
	Position Last;
}LNode,*List; 

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

//查找
#define ERROR -1
Position Find(List L,ElementType X){
	Position i=0;
	while(i<=L->Last &&L->Data!=X){
		i++; 
	}
	if(i>L->Last){
		return ERROR;//没找到,返回-1 
	}
	else {
		return i;//找到,返回存储位置 
	}
}

2)插入插入

//插入 
bool Insert(List L,ELementType X,Position P){
	//在L里指定位置P前插入X
	Position i;
	if(L->Last == MAXSIZE-1){//表空间已满,不能插入 
		printf("表满");
		return false; 
	} 
	if(P<0||p>L->Last +1){//检查插入位置合法否 
		printf("位置不合法");
		return false; 
	}
	for(i=L->Last;i>=P;i--){
		L->Data[i+1]=L->Data [i];
	}//将位置P及后单元顺序向后移动 
	L->Data [P]=X;//新元素插入 
	L->Last ++;//Last指向最后元素 
	return true;
}

3)删除
删除

//删除
bool Delete(List L,Position P){
	Position i;
	if(P<0||P>L->Last ){//检查空表及删除位置的合法性 
		printf("位置%d不存在元素",P);
		return false; 
	}
	for(i=P;i<L->Last ;i++){
		L->Data [i]=L->Data [i+1];//将位置P及以后元素向前移 
	}
	L->Last --;
	return true; 
} 

四、链式存储

1)定义、求表长、查找(按序号、按值)

//线性表的定义与操作-链式表 
struct LNode{
	ElementType data;
	struct LNode *next;
};
typedef struct LNode *List;

//求表长
int Length(List Ptrl) {
	List p = Ptrl;
	int j=0;
	while(p){
		p=p->next ;
		j++
	}
	return j;
}

/*查找*/ 
//按序号查找:Findkth 
List FindKth(int K,List Ptrl){
	List p=Ptrl;
	int i=1;
	while(p!=NULL&&i<K){
		p=p->next;
		i++;
	}
	if(i==K){
		return P;//找到第K个,返回指针 
	}
	else return NULL;//没找到,返回NULL 
} 

//按值查找:Find
List Find(ElementType X,List Ptrl){
	List P=Ptrl;
	while(p!=NULL&&P->data !=X){
		p=p->next;
	}
	return P;
}

2)插入
插入

//插入(在i-1个节点后面插入一个值为X的新节点) 
List Insert(ElementType X,int i,List Ptrl){
	List p,s;
	if(i==1){
		s=(List)malloc(sizeof(LNode));
		s->data =X;
		s->next =Ptrl;
		return s;
	} 
	p=FindKth(i-1,Ptl);
	if(p==NULL){
		printf("i-1不存在,不能插入")return NULL; 
	}
	else{
		s=(List)malloc(sizeof(LNode));
		s->data =X;
		s->next = p->next ;//新结点插在第i-1个结点后面 
		p->next = s;
		return Ptrl;
	}
}

3)删除
删除

//删除(删除链表的第i个位置上的节点)
List Delete(int i,List Ptrl){
	List P,S;//S stand,P pre
	if(i==1){
		S=Ptrl;
		if(Ptrl!=NULL){
			Ptrl=Ptrl->next;
			free(S); 
			return Ptrl;
		}
		else {
			printf("第1个结点不存在"); 
			return NULL;} 
	}
	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 ;//从链表中删除S 
		free(S);//释放被删除的结点S 
		return Ptrl;
	}
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值