怎样用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;
}