线性表及其实现(顺序表和单链表)

首先,要明确线性表是逻辑结构,而顺序表和链表是存储结构

线性表及其实现(顺序表和单链表)_第1张图片

顺序存储结构是——随机存取结构

链式存储结构是——顺序存取结构

  • 随机存取结构是直接存取,可以通过下标直接访问,与存储位置无关。
  • 顺序存取结构是非随机存取,不能通过下标访问,只能按照存储顺序存取,与存储位置有关。
  • 顺序存储结构:用一组地址连续的存储单元依次存储线性表的各个数据(逻辑相邻、物理相邻)
  • 随机存储结构(典型代表为链式存储结构):用任意的存储单元存储线性表的数据元素(不要求逻辑相邻的元素物理位置相邻)

线性表及其实现(顺序表和单链表)_第2张图片

线性表及其实现(顺序表和单链表)_第3张图片

线性表的顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

线性表及其实现(顺序表和单链表)_第4张图片

如果定义typedef struct LNode *List,那么下面使用的是List PtrL

如果定义typedef struct LNode List,那么下面使用的是List *PtrL

#define MAXSIZE 10
typedef int ElementType;
typedef struct LNode *List;
struct LNode{
	ElementType Data[MAXSIZE];//定义一个数组Data, 分量类型为ElementType 
	int Last;//值代表线性表的最后一个元素的位置 
};
struct LNode L;//声明一个struct LNode型变量L 
List PtrL;//声明一个struct LNode*型指针变量Ptrl 
 
访问下标为i的元素: 
L.Data[i];
PtrL->Data[i];

线性表的长度:
L.Last+1 ;
PtrL->Last+1 ;

①初始化(建立空的顺序表)

//初始化(建立空的顺序表)
List MakeEmpty(){
	List PtrL;
	PtrL=(List)malloc(sizeof(struct LNode));
	PtrL->Last=-1;
	return PtrL; 
} 

②查找 X 所在的位置

//查找X所在的位置 
int Find(ElementType X,List PtrL){
	int i=0;
	while(i<=PtrL->Last&&PtrL->Data[i]!=X){
		i++;
	}
	if(i>PtrL->Last){
		return -1;
	}else{
		return i;
	}
}

③插入

线性表及其实现(顺序表和单链表)_第5张图片

//插入
void Insert(ElementType X,int i,List PtrL){
	int j;
	//如果表空间满了,不能插入
	if(PtrL->Last==MAXSIZE-1){
		printf("表满\n");
		return;
	} 
	if(i<1||i>PtrL->Last+2){
		printf("位置不合法\n");
		return;
	}
	for(j=PtrL->Last;j>=i-1;j--){
		PtrL->Data[j+1]=PtrL->Data[j];
	}
	PtrL->Data[i-1]=X;
	PtrL->Last++;//Last仍指向最后元素 
	return; 
} 

④删除

线性表及其实现(顺序表和单链表)_第6张图片

//删除
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[j-1]=PtrL->Data[j];
	}
	PtrL->Last--;
	return;
} 

线性表的链式存储

线性表及其实现(顺序表和单链表)_第7张图片

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++;
	} 
	return j;
} 

②查找

//查找
//按序号查找
List FindKth(int K,List Ptrl){
	List p=PtrL;
	int i=1;
	while(p!=NULL&&iNext;
		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;
}

③插入 (从右往左的顺序)

线性表及其实现(顺序表和单链表)_第8张图片

//插入
List Insert( ElementType X, int i, List PtrL ){ 
	List p, s;
	if ( i == 1 ) { /* 新结点插入在表头 */
		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;
 	} 
}

④删除

线性表及其实现(顺序表和单链表)_第9张图片

//删除
List Delete(int i,List PtrL){
	List p,s;
	if(i==1){    //如果删除第一个结点(头结点) 
		s=PtrL;		//让s指向第一个结点
		if(PtrL!=NULL){
			PtrL=PtrL->Next;
		} else{
			return NULL;
		}
		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-1);
		return NULL;
	} else{
		s=p->Next;
		p->Next=s->Next;	//将p结点跳过 
		free(s);		//释放被删除结点 
	} 
} 

 

线性表及其实现(顺序表和单链表)_第10张图片

线性表及其实现(顺序表和单链表)_第11张图片

线性表及其实现(顺序表和单链表)_第12张图片

线性表及其实现(顺序表和单链表)_第13张图片

线性表及其实现(顺序表和单链表)_第14张图片

线性表及其实现(顺序表和单链表)_第15张图片

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(#,链表)