一:基本概念
- 数组的不足:
1.大小必须在定义时确定
2.占用连续空间,导致小空间无法充分利用
3.在插入/删除元素时必须前后移动元素 - 结点:存放数据的基本单位
1.数据域:存放数据的值
2.指针域:存放下一个同类型结点的地址
链表与数组的比较:
- 链表:由若干结点构成的链式结构
- 表头结点:第一个结点
- 表尾结点:链表的最后一个结点,指针域为空
- 头指针:指向链表表头节点的指针
二:链表的建立、输出和释放
1.建立链表
struct student {
string name;
int num;
char sex;
struct student* next; //指向结构体的指针(下一个结点)
};
student* head = NULL, * p = NULL, * q = NULL;
int i;
/*链表的建立*/
for (i = 0; i < 5; i++)
{
if (i > 0)
q = p;
p = new(nothrow) student;
if (p == NULL)
return -1;
if (i == 0)
head = p;
else
q->next = p;
cout << "请输入第" << i + 1 << "个人的基本信息" << endl;
cin >> p->name >> p->num >> p->sex;
p->next = NULL;
}
2.输出链表
/*链表的输出*/
p = head; //p复位
while (p != NULL)
{
cout << p->name << " " << p->num << " " << p->sex << endl;
p = p->next;
}
3.释放链表
/*链表的释放*/
p = head; //p复位
while (p)
{
q = p->next;
delete p;
p = q;
}
三:结点的删除与插入
1.删除
/*结点的删除*/
p->next = t->next;
delete[]t;
2.插入
/*结点的插入*/
student *np = new(nothrow) student;
if (np == NULL)
return -1;
//输入新节点信息(略)
student *t = head->next;
head->next = np;
np->next = t;