线性表之链式存储

初始化一个空线性表

空链式表的抽象表达

//typedef用于给结构体取别名,
typedef struct LNode* List;
//上面这行的内容是,说明 List 是结构体 LNode 类型的指针
//下面这行就是结构体的创建
struct LNode
{
	//这行看不懂还敲不出的代码就是抽象表达了
	//ElementType->任意类型,Data->数据,
	//这下应该懂了吧,也就是说,这里可以写任意类型的数据,然后成为链表的“数据域”
	ElementType Data;
	//而这一行就很简单了,一个指向本类型的指针,经典的指针域
	List Next;
};
//创建一个 struct Lnode 类型的变量 L
struct Lnode L;
//创建一个 List(一个指向 LNode 的指针类型) 类型的变量 Ptrl
List PtrL;

查找

按序号

List FindKth(int K,List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
int i = 1;
while (p!=NULL&&i<K)
{
	p = p->Next;
	i++;
}
//找到第K个,返回指针
if (i == K) return p;
//如果根本没有第K个,就返回NULL
else return NULL;
}

按值

List FindKth(ElementTpye K,List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
while (p!=NULL&&p->Data!=K)
{
	p = p->Next;
}
return p;
}

在位序i前插入一个新元素X

  1. 先构造一个新结点,用s指向;
  2. 再找到链表的第 i-1 个结点,用 p 指向;
  3. 然后修改指针,插入结点,使得p指向结点s,s指向p的原下一个结点;

分两种情况
当i=1,也就是要在链表头部插入新元素x的时候

List Insert(ElementTpye X, int i, List Ptrl)
{
List s;
if (i == 1)
{
	//给s结点开辟新的空间
	s = (List)malloc(sizeof(struct LNode));
	//修改新结点的数据
	s->Data = X;
	//使得新的头结点的指针指向原先的头结点
	s->Next = PtrL;
	//返回新的头结点
	return s;
}
}

当i!=1时

List Insert(ElementTpye X, int i, List Ptrl)
{
List p,s;
p = FindKth(i - 1, Ptrl);	//使得p指向i-1的结点
if (p==NULL)	如果i-1的结点不存在,说明有BUG
{
	printf("参数i错误");
	return NULL;
}
else
{
	s = (List)malloc(sizeof(struct LNode));
	s->Data = X;
	//使得s的指针指向p的指针,也就是i结点
	s->Next = p->Next;
	//再使得p指向s结点
	p->Next = s;
	//这样就插入完成了,最后返回头指针
	return PtrL;
}
}

总体

List Insert(ElementTpye X, int i, List Ptrl)
{
List p,s;
if (i == 1)
{
	//给s结点开辟新的空间
	s = (List)malloc(sizeof(struct LNode));
	//修改新结点的数据
	s->Data = X;
	//使得新的头结点的指针指向原先的头结点
	s->Next = PtrL;
	//返回新的头结点
	return s;
}
p = FindKth(i - 1, Ptrl);	//使得p指向i-1的结点
if (p==NULL)	如果i-1的结点不存在,说明有BUG
{
	printf("参数i错误");
	return NULL;
}
else
{
	s = (List)malloc(sizeof(struct LNode));
	s->Data = X;
	//使得s的指针指向p的指针,也就是i结点
	s->Next = p->Next;
	//再使得p指向s结点
	p->Next = s;
	//这样就插入完成了,最后返回头指针
	return Ptrl;
}
}

删除指定位序i的元素

跟插入的做法大差不差的

List Delete(int i, List Ptrl)
{
List p,s;
if (i == 1)
{
	//使得s指向头结点
	s = Ptrl;
	//头结点往后移一位
	if (Ptrl != NULL) Ptrl = Ptrl->Next;
	else return NULL;
	//释放s的空间
	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指向i结点
	s = p->Next;
	//连接上i-1结点和i+1结点
	p->Next = s->Next;
	//释放空间
	free(s);
	return Ptrl;
}
}

返回线性表L的长度n

int Length(List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
int j = 0;
while (p)	//如果p!=NULL,那就会一直执行,直到p==NULL,也就是链表遍历完了为止
{
	p = p->Next;	//使得 p 指向下一个结点
	j++;	//当前 p 指向的是第 j 个结点
}
return j;
}

吐槽

  • 累死老子了,基本上就是把PPT的内容手打一遍抄过来,真心不想抄,想着复制粘贴算了。
  • 但是吧,不抄不自己写好注释,过不了几天我又得重头学起。
  • 阿西吧,毁灭吧,赶紧的,累了
posted @ 2023-01-02 12:25  淦丘比  阅读(18)  评论(0编辑  收藏  举报