链表的创建和遍历

如果任何一个分配给我们的结构变量失去了指向它的指针,那么
这个内存空间将无法释放,就造成了内存泄漏。由于指针还维系着各结点之间关系,指针
的丢失造成了结点之间断开,整个链表就此被破坏。
所以,我们要保证每个结点都在我们的控制之内,即我们能够通过各种手段,利用指
针访问到链表的任一个结点。这也是我们在所有对链表的操作过程中始终要注意的一点。
/*链表的创建和遍历
(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;
}

posted on 2010-04-12 16:12  王六石  阅读(1507)  评论(0编辑  收藏  举报

导航