1.链表的实现
通过结构体实现链表 结构体中定义data存放数值,定义结构体指针存放地址
链表表里的每个数据包括数值以及地址,地址指向下一个数据的地址,在链表中数据的存放是不连续的,不同于数组,知道数组头就可以遍历整个数组。
通过t1的指针,间接输出t2,t3的数值(伪链表)
2.链表的静态添加和动态遍历
在链表末尾增加数据4,通过printflink函数打印数据,当head头指针指向为空时,遍历结束。
3.统计链表结点个数并遍历查找
4.链表从指定结点后插入新结点
例如:在结点3后面插入新的节点,该结点的数值为100
a)找到结点3 b)令新结点的指针指向结点3原本的指针指向 new->next=3->next
c)令结点3的指针指向新结点的地址3->next=new 注意:b与c的顺序不可调换
5. 链表从指定结点前插入新结点
分两种情况:1)头结点前边插入 2)普通结点前插入
a)判断是否在头结点前面插入,新结点的指针指向原来的头结点,返回新结点的地址,作为新的头指针 b)判断指针是否为空,通过指定结点前一个结点的指针获取指定结点的data,判断data的数值是否相等,令新节点的指针指向指定结点前一个结点的指针 new->next = p->next,指定结点前一个结点的指针指向新结点 p->next = new,返回原本的头指针(没进行头插入,head不变)
定义一个函数返回值为结构体指针,因为若在头结点前面插入新结点,会导致头指针改变
6. 链表中删除指定结点
分两种情况:1)删除头结点 2)删除普通结点
a)改头:判断头结点的data是否与删除结点data相同,令头结点head指向头结点的下一个节点,
head=head->next,释放结点free(p),返回新的头指针head
b)判断结点是否为空,判断p的data与要删除的data是否匹配,将p直接指向被删除结点的后一个结点 p->next=p->next->next,返回头指针head
注意:正常要free(p),释放空间,但此处为静态存储,会出现断错误。
7.链表的动态创建 -- 头插法
每个插入的新结点都是头结点,类似于栈,进入的数据往下压(入栈)
a)声明结构体指针new b)为结点开辟空间 c)输入结点的数值 d)新的头结点指向为旧的头结点,新结点成为头结点(头插法) e)判断原本的头结点是否为空,为空则创建的新结点为头结点head =new f)若想随心随欲的创建链表,则需要嵌套while,通过判断输入的数字是否为0,中断链表的创建,返回头指针
new->next=head head=new e)新的头结点指向新的new new->next=head
优化头插法 将函数拆分使其更合理
8.链表的动态创建 -- 尾插法
在链表的尾巴插入新结点,需要先遍历到链表尾
a)a)声明结构体指针new b)嵌套while,为结点开辟空间,输入结点的数值 c)判断输入的数值是否为0,为0则释放新开辟的new空间,返回头指针 e)判断链表是否为空,若为空则将new作为头结点,返回头指针,反之,若不为空,遍历到链表尾,令尾结点的指针指向为new新结点,p->next=new ,返回头指针