一、定义说明:
单链表是通过一组任意的存储单元来存储线性表中的数据元素。每个结点都有data数据域(用来存放数据元素)和next指针域(用来存放后继节点的地址)。
对于顺序表,单链表可以解决顺序表需要一整个大量的连续的存储单元的缺点,单链表的元素可以离散地分布在存储空间中,即非随机存取的存储结构,不能直接找到表中某个特定的结点,当查找某个特定的结点时,需要从表头开始一个一个遍历。因为单链表附加了指针域,缺点就是存储空间增大。
单链表有带头结点和不带头结点两种类型。引入头结点的好处:①便于第一个结点的处理:增加头结点后,第一个结点的地址保存在头结点的指针域中,则对链表的第一个元素的操作和其他元素相同,无需进行特殊处理。(若单链表不带头结点,则第一个结点无前驱结点,在其前插入结点和删除该结点操作复杂些。)②便于空表和非空表的统一处理:增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。
二、带头结点的程序说明
2.1 单链表的存储结构
typedef struct LNode {
Elemtype data; //数据域
struct LNode* next; //指针域
}LNode, * LinkList;
2.2 初始化
bool Initlist(LinkList &L)
{
//L = (LinkList)malloc(sizeof(LNode)); //c语言定义头结点
L = new LNode; //定义头结点
L->next = NULL; //尾指针为空,头结点指向空
return true;
}
2.3 头插法建立单链表
void List_HeadInsert(LinkList& L)
{
int n; //输入元素的个数
cout << "头插法--请输入元素个数n:" << endl;
cin >> n;
LinkList s; //定义指针变量s
cout << "请依次输入元素:" << endl;
while (n--)
{
s = new LNode; //定义变量结点
cin >> s->data;
s->next = L->next;
L->next = s;
}
}
2.4 尾插法建立单链表
void List_TailInsert(LinkList& L)
{
int n; //输入元素的个数
cout << "尾插法--请输入元素个数n:" << endl;
cin >> n;
LinkList r; //定义一个表尾指针
r = L;
LinkList s;//定义指针变量s
cout << "请依次输入元素:" << endl;
while (n--)
{
s = new LNode;
cin >> s->data;
s -> next = NULL;
r->next = s;
r = s;
}
}
2.5 打印链表
void Print_list(LinkList& L)
{
LinkList s;
s = L->next;
while(s)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
2.6 求链表的长度
int Length_list(LinkLi