双链表
对双链表进行头插法,尾插法,删除节点,遍历打印
前言
对双链表进行头插法,尾插法,删除节点,遍历打印
一、双链表结构和初始化
typedef struct Node { //Node结构体
int data; //data数据域
struct Node* pre; //pre前指针域
struct Node* next; //next后指针域
}Node;
Node* initList(void) //初始化链表
{
Node* list = (Node*)malloc(sizeof(Node)); //分配一个list
list->data = 0; //头部data记录当前链表的长度
list->pre = NULL; //pre指向NULL
list->next = NULL; //next指向NULL
return list;
}
二、插入
1.头插法
代码如下(示例):
void headInsert(Node* list, int data) //头插法
{
Node* node = (Node*)malloc(sizeof(Node)); //定义一个node
node->data = data; //data
node->next = list->next; //node的后指针指向list的后指针
node->pre = list; //node的前指针指向list
if (list->next) //如果list的后指针不为NULL
{
list->next->pre = node; //list的后指针指向的前指针指向node
list->next = node; //list的后指针指向node
list->data++; //list头部的data++
}
else{ /*如果list的next等于NULL*/
list->next = node; //list的后指针指向node
list->data++; //头部data++
}
}
2.尾插法
代码如下(示例):
void tailInsert(Node* list, int data) //尾插法
{
Node* node = list; //node
Node* n = (Node*)malloc(sizeof(Node)); //n开辟新空间
n->data = data; //data
while (node->next) //循环找到最后一个节点
{
node = node->next;
}
n->pre = node; //n的pre指向node
n->next = node->next; //n的next指向list的next也就是NULL
node->next = n; //node的next指向n
list->data++; //头部data++
}
3.删除节点
代码如下(示例):
int deleteList(Node* list, int data) //删除节点
{
Node* node = list->next; //node拿到第一个节点
while (node) //当node不为NULL
{
if (node->data == data) //并且node的data等于data
{
if (node->next) //并且node的next不为NULL,
{
node->pre->next = node->next; //node的前指针的后指针指向node的后指针
node->next->pre = node->pre; //node的后指针的前指针指向node的前指针
}
else /*如果node的next等于NULL*/
{
node->pre->next = NULL; //当前位置为最后一个节点;把前指针的后指针指向NULL即可
}
list->data--; //头部的data--
free(node); //释放node
return TRUE;
}
node = node->next; //node移动到下一个节点·
}
return FALSE;
}
总结
有错误的地方,请指出,谢谢。