不同于数组存储,链表存储有以下特点:
//不要求逻辑上相邻的元素物理上也相邻
//插入,删除不需要移动数据元素,只需改变改变链
以下是代码,代码里有详细注释哦
#include <stdio.h>
//不要求逻辑上相邻的元素物理上也相邻
//插入,删除不需要移动数据元素,只需改变改变链
typedef struct LNode* list;
struct LNode
{
int Data;//以int类的数据为例
list Next;//指针
};
//1.求表长
int Length(list ptrl)
{
list p=ptrl;/*p指向链表第一个结点*/
int j=0;//记录长度
while(p)
{
p=p->Next;
j++;
}
return j;
}
//2.查找
//2.1按序号查找
list FindKth(int k,list ptrl)//k是第几个的意思,不是下标
{
list p=ptrl;
int i=1;
while(p!=NULL&&i<k)//循环结束说明两个条件有一个被破坏了
{
p=p->Next;
i++;
}
if(i==k) return p;//找到第k个了
else return NULL;
}
//2.2按值查找
list Find(int X,list ptrl)//X是要找的值,最后返回指向它的指针
{
list p=ptrl;
while(p!=NULL&&p->Data!=X)
{
p=p->Next;
}
return p;//若是返回的p是NULL,说明没找着
}
//3.插入
list Insert(int X,int i,list ptrl)//X是插入的值,i是位置(第几个)
{
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);//如果不是在表头插入,先查找第i-1个结点存不存在
if(p==NULL){
printf("参数i错误,不存在i-1这个位置");
return NULL;
}else{
s=(list)malloc(sizeof(struct LNode));/*申请结点*/
s->Data=X;
s->Next=p->Next;/*新结点插入在第i-1个结点的后面*/
p->Next=s;
return ptrl;
}
}
//4.删除结点
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("第%d个结点不存在",i-1);
return NULL;
}else if(p->Next==NULL)
{
printf("第%d个结点不存在",i);
return NULL;
}else{
s=p->Next;//s就是要删除的结点
p->Next=s->Next;
free(s);//删除该结点
return ptrl;
}
}
int main()
{
struct LNode L;
list ptrl;
}
加油哦!