我们所说的链表是一个动态的储存结构,链表中的元素称为节点,一般是一个结构体,包含若干个数据(各种类型)和一个指针(仅对与单向链表)。
每个节点中的指针指向下一个节点的地址,“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,否则会丢失接下来节点的地址。
运行示范:

