链表主要就单链表、循环链表和双向链表3种链表进行讨论。
C/C++进阶之路zhuanlan.zhihu.com一、单链表
概念:所谓单链表,是指数据结点是单向排列的。一个单链表结点,其结构类型分为两部分:
(1)数据域:用于存储数据元素的值。
(2)指针域(链域):用于存储下一个结点地址或者说指向其直接后继结点的指针。
算法:
一般声明3个指针来操作链表:
head:用来指向链表的头部。链表需要一个指针来标识链表,这就是头指针。
p1:用来指向新结点,以及用来遍历链表的每一个结点。
p2:用来指向当前结点。
(1)单链表创建算法
创建结点数目为n的链表:
#include
typedefstructnode
{
intnum;//数值域structnode *next;//指针域}stud;
stud* Create(intn)
{
stud *head,*p1,*p2;
head=p1=p2=NULL;
for(inti=0;i
{
p1=(stud*)malloc(sizeof(stud));
p1->num=i;
if(i==0)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
}
p2->next=NULL;
returnhead;
}
(2)单链表的查找算法
在头指针为head的单链表中查找i:
typedefstructnode
{
intnum;
structnode *next;
}stud;
stud* Find(stud *head,inti)
{
stud *p1;//遍历链表指针p1=head;
while(p1!=NULL)
{
if(i==p1->num)
{
break;
}
else
{
p1=p1->next;
}
}
returnp1;
}
(3)单链表删除算法
在头指针为head的单链表中删除i:
#include
typedefstructnode
{
intnum;
structnode *next;
}stud;
boolDelete(stud *head,inti)
{
boolflag=false;
if(head)//不是空链表{
stud *p1,*p2;
p1=head;
while(p1->num!=i && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->num==i)
{
if(p1==head)
{
head=head->next;
}
else
{
p2->next=p1->next;
}
free(p1); //释放已经脱离链表的结点内存
flag=true;
}
}
returnflag;
}
(4)单链表插入算法
在头指针为head的单链表中插入结点p:(假设这是一个由小到大排序的有序链表)
typedefstructnode
{
intnum;
structnode *next;
}stud;
stud* Insert(stud *head,stud *p)
{
stud *p1,*p2;
p1=head;
if(!head)
{
head=p;
head->next=NULL;
}
else
{
while(p->num > p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p->num < p1->num)
{
if(head==p1)
{
head=p;
p->next=head;
}
else
{
//把p插入p2和p1之间p2->next=p;
p->next=p1;
}
}
else
{
//把p插入链表的尾部,此时p1指向尾部结点p1->next=p;
p->next=NULL;
}
}
returnhead;
}
“我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。免费送给大家。这里是编程爱好者的聚集地,欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。
关注我的专栏带你遨游代码的世界!
C/C++进阶之路zhuanlan.zhihu.com最后分享一张C/C++学习路线图给爱学习的小伙伴们