链表是顺序表的升级版,它的存储空间是不连续,因此在进行删除,插入操作的时候,不需要像顺序表一样把后面的所有元素进行前移覆盖,因此更加方便,下面我们首先用代码来创建一个链表。
一个结构体的节点由它存储的内容以及一个指向下一个结点的指针组成,可以把整个链表理解为一个打了很多结的绳子,一个节点由一个绳结和两段绳结之间的绳子组成,绳结就是数据域,即存储的数据内容,中间的绳子就是指针,连接两个不同的节点。
一.创建一个节点
typedef struct LNODE{
void* data;//定义一个空指针,因为还没有明确定义数据的类型
struct LNODE* next; /*这个就是指向下一个节点的指针
由于它指向的类型就是struct LNODE,因此这样命名*/
}LNODE,*LINK_NODE; /*这是两个别名,LNODE是struct LNODE的别名,
LINK_NODE是其指针,即struct LNODE*的别名*/
这样一个节点就创建好了。
二.创建完整的链表
typedef struct {
int size;//链表的长度
LINK_NODE nodes;//一个指向struct NODE 的指针,用于申请相应的内存来存储链表中的每个节点
}LINKED_LIST
以后我们在每次要定义一个链表的时候就只需要去直接使用LINKED_LIST就好了,比如:LINKED_LIST list1;就完成了一次定义。
三.对结点和链表进行初始化
我们写两个函数来为结点分配内存,为链表分配内存
LINK_NODE initNODE(LINK_NODE next,int datasize,const void*indata){
(LINK_NODE)newnode=(LINK_NODE)malloc(sizeof(LNODE));//给节点分配内存
newnode->data=mal