链表的实现(简易版)
首先是结构体
typedef int ElementType; //为了便于修改链表中元素的类型
typedef struct Node{
ElementType Date;
struct Node* Next;
}List;
List L,*Ptrl;
求链表长度的函数
int length(List *Ptrl){
List* p =Ptrl;
int j=0;
while(p){
p=p->Next;
j++;
}
return j;
}
通过位置查找
List* FindKth(int k,List *Ptrl){
List *p=Ptrl;
int i=0;
while(p!=NULL && 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->Date!=X){
p=p->Next;
}
return p;
}
插入
/*构造节点,找到i-1个节点,插入节点*/
List* Insert(ElementType X,int i ,List* Ptrl){
List* s, * p;
if(i==1){
s=(List*)malloc(sizeof(List));
s->Date = X;
s->Next = Ptrl;
return s;
}
p = FindKth(i-1,Ptrl);
if(p== NULL){
cout<<"参数错"<<endl;
return NULL;
}
else{
s=(List*)malloc(sizeof(List));
s->Date = X;
s->Next = p->Next;//位置不能颠倒
p->Next = s;
return Ptrl;
}
}
删除
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);
if(p== NULL){
printf("第%d个节点不存在",i-1);
return NULL;
}
else if(p->Next == NULL){
printf("第%d个节点不存在",i);
return NULL;
}
else{
s=p->Next;//用新创建的指针指向要删除的
p->Next = s->Next;
free(s);
return Ptrl;
}
}
【测试的主函数】
int main(){
List* p=(List*)malloc(sizeof(List));
p->Next = NULL;
p->Date=2;
p=Insert(5,1,p);
p=Insert(3,2,p);
p=Insert(5,2,p);
cout<<"长度为: "<<length(p)<<endl;
List* po = FindKth(2,p);
if(po==NULL)
cout<<"不存在"<<endl;
else{
cout<<po->Date<<endl;
}
p=Delete(2,p);
po = FindKth(2,p);
if(po==NULL)
cout<<"不存在"<<endl;
else{
cout<<po->Date<<endl;
}
return 0;
}