浙大数据结构——2.1线性表及其实现

多项式的表示

eg1:一元多项式及其运算

方法一:顺序存储结构直接表示。使用数组下标表示指数,对应值表示系数。弊端:不适合非零项多、指数大的多项式。

方法二:顺序存储结构表示非零项。使用二维数组存储指数和系数。弊端:不适合多项式的运算。

方法三:链表存储非零项。

什么是线性表 

由同类型数据元素,构成有序序列的线性结构。

线性表的抽象数据类型描述:

类型名称:线性表(List)

数据对象集:0个及以上元素构成的有序序列。

操作集:初始化、增删查改、返回长度、由位序返回元素等。

线性表的顺序存储实现

1、结构体

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

2、主要操作实现

(1)初始化

List MakeEmpty(){
	List PtrL;
	PtrL = (list)malloc(sizeof(struct LNode));
	PtrL->Last=-1;
	return PatrL;
}

(2)查找

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;
}

(3)插入

void Inserrt(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];
		PtrL->Data[i-1]=X;
		PtrL->Last++;
		return;
	}
}

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

线性表的链式存储实现

1、结构体

typedef struct LNode *List;
struct LNode{
	ElementType Data;
	List Next;
}; 
struct LNode L;
List PtrL;

2、主要操作实现

(1)求表长

int Length(List PtrL){
	List p=PtrL;
	int j=0;
	while(p){
		p=p->Next;
		j++;
	}
	return j;
}

(2)按序号查找

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;
	}else{
		return NULL;
	}
}

(3)按值查找

List Find(ElementType X,List PtrL){
	List p=PtrL;
	while(p != NULL && p->Data != X){
		p=p->Next;
	}
	return p;
}

(3)插入

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);
	if(p==NULL){
		printf("参数i错");
		return NULL;
	}else{
		s=(List)malloc(sizeof(struct LNode));
		s->Data=X;
		s->Next=p->Next;
		p->Next=s;
		return PtrL;
	}
} 

(4)删除

List Delete(int i,List PtrL){
	List p,s;
	//表头 
	if(i=1){
		s=PtrL;
		if(PtrL!=NULL){
			PtrL=PtrL->Next;
		}else{
			return NULL;
		}
		free(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;
		p->Next=s->Next;
		free(s);
		return PtrL;
	}
}

广义表

广义表是线性表的推广。对于线性表而已,n个元素都是基本的单元素;广义表中,这些元素可以是单元素也可以是另一个广义表。结构体如下:

typedef struct GNode *GList;
struct GNode{
	int Tag;
	union{
		ElementType Data;
		GList SubList;
	}URegion;
	GList Next;
};

多重链表

eg:矩阵可以用二维数组表示,但二维数组表示有两个缺陷:数组的大小需要事先确定、对于“稀疏矩阵”会造成大量的空间浪费。现在才用一种典型的多重链表——十字链表来存储稀疏矩阵A。

十字链表只存储非0元素、每个结点通过两个指针域把同行同列串起来。如下图所示:

Q:为什么说第1行和第1列的结点是同一个?为什么行数有5个?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值