链表的创建和遍历
如果任何一个分配给我们的结构变量失去了指向它的指针,那么
这个内存空间将无法释放,就造成了内存泄漏。由于指针还维系着各结点之间关系,指针
的丢失造成了结点之间断开,整个链表就此被破坏。
所以,我们要保证每个结点都在我们的控制之内,即我们能够通过各种手段,利用指
针访问到链表的任一个结点。这也是我们在所有对链表的操作过程中始终要注意的一点。
/*链表的创建和遍历
(1)由于第一个结点也是动态分配的,因此一个链表始终要有一个指针指向它的表头,否
则我们将无法找到这个链表。我们把这个表头指针称为 head。
(2)在创建一个多结点的链表时,新的结点总是连接在原链表的尾部的,所以我们必须要
有一个指针始终指向链表的尾结点,方便我们操作。我们把这个表尾指针称为 pEnd。
(3)每个结点都是动态分配的,每分配好一个结点会返回一个指针。由于 head 和 pEnd 已
经有了各自的岗位,我们还需要一个指针来接受刚分配好的新结点。我们把这个创建结点的
指针称为 pS。
(4)在遍历的过程中,需要有一个指针能够灵活动作,指向链表中的任何一个结点,以读
取各结点的数据。我们把这个访问指针称为 pRead。
(5)我们把创建链表和遍历各自写为一个函数,方便修改和维护。 */
#include "iostream.h"
struct node//定义结点的结构类型
{
char data;
node *next;
};
node *creat();//创建链表,返回表头,
void showlist(node *head);//遍历链表的函数,参数为表头
int main()
{
node *head;
head=creat();//以head 为表头创建一个链表
showlist(head);//遍历以 head 为表头的链表
return 0;
}
node *creat()
{
node *head=NULL;//表头指针,一开始没有任何结点,所以为 NULL
node *pEnd=head;//表尾指针,一开始没有任何结点,所以指向表头
node *pS;//创建新结点时使用的指针
char temp;
cout<<"Please input a string end with'#':"<<endl;
do
{
cin>>temp;
if (temp!='#')
{
pS=new node;//使用 new 操作符后,会返回一个对应数据类型的指针,该指针指向了空间的首元素。
pS->data=temp;
pS->next=NULL;
if (head==NULL)
{
head=pS;
}
else
{
pEnd->next=pS;
}
pEnd=pS;
}
} while (temp!='#');
return head;
}
void showlist(node *head)
{
node *pRead=head;
cout<<"The data of the link list are:"<<endl;
while(pRead!=NULL)
{
cout<<pRead->data;
pRead=pRead->next;
}
cout<<endl;
}
这个内存空间将无法释放,就造成了内存泄漏。由于指针还维系着各结点之间关系,指针
的丢失造成了结点之间断开,整个链表就此被破坏。
所以,我们要保证每个结点都在我们的控制之内,即我们能够通过各种手段,利用指
针访问到链表的任一个结点。这也是我们在所有对链表的操作过程中始终要注意的一点。
/*链表的创建和遍历
(1)由于第一个结点也是动态分配的,因此一个链表始终要有一个指针指向它的表头,否
则我们将无法找到这个链表。我们把这个表头指针称为 head。
(2)在创建一个多结点的链表时,新的结点总是连接在原链表的尾部的,所以我们必须要
有一个指针始终指向链表的尾结点,方便我们操作。我们把这个表尾指针称为 pEnd。
(3)每个结点都是动态分配的,每分配好一个结点会返回一个指针。由于 head 和 pEnd 已
经有了各自的岗位,我们还需要一个指针来接受刚分配好的新结点。我们把这个创建结点的
指针称为 pS。
(4)在遍历的过程中,需要有一个指针能够灵活动作,指向链表中的任何一个结点,以读
取各结点的数据。我们把这个访问指针称为 pRead。
(5)我们把创建链表和遍历各自写为一个函数,方便修改和维护。 */
#include "iostream.h"
struct node//定义结点的结构类型
{
char data;
node *next;
};
node *creat();//创建链表,返回表头,
void showlist(node *head);//遍历链表的函数,参数为表头
int main()
{
node *head;
head=creat();//以head 为表头创建一个链表
showlist(head);//遍历以 head 为表头的链表
return 0;
}
node *creat()
{
node *head=NULL;//表头指针,一开始没有任何结点,所以为 NULL
node *pEnd=head;//表尾指针,一开始没有任何结点,所以指向表头
node *pS;//创建新结点时使用的指针
char temp;
cout<<"Please input a string end with'#':"<<endl;
do
{
cin>>temp;
if (temp!='#')
{
pS=new node;//使用 new 操作符后,会返回一个对应数据类型的指针,该指针指向了空间的首元素。
pS->data=temp;
pS->next=NULL;
if (head==NULL)
{
head=pS;
}
else
{
pEnd->next=pS;
}
pEnd=pS;
}
} while (temp!='#');
return head;
}
void showlist(node *head)
{
node *pRead=head;
cout<<"The data of the link list are:"<<endl;
while(pRead!=NULL)
{
cout<<pRead->data;
pRead=pRead->next;
}
cout<<endl;
}
![](http://img.zemanta.com/pixy.gif?x-id=570c6436-ff26-8543-833a-88cb4e2f4efc)