目录
一、搞清楚原理
- 包括定义(2),申请空间,释放空间,插入,删除,展示链表。
- 链式访问解决顺序存储需要太大的连续空间,实现离散空间组成逻辑上的顺序。
必要记住:
插入:
(这时候p就相当与B了好像)两行代码实现
铭记步骤:
1、申请空间
2、找到待操作的前一个结点,p指向前一个结点
3、先处理新节点
4、后处理老节点
删除(!备份):
必要知道:
遍历链表:借助辅助指针。站在一个节点上,先后看条件是否满足。
struct node*p;
while(p){
//.....
p=p->next;
}
while(p&&p->next){
//......
p=p->next;
}
二、<.h>中,所有声明
代码实现
给元素类型起一个别名:
typedef int element;
<.h中声明>:
//
// Created by ljf88 on 24-5-4.
//
#ifndef LINKLIST_H
#define LINKLIST_H
typedef int Elemet;
//表
typedef struct Listnode//此处注意,要先给这个起好名字,不然用不了
{
Elemet val;
struct Listnode*next;
}Listnode;
//头
typedef struct
{
Listnode header;
int num;
}LinkList;
//对接口的操作,申请、释放
LinkList*createLinkList( );
void releaseLinkList(LinkList*link);
void releaseLinkList1(LinkList*link);
//对表的操作。插入(头插法、任意位置插入、尾插法)、删除。展示
int insertLinkListheader(LinkList*link,Elemet val);
int insertanyPos(LinkList*link,int pos,Elemet val);//找位置函数
int inserttail(LinkList*link,Elemet val);
int deleteLinkList(LinkList*link,Elemet val);
void showLinkList(const LinkList*link);
#endif //LINKLIST_H
三、实现代码过程中的错误(造的孽)
1)插入函数(头插法)
图示:
错误代码:
疑问:
1、框内应该改成P。为什么要引入辅助指针?
2、如何更新表头?
注意:
1、引入辅助指针,是表的不是表头的。引入辅助指针的时候,已经顺便把它指向了链表的第一个结点。
2、需要申请一个新结点放val。并给它申请空间
3、更新”表头“,是对头更新,头的num表示总数。
2)show函数-遍历-输出
错误代码:
做个逻辑大题是对的。
疑问:
怎么一个一个沿着链表表示出来感觉有点模糊??
解决:
1、也需要引入辅助指针,辅助指针指向链表的第一个哦。
2、链式结构遍历模板记一下。使用while,不用for。
3)释放空间
错误代码:
疑问:
怎么释放?
3)删除函数
疑问:
1、怎么找到这个元素?函数??不是。用while就可以了。
2、怎么备份?引入临时指针tmp,备份然后释放。
4)释放空间函数、
错误代码:
正确步骤:
1、辅助指针,指向第一个。
2、临时指针,用来备份。备份好像是为了让指针p成功沿着链表一个一个走过去。
3、一个一个释放
4、更新表头
5、释放表头
5)任意位置插入函数
问题:
1、忽略了第一步范围校验。