C++之链表
一、链表简介
链表是一种物理存储单元上下不连续的存储结构,数据元素之间是通过链表中的指针进行链接。链表是由一系列的节点(链表中每一个元素称为节点)组成,节点可以在运行时动态生成。
每一个节点都包含两个部分:一个是存储数据的数据域,另一个是存储下一个节点地址的指针域。
一般链表在一些需要快速插入/删除,而不太关心或者不需要随机访问的情况下使用。
链表相对于数组:链表允许在任意位置插入或删除节点,但是链表不支持随机访问节点,只能从头节点逐个访问(遍历)每一个节点。
链表分为三种:单向链表、双向链表以及循环链表。
单向链表:包含两个域:一个数据域和一个指针域,它可以向一个方向遍历;
双向链表:每个节点中有数据域和指针域,前面的指针指向前一个节点,后一个指针指向下一个节点;
循环链表:首节点和末节点被连在一起,它可以被视为“无头无尾”。这种链表比较有利于数据存储缓存。
二.链表使用范例
/*********************************链表使用范例****************************************/
#include <iostream>
using namespace std;
//用结构体类型表示一个节点
typedef struct node
{
char name[20];
int age;
struct node *next;
}Student;
//创建链表
Student *createList(int n)
{
Student *head = new Student;//头节点 一般不存储数据
Student *pre = head;
for (int i = 0; i < n; i++)
{
Student *p = new Student;
printf("请输入第%d个学生的姓名和年龄:", i + 1);
cin >> p -> name;
cin >> p->age;
pre->next = p;
pre= p;
p->next = NULL;
}
return head;
}
void display(Student *head)
{
Student *p = head->next;
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;
}