C++中的动态数据存储——链表


我们所说的链表是一个动态的储存结构,链表中的元素称为节点,一般是一个结构体,包含若干个数据(各种类型)和一个指针(仅对与单向链表)。

每个节点中的指针指向下一个节点的地址,“Head”表示头指针,表示链表的开始,用来指向第一个节点,而最后一个节点的指针为NULL,表示链表的结束。

下面我们来熟悉下结构体中的指针操作:

指向结构体变量的指针变量:

我们定义

struct person
    {
    char name[50];
    char sex;
    int age;
    }
person per[3]={{},{},{}};

结构体的指针变量声明与一般指针基本相同: struct person *p;

若我们想引用per[0]中的age,有以下几种方法:

p=per;//把p指向p数组的第一个元素的地址
per[0].age; (*p).age; p->age;

若引用per[1]中的age,则变为:

p=per
p+1;

per[1].age;
(*p).age;
p->age;

一般来讲,我们都用第三种方式来达到最高的运行效率。

 下面是一个链表的示范:

struct Product{
    string Name;
    int Price;
    Product *next;
};

int _tmain(int argc, _TCHAR* argv[])
{
    int n = 2;             //总产品数为5

    Product *Head = NULL;
    Product *p = NULL;
    Product *node = NULL;  //这些都是Product型的指针

    for (int i = 0;i<n; i++)
    {
        node = new Product; // 
        cout << "Enter name of the product: ";
        cin >> node->Name;
        cout << "Enter the price of this product: ";
        cin >> node->Price;           //把输入的信息放入node中

        if (Head == NULL)  //若Head为NULL,说明还未被设置,这是第一个节点。
            Head = node;   //Head现在为node的地址,即第一个节点的地址。
        else               //若不是第一次,p就是上一个node
            p->next = node;    //p中的指针指向node,p是前一个节点的地址,node是这个节点的地址

        p = node;            //node变为p,p的地址变为这个node的地址                
        if (i == n)            //如果满
            p->next = NULL;    //这个p中的指针指向end
    }


    p = Head;            //输出前把p指向第一个节点的地址
    cout << endl;
    for (int i = 1; p != NULL; i++)    //p->next=NULL,则到头
    {
        cout << setw(6) << "Product_" << i << setw(6) << " Name:" <<setw(10)\
            <<p->Name<< setw(10) << "Price: " << setw(6)<<p->Price << endl;
        p = p->next;    //p指向下一个节点
    }
        
    Product*d;    //释放空间
    p = Head;
    while (p != NULL){
        d = p;
        p = p->next;
        delete d;
    }

    return 0;
}

值得注意的就是释放空间的方法,不能直接删除指针p,否则会丢失接下来节点的地址。

运行示范:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM