怎样用ps设计网站模板,公司网络搭建,科技网站制作公司,莒县建设局网站目录 链表的分类
双向链表的实现
1#xff09;定义链表
2#xff09;初始化双向链表
3#xff09;申请节点
4#xff09;尾插
5#xff09;头插
6#xff09;打印链表
7#xff09;尾删
8#xff09;头插
9#xff09;查找
10#xff09;指定位置删除
11…目录 链表的分类
双向链表的实现
1定义链表
2初始化双向链表
3申请节点
4尾插
5头插
6打印链表
7尾删
8头插
9查找
10指定位置删除
11在指定位置后删除
12销毁链表 链表的分类
根据链表的三个特点带头/不带头单向/双向循环/不循环可以将链表分为8种。常见的有两种单链表单向不带头不循环链表双链表双向带头循环链表。是否带头指的是有没有头节点。链表全网最详细-CSDN博客。单链表已经写过了此处我们将双链表。
双向链表的实现
1定义链表
typedef int SLDateType;//定义双向链表
typedef struct ListNode
{SLDateType date; //节点中的邮箱有效数据struct ListNode* next; //保存下一个节点地址struct ListNode* prev; //保存上一个节点的有效地址
}LN;
2初始化双向链表
双链表的初始化主要是创建头节点即哨兵位。
//双链表的初始化
void List_start(LN** head)
{*head (LN*)malloc(sizeof(LN));(*head)-date -1;//给哨兵位一个数据但是它其实是无效数据//注意因为是循环链表所以当只有一个哨兵位的时候要让它指向它自己(*head)-next (*head)-prev (*head);
}
3申请节点
//申请节点
LN* ListBuyNode(SLDateType x)
{LN* newnode (LN*)malloc(sizeof(LN));newnode-date x;//因为是双向循环链表永远不会走到空所以将新节点也指向其自己newnode-next newnode-prev newnode;return newnode;
}
4尾插
注意除了双向链表的初始化以及销毁要传二级指针其他函数均采用一级指针因为哨兵位在被定义后就不能再对他进行修改了。
//双向链表的尾插
void SLpushback(LN* head, SLDateType x)
{LN* newnode ListBuyNode(x);//对头节点head尾节点head-prev新节点newnodenewnode-next head;newnode-prev head-prev;head-prev-next newnode;head-prev newnode;
}
5头插
头插是指查到烧饼位的后面。
//双向链表的头插
void SLpushfront(LN* head, SLDateType x)
{LN* newnode ListBuyNode(x);//对head newnode head-next进行修改newnode-next head-next;newnode-prev head;head-next-prev newnode;head-next newnode;
}
6打印链表
//打印双向链表
void SLPrint(LN* head)
{LN* pcur head-next;while (pcur ! head){printf(%d , pcur-date);pcur pcur-next;}
}
7尾删
//双链表尾删
void SLDelback(LN* head)
{//对head head-prev head-prev-prevLN* del head-prev;head-prev del-prev;del-prev-next head;free(del);del NULL;
}
8头插
//双链表的头插
void SLDelfront(LN* head)
{//对head head-next head-next-next进行调整LN* del head-next;head-next del-next;del-next-prev head;
}
9查找
找双向链表中查找数据并返回节点
//双链表的查找
LN* SLFind(LN* head,SLDateType x)
{LN* pcur head-next;while (pcur ! head){if (pcur-date x)return pcur;pcur pcur-next;}return NULL;
}
10指定位置删除
//指定位置删除
void SLDEL(LN* head, LN* pos)
{//删除pos节点//对pos-prev pos pos-next进行操作pos-prev-next pos-next;pos-next-prev pos-prev;free(pos);pos NULL;
}
11在指定位置后删除
//在指定位置后插入
void LInsert(LN* pos, SLDateType x)
{LN* newnode ListBuyNode(x);//对pos newnode pos-nextnewnode-next pos-next;newnode-prev pos;pos-next-prev newnode;pos-next newnode;
}
12销毁链表
//销毁链表
void LDestory(LN** head)
{//循环删除节点LN* pcur (*head);while (pcur ! *head){LN* next pcur-next;free(pcur);pcur next;}free(*head);*head NULL;
}