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