#include <stdio.h>
#include <stdlib.h>
#define ElementType int
typedef struct LNode *List;
struct LNode
{
ElementType Data;
List Next;
};
//求表长,返回表长
int Length(List PtrL){
List p=PtrL;
int i=0;
while(p){
i++;
p=p->Next;
}
return i;
}
//查找(按序号),返回指针
List FindKth(List PtrL,int num){
List p=PtrL;
int i=1;
while(p!=NULL&&i<num){
p=p->Next;
i++;
}
if(i==num) return p;
else return NULL;
}
//查找(按值),返回指针
List Find(List PtrL,int x){
List p=PtrL;
while(p!=NULL&&p->Data!=x){
p=p->Next;
}
return p;
}
//插入x元素在i位置,返回新表指针
List Insert(List PtrL,int x,int i){
List p=PtrL;
List node=new LNode;
node->Data=x;
//插在表头:i==1,返回
if(i==1){
node->Next=PtrL;
return node;
}
//不是插在表头:找到i位置
p=FindKth(PtrL,i-1);
/*int j=0;
while(p&&j<(i-1)){
p=p->Next;
j++;
}
*/
//不是插在表头:i位置不存在,存在
if(p==NULL){
printf("i位置非法");
return NULL;
}else{
node->Next=p->Next;
p->Next=node;
return PtrL;
}
}
//删除第i个元素,返回新表指针
List Delete(List PtrL,int i){
List p=PtrL;
//删除表头
if(i==1){
if(PtrL!=NULL)PtrL=PtrL->Next;
else return NULL;
free(p);
return PtrL;
}
p=FindKth(PtrL,i-1);//第i-1个结点
List s=p->Next;//第i个结点
if(s==NULL){
printf("第%d个结点不存在",i);
return NULL;
}else{
p->Next=s->Next;
free(s);
return PtrL;
}
}
课后练习:
下列函数试图求链式存储的线性表的表长,是否正确?
int Length ( List *PtrL ){
List *p = PtrL;
int j = 0;
while ( p ) {
p++;
j++;
}
return j;
}
不正确
p++只能用于连续空间进行指针位移获取下一元素,而链表非连续空间。