数据结构——链表(慕课笔记)

26 篇文章 1 订阅

数据结构我们学校这个寒假要求提前预习,推荐课程是浙江大学的数据结构,这个之前有看了第一单元,但由于大一水平有限,再加上自已意志力不足,看到第二单元有些看不懂就放弃了。现在大二了,现在是2022年1月18号,我从第二单元开始看的,现在每天在CSDN上做做笔记,以便以后复习。

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

  1. 初始化一个空线性表L
  2. 根据位序K,返回相应元素
  3. 在线性表L中查找X的第一次出现的位置
  4. 在位序i前插入一个新元素X
  5. 删除指定位序i的元素
  6. 返回线性表L的长度n

第一种 数组存储

1.初始化

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

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;/*如果没找到,返回-1*/
	else return i;/*找到后返回的是存储的位置*/
}

3.插入

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.求表长

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

2.查找
(1)按序号查找

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

(2)按值查找

List Find(ElementType X, List PtrL) {
	List p = PtrL;
	while (p1 = 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("参数错误");
		return NULL;
	}
	else {
		s = (List)malloc(sizeof(struct LNode));
		s->Data = X;
		s->Next = p->Next;
		p->Next = s;
		return PtrL;
	}
}

4.删除

  1. 先找到链表的的第i-1个节点,用p指向;
  2. 再用指针s指向要被删除的结点(p的下一个结点)
  3. 然后修改指针,删除s所指的结点
  4. 最后释放s所指结点的空间
List Delete(int i, List PtrL) {
	List p, s;
	if (i == 1) {
		s = PtrL;
		if (PtrL != NULL) 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个元素都是基本的单元素
  • 广义表中,这些元素不仅可以是单元素也可以是另一个广义表。

多重链表(以后再看)

多重链表:链表的结点可能隶属于多个链

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值