链表List
1.定义
typedef struct LNode *List
struct LNode
{
ElementType Data;
List Next;
}
struct LNode L;
List Ptrl;
2.求表长度
int Length(List Ptrl)
{
List p=Ptrl; //p指向表第一个节点
int j=0;
while(p)
{
p=p->Next;
j++;
}
return j;
}
- (时间复杂度O(n))
3.查找
(1).按序号查找FindKth(找第K个结点)
List FindKth(int K,List Ptrl)
{
List p=Ptrl;
int i=1;
while(p!=NULL&&i<K)
{
p=p->next;
i++;
}
if(K==i)
return p;
else
return NULL;
}
(2).按值查找Find
List Find(ElementType X,List Ptrl)
{
List p=Ptrl;
while(p!=NULL&&p->Data!=X)
p=p->next;
return p;
}
3.插入(第i-1(1<=i<=n+1)个结点后插入值为X)
步骤如下:
1. 构造新结点,用s指向
2. 找到i-1结点,用p指向
3. s->next=p->next;
4. p->next=s;
List Insert(ElementType X,int i,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(“参数i错”);
return NULL;
}
else
{
s=(List)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return Ptrl;
}
}
4.删除(删除第i(1<=i<=n)个结点)*
步骤如下:
1.找到i-1结点,用p指向
2. s指向i结点;
3. 删除s指向结点;
注意free!!!
List Delete(int i,List Ptrl)
{
List p,s;
if(i==1){ //删除头结点
if(Ptrl!=NULL)
Ptrl=Ptrl->next;
else
return NULL;
return Ptrl;
}
p=FindKth(i-1,Ptrl);
if(p==NULL){
printf(“第i-1个结点不存在”);return NULL;
}else if(p->Next==NULL){
printf(“第i个结点不存在”);return NULL;
}else{
s=p->Next;
p->Next=s->Next;
free(s);
return Ptrl;
}