单项链表
什么是链表
简单来说,可以理解为一种数据结构类型,可以用结构体来理解(新手,有错大佬请指点)
链表由节点(链表中每一个元素叫节点)构成(可以很多),可以理解为在你运行程序时由你决定是否创建这个节点。节点由两个部分:
1. 数据域:储存数据元素
2.指针域:存放下一个节点的地址
如上图,在结构体 node 里存放的 data 就属于数据域,下面的next就是指向下一节点的指针
注意:节点的开辟是动态开辟的(malloc),属于堆
链表的创建
可以先创建一个虚拟头节点,方便之后对链表进行操作:
void dummyhead(node_t** head)
{
node_t* p=(node_t*)malloc(sizeof(node_t));
memset(p,0,sizeof(node_t));
p->next=NULL;
*head=p;
}
头插法
假设你已经有一个节点了,还行添加数据,如果使用头插法,会将它放在你第一个节点的前面
其实就是改变指针域,将你添加的节点的指针域指向 head所指向的那个节点,然后将head->next
指向所添加的节点。
//添加的新节点
node
//进行头插法
node->next=head->next;
head->next=node;
这样,你新添加的节点就变为了链表中的第一个
尾插法
就是将新节点放在链表的最后
bool creat_node(node_t* head,data_t* stu)
{
node_t* p=(node_t*)malloc(sizeof(node_t));
if(p==NULL)
{
printf("开辟节点失败\n");
return false;
}
memset(p,0,sizeof(node_t));
p->data=stu;
p->next=NULL;
node_t* tail=head;//将链表进行遍历,直到最后一位
while(tail->next!=NULL){
tail=tail->next;
}
//将节点插入
tail->next=p;
return true;
}