1. 创建节点
typedef struct node
{
int data; //数据域
struct node * next; //指向下一个节点
struct node * prev; //指向上一个节点
}Node , *PList;
跟老王之前写的不一样的是 加上 两个 struct node *
2. 初始化链表
PList Init_list(void)
{
PList head = malloc(sizeof(Node));
head->next = head->prev = head;
return head;
}
typedef定义了一个新的指针类型PList,指向Node类型的结构体。
PList是一个指向链表节点的指针。
3. 新建node(有数据)
PList Init_node(int data)
{
PList head = malloc(sizeof(Node));
head->data = data;
head->next = head->prev = head;
return head;
}
4. 插入节点
void Insert_node_front(PList node , PList new)
{
new->next = node;
new->prev = node->prev;
node->prev->next = new;
node->prev = new;
}
//后插
void Insert_node_back(PList node , PList new)
{
//①
new->next = node->next;
new->prev = node;
//②
node->next->prev = new;
node->next = new;
}
new先在左边 new再去右边
5. 移除节点
void rm_node(PList node)
{
node->prev->next = node->next;
node->next->prev = node->prev;
node->next = node->prev = node;
}
node 下一个 的前一个 == node 的前一个
6. 查找节点
PList find_node(PList head , int data)
{
if(NULL == head || Empty_list(head))
return NULL;
PList temp = head->next;//从头开始
while (temp != head)
{
if(temp->data == data)
return temp;
temp = temp->next;//下移
}
return NULL;
}
7. 遍历
void show_list(PList head)
{
if(NULL == head || Empty_list(head))
return;
PList temp = head->next;
while (temp->next != head)
{
printf("%d->",temp->data);
temp = temp->next;
}
printf("%d\n",temp->data);
}
等于头节点 结束;
8. 销毁链表
void rm_list(PList head)
{
if(NULL == head)
return;
PList temp = head->prev;
PList prev = NULL;
while (temp != head)
{
prev = temp->prev;
rm_node(temp);
free(temp);
temp = prev;
}
free(head);
}
9. 判断链表是否为空
head->next==head???