先放上来一个很好玩的网站:VisuAlgo
链表节点长什么样子
struct node{
ElementType data;
node *next;
};
操作
我不打算写ADT,因为我觉得ADT写出来会让人有一种惶恐感,本着实用的原则,我不想让大家还没用就有一种“天哪,这玩意这么复杂”的感觉。
这里我主要讲两种操作,只要这两种操作搞明白了,链表的增删查改也就完欧克。
创建链表
逆序创建:猫爪永远向上原理
void create()
{
node *head=NULL;//申请头指针,这时还没有为他分配指向的实际空间。
while(true)
{
node *temp=new node;//一下三步是新申请一个节点并初始化
cin>>temp->data;
temp->next=NULL;
//注意了,接下来的两句是关键,很有可能看不懂,但没关系,可以看代码下的解释
temp->next=head;
head=temp;
//那么何时停止呢?
if(getchar()=='\n')
break;//接收到回车符时停止,当然如果你是有标识的停止也可以将回车符改为任何的标志
}
}
说了这么多,其实关键的就两句:
temp->next=head;
head=temp;
你想象一下,你和你家猫咪在玩游戏,你把你的手放在了它的爪子上(第一句),主子不肯,就又把自己的爪子放在了你的上面。如此循环。。。还要注意,这是不带头节点的。
正序创建:插入第一个节点和插入其他节点有区别
void create()
{
node *head=NULL,*tail=NULL;
while(true)
{
node *temp=new node;
cin>>temp->data;
temp->next=NULL;
if(head==NULL)//插入的是第一个节点
{
head=temp;
tail=temp;
}
else//插入的不是第一个节点
{
tail->next=temp;
tail=temp;
}
if(getchar()=='\n') break;
}
}
遍历链表
无论插入删除查找都离不开遍历链表。
插入无非是找到指定位置,先将新节点的下一位置指向后一位,然后修改前一位的指针指向新节点。删除无非是,找到指定位置,其前一位的指针指向其下一位,断开next指针,释放。该孤立节点。
怎么安全遍历呢??
for(node*p=head;p!=NULL;p=p->next)
{
operation;
}