以下是本人(初入门)对于链表这个板块的基础认识以及理解,如果有错误麻烦大家指出,我会及时修改
一、链表的概述:
首先我们要知道链表是什么?以及链表的基础知识,此标题下的内容将会带大家去对链表进行一个基本的理解
1.链表——是线性表的链式存储表,满足线性逻辑关系结构;
相邻元素之间使用数据结点存储空间指针表示数据的元素之间的逻辑关系结构。
二、链表类型:
2.1单向链表和双向链表:
单向链表:只能单向访问,后继结点没有前驱结点的指针而不能访问前驱结点。
双向链表:可以实现对前驱结点和后继结点的双向访问
2.2单头结点链表和不带头结点链表
可以根据链表中起始结点是否为固定的结点,将链表分为带头结点链表和不带头结点链表。
带头结点链表:
起始结点的数据域为无效数据域,不参与链表的运算。在整个链表访问过程中,起始结点为固定结点,称为头结点。
不带头结点链表:
起始结点的数据域为有效数据域,参与链表的运算。在整个链表访问过程中,起始结点随着链表中元素的插入和删除等发生改变。
2.3带环链表和不带环链表
根据链表中是否存在环,将链表分为带环链表和不带环链表
带环链表:
所谓的带环链表,指的是链表存在环形结构,在访问的时候,环中的结点可以被重复多次访问。
不带环链表:
所谓的不带环链表,指的是链表不存在环形结构,在访问的时候,链表中的所有结点访问且仅只能访问一次。
三、链表的创建:
3.1创建头结点:
实质创建空链表,其头结点的数据域为无效数据域,不用做数据的设置;其指针域没有执行,设置为NULL值。
node_t CreateLinkList(void)
{
node_t *head;
/* 动态开辟头结点存储空间 */
head = malloc(sizeof(node_t));
if(head == NULL)
return NULL;
memset(head, 0, sizeof(node_t)); /* 将头结点空间数据清零 */
head->next = NULL; /* 头结点next域没有指向表示为空链表 */
return head;
3.2插入结点的方式:
实现插入结点的函数的代码:
int InsertLinkList(node_t *head, int local, data_t mydata)
{
int i;
node_t *p = head;
node_t *q;
/* 判断链表是否存在 */
if (head == NULL)
return -1;
/* 找到需要插入结点的前一个结点p */
for (i = 0; i < local; i++) {
p = p->next;
if (p == NULL)
return -1;
}
/* 创建需要插入结点q,并初始化数据 */
q = malloc(sizeof(node_t));
if (q == NULL)
return -1;
q->data = mydata;
/* p结点插入结点q */
q->next = p->next;
p->next = q;
return 0;
}
3.3链表的遍历:
遍历指的是起始有效数据结点开始将链表中的所有结点都访问且仅访问一次
void DisplayLinkList(node_t *head)
{
node_t *p = head->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}