线性表的链表存储实现

typedef struct LNode *List;
struct LNode{
ElementType Data;
List Next;
};
struct LNode L;
List PtrL;
int Length(List PtrL)//求表长 
{
List p=PtrL;//p指向表的第一个结点 
int j=0;
while(p){
p=p->Next;
j++;//当前p指向的是第一个结点 

return j;
} //T(N)=O(N) 
List FindKth(int K,List PtrL)//1.按序号查找 
{
List p=PtrL;
int i=1;
while(p!=NULL&&i<K){
p=p->Next;
i++;
}
if(i==K) return p;
//找到第K个,返回指针 
else return NULL;
//否则返回空 
}
List Find(ElementType X,List PtrL)//2.按值查找 
{
List p=PtrL;
while(p!=NULL&&p->Data!=X)
p=p->Next;
return p;
}

1.2.平均时间性能为O(n)

typedef struct LNode *List;
struct LNode{
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL;


List Insert(ElementTypr X,int i,List PtrL)//插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点) 
{
List p,s;
if(i==1){//新结点插入在表头 
s=(List)malloc(sizeof(struct LNode));//申请、填装结点 
s->Data=X;
s->Next=PtrL;//PtrL是第一个结点,完成s结点插在链表头上
return s;//返回新表头指针 
}
p=FindKth(i-1,PtrL);//查找第i-1个结点 
if(p==Null){//第i-1个不存在,不能插入 
printf("参数i错");
retun NULL; 
}else{
s=(List)malloc(sizeof(struct LNode));//申请、填装结点 
s->Data=X;
s->Next=p->Next;//新结点插入在第i-1个结点的后面 
p->Next=s;
return PtrL; 
}
}//T(n)=O(n/2)


List Delete(int i,List PtrL)//删除 
{
List p,s;
if(i==1){//若是删除的是表的第一个结点 
s=PtrL;//s指向第一个结点 
if(PtrL!=Null) PtrL=PtrL->Next;//从链表中删除 
else return Null;
free(s);//释放被删除结点 
return PtrL;
}
p=FindKth(i-1,PtrL)//查找第i-1个结点 
if(p==PtrL){
printf("第%d个结点不存在",i-1); return NULL;
}else if(p->Next==NULL){
printf("第%d个结点不存在",i); return NULL;
}else{
s=p->Next;//s指向第i个结点 
p->Next=s->Next;//从链表中删除 
free(s);//释放被删除结点 
return PtrL;
}
} //T(n)=O(n/2)

 

posted on 2017-01-17 04:07  chy89224  阅读(176)  评论(0编辑  收藏  举报