数据结构与算法--第二周:线性结构

线性表的顺序存储实现
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
(1)初始化:建立空的顺序表

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

(2)查找用二分查找,不要太麻烦了
(3)插入操作:在第i个位置

void Insert(ElementType X,int i, List PtrL){
	int j;
	if(PtrL->Last == MAXSIZE-1){
	prntf("表满");
	return;
	}
	if (i<1 || i>PtrL->Last + 2){
 		printf(位置不合法);
		printf("位置不和法");
 	}
 	for (j = PtrL->Last;j>=i-1;j--) PtrL->Data[j+i] = 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("不存在");
	return;
}
for(j = i;j<=PtrL->Last;j++)
PtrL->Data[j-1] = PtrL->Data[j];
PtrL->Last--;
return;
}

2、利用链式存储实现
区别与数组存储:插入、删除不需要移动数据元素,只需要修改“链”

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

(1)求表长

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

(2)查找
a.按序号查找: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;
}

b.按值查找:Find

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

也可以改成bool来作判断。
(3)删除
注意将已经给的空间给free掉

List Delete(int i,List PtrL){
https://www.icourse163.org/learn/ZJU-93001?tid=1462787444#/learn/content?type=detail&id=1239897399&cid=1261105616
}

3.广义链表
可以通过定义union的类型来解决类型不定的情况
但是要加一个Tag来说明是什么类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值