线性表的链式存储结构称为链表,每个结点不仅包括元素本身信息(数据域),而且也包括元素之间的逻辑关系,称为指针域
1:单链表
在每个结点中除了包含数据域外,还包含一个指针域,用于指向其后继结点.
- 带头结点的单链表中,头指针head指向头结点,头结点的值域不包含任何信息,后继结点开始存储数据信息.head->next=NULL时,链表为空
- 不带头结点的单链表中的头指针head指向开始结点,即图中的结点A1,当head=NULL时,链表为空,
注:在带或者不带头结点的链表中,头指针都指向链表的第一个结点,头结点是链表中的第一个结点,只作为链表存在的标志
单链表的基本运算
结构体定义
typedef struct LNode
{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode; //声明单链表结点类型
这里采用有头结点的单链表
头插法与尾插法分析
头插法
- 从一个空表开始,创建一个头结点。
- 依次读取字符数组a中的元素,生成新结点
- 将新结点插入到当前链表的表头上,直到结束为止。
void CreateListF(LinkNode *&L,ElemType a[],int n)
//头插法建立单链表
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->next=NULL;
for (int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data=a[i];
s->next=L->next; //将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}
采用头插法建表时单链表中的数据结点的顺序与数组a中的顺序相反