链表是一种物理存储单元上不连续的存储结构,数组元素之间通过链表中的指针进行链接。链表是由一系列的结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包含两部分,一个是存储数据的数据域,另一个是存储下一结点地址的指针域。
链表允许在任意位置插入或删除结点,但是不支持随机访问结点,只能从头结点逐个访问每个结点。一般在一些需要快速插入或删除,而不太关心或者不需要随机访问的情况下使用。
#include <iostream> using namespace std; //用结构体类型来表示一个结点 typedef struct node { ? ? //数据域 ? ? char name[20]; ? ? int age; ? ? //指针域 ? ? struct node* next; }student;//typedef是重命名,下面申明结点时不用写struct node,而用student代替 //创建链表 student * createlist(int n)//n表示结点个数 { ? ? student* head = new student;//头结点,动态,存在堆上 ? ? //一般头结点不存储数据 ? ? //student head;//存在栈上,用于函数内部,所以一般情况下,结点都是动态生成 ? ? student* pre = head;//pre用来记录上一个结点 ? ? //利用for 循环构建结点 ? ? for (int i = 0; i < n; i++) ? ? { ? ? ? ? student* p = new student; ? ? ? ? cin >> p->name >> p->age; ? ? ? ? pre->next = p; ? ? ? ? pre = p; ? ? ? ? p->next = NULL; ? ? } ? ? return head; } void display(student* head) { ? ? student* p = head->next;//p为第一个结点 ? ? while (p!=NULL) ? ? { ? ? ? ? cout << p->name << " " << p->age<<endl; ? ? ? ? p = p->next; ? ? } } int main() { ? ? int n = 5; ? ? student *head=createlist(n); ? ? display(head); ? ? return 0; }
|