目录
初始化一个空线性表
空链式表的抽象表达
//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
- 先构造一个新结点,用s指向;
- 再找到链表的第 i-1 个结点,用 p 指向;
- 然后修改指针,插入结点,使得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的内容手打一遍抄过来,真心不想抄,想着复制粘贴算了。
- 但是吧,不抄不自己写好注释,过不了几天我又得重头学起。
- 阿西吧,毁灭吧,赶紧的,累了