//浙江大学数据结构//
1.求表长
int Length(List PtrL)
{
List p=PtrL;//使p指向其头节点
int j=0;
while(p)//当p没有指向空时
{
p=p->next;
j++;
}
return j;
}
2.查找(分为按序号查找,以及按值查找)
List FindKth(int K,List PtrL)//查找第K个元素
{
List p=PtrL//指向头节点
int i=1;
while(p!=NULL&&i<k)//当指针没指向空,并且i没有到达k,遍历
{
p=p->Next;
i++;
}
if(i==K)//找到
return p;
else
return NULL;//没找到
}
List Find(ElementType X,List PtrL)
{
List p=PtrL;
while(p!=NULL&&p->Data!=X)
p=p->Next;
return p;
}
3.插入(在第i-1个节点后插入一个值为X的新节点)
(1)malloc申请新节点空间并且用s指向
(2)之后找到第i-1个节点,用p指向
(3)s的next改为p的next,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;//返回的是新表的头指针
}
调用find函数找到第i-1个节点,并用p指向其
p=FindKth(i-1,PtrL)
if(p==NULL)//先判断是否有第i-1个结点,若没有则不能插入
{printf("error");return NULL;}
else
{
s=(List)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return PtrL;
}
}
4.删除
(1)找到要删除结点的前一个节点(i-1)用p指向
(2)用s指向要删除的结点
(3)p的next变为s的next
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);//看有没有第i-1个结点
if(p==NULL)
printf("i-1不存在");
else if(p->Next==NULL)
printf("i不存在");
else {
s=p->Next;
p->Next=s->Next;
free(s);//记得释放内存
return PtrL;//返回头结点
}
}