单向链表的查找
什么是链表?
1.和数组一样,链表也是一种线性表 。
2.从内存结构来看:链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。
3.链表中的每一个内存块被称为节点Node。节点除了存储数据之外,还要记录链上 下一个节点的地址,即后继指针next。
1.查找单向链表的尾结点
利用单向链表尾结点的特点:其指针域为NULL。构建的查找函数代码如下:
PLAYER *Findlast(PLAYER *head){ //定义一个查找函数
PLAYER *pr;
pr=head;
while(pr->next!=NULL) //利用尾结点的指针域为NULL
pr=pr->next; //一直向后移动直至找到尾结点
return pr;
}
2.查找单向链表的第n个节点
利用计数器去记录已经遍历的节点个数,查找到第n个节点后直接返回。
PLAYER *Find(PLAYER *head, int index){
PLAYER *Pt=head;
int i=1;
while(i<index&&Pt!=NULL) //限制n小于节点总数
{
Pt=Pt->next;
i++;
}
return Pt; //若已经找到则直接返回,没有找到则返回0;
}
单向链表的增添
1.在尾部添加一个节点
PLAYER *insert(PLAYER *head){
PLAYER *prePt *Pt;
Pt=(PLAYER*)malloc(sizeof(PLAYER));
scanf(" ", ); //输入新增节点所包含的信息
prePt=Findlast(head);
prePt->next=Pt;
prePt->next=NULL; //使新增节点成为新的尾结点
return head;
}
2.在第n个节点之后插入一个新的节点
让第n个节点的指针域指向新的节点,新节点的指针域指向第n+1个节点。
PLAYER *insert(PLAYER *head){
PLAYER *prePt *Pt;
Pt=(PLAYER*)malloc(sizeof(PLAYER));
scanf(" ", ); //输入新增节点所包含的信息
prePt=FindNode(head, index) //复制第n个节点的地址
if(prePt!=NULL){ //判断n是否超出范围
Pt->next=prePt->next; //这两项顺序不能调整否则会导致新节点的指针域存储自身地址,自身成环
prePt->next=Pt;
}
else printf("将在尾部或其它未知位置插入");
return head;
}
单向链表的删除
让第n-1个节点的指针域直接跳过第n个节点指向第n+1个节点,要记得释放要删除的节点的内存。
PLAYER *Delete(PLAYER *head,int index){
PLAYER *Pt=head,prePt=NULL;
int i=0; //直觉告诉我这个没有什么用
prePt=Find(head,index-1);
if(Pt!=NULL){
prePt->next=Pt->next;
free(Pt); //释放Pt所占空间
}
else printf("There is no node\n");
return 0;
}
单向链表的修改
先删除指定的节点然后在原位置上增加新节点
PLAYER *Replace(PLAYER *head, int index){
PLAYER *Pt=head,prePt=NULL,*old,*new;
int i=0;
prePt=Find(head,index-1);
if(Pt!=NULL){
prePt->next=Pt->next;
free(Pt);
}
new=(PLAYER*)malloc(sizeof(PLAYER));
scanf(" ", );
old=FindNode(head, index)
if(old!=NULL){
new->next=old->next;
old->next=new;
}
刚开始接触链表理解不够深,文字表述较少,方法较笨,如有表述不当之处请多多指教。
参考资料来源《中国大学MOOC》中的视频讲解以及“白色石头”的文字表述。