您的位置:首页 > 其它

链表的创建

2012-07-27 10:46 148 查看
昨天又开始复习数据结构了,满世界的书翻来翻去,就是不知道怎么看,没办法就先找了本数据结构的先看着,看到链表就头疼,以前学的时候也是半桶水在那晃来晃去的,根本就没有好好的看过,现在在看时,还是会模模糊糊的,好在还是一狠心,把它给吃透了,在这写下来给大家还在学链表的童鞋一个教程,尽量把我学的时候的难点写出来,其它的如果有什么不懂的可以留言问我。费话少说,开始:

ONE:

链表的创建,是链表中较重要的部分,只要链表创建好了,其它的什么添加、删除就好写了。首先,三个指针,head(头结点),pTail(本结点),pNext(下一个结点),有了这三个在加一个数据就可以开始了,来个简单的数据吧:

struct Node{
int data;
Node* next;
};

前面工作完成,下面我们来创建:

static Node* head;
Node* CreateList(){ //至少也要把头结点返回嘛,要不你去那找^-^是吧
Node *pTail,*pNext;
pNext = new Node; //生个新蛋出来;
head = pNext;    //头头肯定要指向它的;
pTail = pNext;   //因为只有一个,所以尾巴也要指向它。
cout<<"Please enter a number, with 0 at the end:"<<endl;
int temp = 0;
cin>>temp; //以上不解释;
if(temp){
pTail->data = temp;//把数据给刚刚新生出的蛋;
}else{
delete pNext;//如果第一个数就是0,那就不要它了,狠心呐;
head = NULL; //一个蛋都木有,头头也没法指了,让它为空
pTail = NULL;//它也理所当然为空了
return head; //OK,不用往下走了,返回头头。
}
while(temp){ //如果第一个数不为空的话
cout<<"Please enter a number, with 0 at the end:"<<endl;
cin>>temp;  //那就输入第二个数;
if(temp){
pNext = new Node;  //这数为真,就要新生个节点,
pNext->data = temp; //把这个数给这个节点,
pTail->next = pNext; //让第上个节点的next指向这个新开的节点,因为要串起来嘛。
pTail = pNext;//这个是把尾巴节点指向刚刚的新生出来的节点,我开始的时候会不理解这句,我把pTail理解成一个结构体了,结构体怎么能赋一个指针给它呢,其实它不是结构体,只是一个指针,指向这个结构体而已,用这个指针你可以找到这个结构体里面的元素进行修改和赋值,把这理解了我指针水平感觉又提高了,呵呵,说笑,继续下面。
}else{     //如果第二个数为空
pTail->next = NULL; //就把刚刚上一节点的next置空
pNext = NULL; //下面也不会在生出新节点了,置空
pTail = NULL; //它也不用指向尾巴节点了,
return head;  //返回头头
}
}
}
OK,这一个创建的就建成了,非常的简单,前提是在你理解的情况下,当你把这个彻底的理解后,那些什么链表啊,栈啊,都不在话下了。
其它的简单的我也顺便写一下吧,注释就不这么详细了,理解了上面的,其它的你都可以自己写了。

既然说了栈,就顺便把栈的特性也一起写出来算了,它的特性是“first in last out”,用链表实现如下:
[code]Node* stack(){ //和上面一样的注释就不写了,全手打,见谅
Node *pTail,*pNext;
pNext = new Node;pTail = pNext;head = pNext;
int temp = 0;
cout<<"Please enter a number, with 0 at the end:"<<endl;
cin>>temp;
if(temp){
pTail->data = temp;
pTail->next = NULL;//因为它是栈,所以最先进来,最后出去,所以第一个点就是链表的最后一个点;
}else{
delete pNext;head = NULL;pTail = NULL;
return head;
}
while(temp){
cout<<"Please enter a number, with 0 at the end:"<<endl;
cin>>temp;
if(temp){
pNext = new Node;
pNext->data = temp;
head = pNext; //因为每new出来的新点都是要在最前面
pNext->next = pTail;//它的下一个节点是pTail,所以新new出来的这个pNext节点它要指向pTail,
pTail = pNext; //然后pTail这个指针就不指向老节点了,它要指向刚刚新生出来的这个点,这样,pNext就可以松开,好指向用户再次new出来的节点.
}else{
pTail = NULL;pNext = NULL;return head;
}
}
}

其实栈也就改变了一点点而已,所以说理解了一个,其它的就都类似了。如果有图的话可以让大家更好理解,可惜不会画图,也太麻烦,呵呵。

见谅。

有兴趣的童鞋可以实现下有序的,从小到大的插入到链表中。^-^

————————分———————————隔——————————————一——————^-^———————————下————————————————

下面就都是简单的了:

TWO:

显示链表:

void ShosList()
{
Node* temp = head;
int i = 0;
while(temp){
cout<<"第"<<i<<"个节点,内容为:"<<temp->data<<endl;
temp = temp->next;
}
}
显示的比较好写

THREE:
插入链表:

Node* Insert(int data)
{
Node* temp = head;
while(TRUE)
{
if(temp->next == NULL)//一直往下找,找到最后一个节点
{
Node* target = new Node;
target->data = data;
target->next = NULL;
temp->next = target;
break;  //要记得加呀,如是不加你可以试试,它会在几十秒内把你内存占满(可以邪恶下);
}else{
temp = temp->next;
}
}
} 这个我只是插到最后,你可以优化,e,g:指定位置插入,插入时排序。。等


其它的我感觉也没什么好写的了吧,大家可以自己写成,主要是自己的思路,有了这东东,什么都好解决,这么多完全靠自己手打,
没有CP一个字符,如果转载的话请注明出处:/article/7310281.html
谢谢,如果写得不好,请大侠们赐教一下,大家一起交流交流。

[/code]

本文出自 “西边太阳” 博客,请务必保留此出处/article/7310281.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: