链表
首先是结构体
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 23:41:29