dragonraje

导航

数据结构2.2 线性表链式存储

线性表链式存储

不要求逻辑上相邻的元素物理上也相邻

链式线性表的格式

typedef struct LNode *List;
typedef struct LNode {
telementType data;
List Next;
};
List Ptrl;

操作集:

求表长:

int length(List Ptrl){
List P=Ptrl;//P指向Ptrl的表头。
int j=0;//j为计数器
while(P){//P不为空
P=P->next;//读取P的下一个结点直到最后
j++;

}
return j;
}

查找:

1,按序号查找:

int Findk(int k,List Ptrl){//k是要查找的数值
List P=Ptrl;
while(P!=NULL&&p->data!=k){//判断
p=p->next;
}
if(P!=NULL){
return i;//找到了
}
else
return -1;//未找到
}

 

 

2,按值查找:

int Findk(int k,List Ptrl){//k是要查找数值
List P=Ptrl;
while(P!=NULL&&P->data!=k){//判断数值是否相等
p=p->next;
}
if(P!=NULL){
return i;//找到了
}
else
return -1;//未找到
}

插入:(插入第i个元素的位置)

  • malloc函数申请新空间
  • 寻找第i-1结点的位置,用(临时)p指针指向
  • 插入指针S指向第i个结点:s->next=p->next;
  • 第i-1个结点指向指针S:p->next=s;
List insert(List Ptrl,int i)
{
List p,j;//临时链表j和插入链表p;
if(i==1)//i为1是头指针,要特殊处理
{
P=(List)malloc(sizeof(List));
p=Ptrl;
return p;
}
j=findk(i-1);//查找第i-1个结点的函数
if(j==NULL){//参数错误
return NULL;
}
else{
p=(List)malloc(sizeof(List));
p->next=j->next;//P指向第i个元素
j->next=p;//j指向插入指针p。
return Ptrl;
}
}

时间复杂度为O(n)。

删除:要释放被删除的结点占用的内存空间(free)。

  • 先找到要删除的第i-1个结点,用p临时指针指向。
  • 用s结点指向第i个结点(p要删除的结点)。
  • 删除结点。
  • 用s指针释放内存。

 

posted on 2022-06-26 10:44  dragonraje  阅读(17)  评论(0编辑  收藏  举报