目录
前言
链式存储,即链表,是一种常用、方便的存储方式。链表这种方法可以在多个语言中使用,具有一定抽象性。
一般对链表进行的操作有:求表长,查找特定元素,插入结点,删除结点。
求表长
下面我使用一段抽象代码表示
int Length(List Ptrl)
{
List p=Ptrl;
int j=0;
while(p)
{
p=p->Next;
j++;
}
return j;
}
p从头开始,每次循环就会指向下一个节点,直到最后一个NULL。过程中j++,最后j就是链表长度。
从链表中查找
按照序号查找
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;
}
- p设为表头
- K是想要找的那个元素的序号
- 结果有两种可能:①是i=k,但是没找到元素 ②找到头了还没到第K个
按照值查找
List Find(ElemenType X,List Ptrl)
{
List p=Ptrl;
while(p!=NULL&&p->Data!=X)
p=p->Next;
return p;
}
- p设为表头
- 结果:①到头来还没找到 ②找到了并且返回序号.
插入操作
- 构造已给新的节点,使用malloc申请空间地址给新节点
- 找到要插入的位置,并且把这个位置用p指向(新节点要插在p后面)
- 使新节点位置s的下一个指向p的下一个,再让p的下一个指向s。
List Insert(ElemenType X,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;
}
}
- 传进来的参数都有:插入新结点的内容X,想插入的位置i,链表头部ptrl
- 需要先进行判断插入地方是否在头上,如果在头上,就在ptrl前面。不过如此操作会使整个链表的头指针发生变化。
删除操作
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("参数错误");
return NULL;
}
else
if(p->Next==NULL)
{
printf("第%d个结点不存在",i);
return NULL;
}
else
{
s=p->Next;
s->Next=s->Next;
free(s);
return Ptrl;
}
}
- 先利用循环找到这个下标i的元素。
- 把i-1个节点和i+1个节点连起来
- 把删掉的p节点free
- 仍然要考虑删除的节点是不是头节点/链表是否为空
就酱,拜拜~