我們所說的鏈表是一個動態的儲存結構,鏈表中的元素稱為節點,一般是一個結構體,包含若干個數據(各種類型)和一個指針(僅對與單向鏈表)。
每個節點中的指針指向下一個節點的地址,“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,否則會丟失接下來節點的地址。
運行示范: