不带头结点的链表基础操作(初始化,增删改查)

首先我们要想,一个结点里面要有什么?
一个是数据域,第二个是指针域,指向下一个结点,所以我们用一个结构体来包括一个结点所需要的这些内容。
这是链表中的一个结点的内容
不带头结点的链表基础操作(初始化,增删改查)
SListDataType这个类型,是用户自定义类型,可以是int ,double,char,还可以是一个结构体类型。
不带头结点的链表基础操作(初始化,增删改查)
而这个结构体里,就是链表的创建,里面是第一个结点的指针。
不带头结点的链表基础操作(初始化,增删改查)
初始化,首先传一个链表的结构体指针,第一步判断指针是否为空,此处用断言判断,第二步初始化,给第一结点指空。
不带头结点的链表基础操作(初始化,增删改查)
头插,时间复杂度为O(1),传进来连边的结构体指针,和要给结点里附的值。

	一 创建新结点。
	二新的结点里的数据域里附传进来的值
	三新建结点的指针域指向第一个结点
	四第一个结点指向新建结点,让新建结点作为新的链表的第一个结点

不带头结点的链表基础操作(初始化,增删改查)
尾插,有循环,O(n)

一,创建新结点,新结点数据域赋值,新结点指针域指控。
二,判断链表是否为空,如果为空,把让链表的第一个结点指针指向新建的结点。
三,找最后一个结点,隐藏着链表一定有结点,创建一个新指针指向链表第一个结点,当指针不为空时,指针往后移。循环结束后,最后一个结点的指针域指向新建结点

不带头结点的链表基础操作(初始化,增删改查)
头删

一,首先判断,如果没有链表,没有结点不能删。
二 新建指针指向第一个结点的下一个结点.
三 释放第一个结点。
四 第一个结点指向新建指针。

不带头结点的链表基础操作(初始化,增删改查)
尾删 O(n)

一,首先判断第一个结点 assert(s != NULL);			// 不能没有链表
                    assert(s->first != NULL);      不能没有结点
 二,如果链表中只有一个结点,直接释放
 三,否则,创建新指针指向头结点,**当下下一个结点不为空,指针指向下一个。释放下一个结点**,最后指空

不带头结点的链表基础操作(初始化,增删改查)
查找

一 遍历链表,找到数据域里的值相同时,返回。

不带头结点的链表基础操作(初始化,增删改查)
删除多个值相同的结点

一判断是否为空
二 判断是否只为一个结点
三 创建新指针cur指向第一个结点,当该结点下一个不为空时,如果结点下一个的数据域里的值等于要删的值,创建新指针指向下下一个结点
四 然后释放当前结点,并让cur指向下一个结点。