7.5 双向链表
基本概念
数据域
前趋指针
后继指针
基本操作
判断是否为空、添加、删除、遍历、销毁
口诀
头插法先处理后继
尾插法先处理前驱
/*************************************
* 名称描述:双链表
* 实现功能:双链表的添加、删除、遍历、打印、销毁
* 作 者:王 利 涛
* QQ 群 :475504428
* 公 众 号:宅学部落(armlinuxfun)
* 嵌入式自学路线咨询 QQ:3284757626
*************************************/
#include<stdio.h>
#include<stdlib.h>
struct list_node{
int data;
struct list_node *next;
struct list_node *prev;
};
int is_list_empty(struct list_node *head)
{
return (head->next == NULL);
}
void list_print(struct list_node *head)
{
if(head->next == NULL)
printf("list_print:empty list!\n");
else
{
struct list_node *p;
p = head->next;
for(p;p!=NULL;p=p->next)
printf("p->data = %d\n",p->data);
}
}
void list_free(struct list_node *head)
{
struct list_node *p,*q;
q = head->next;
p = q->next;
while(q!=NULL){
free(q);
q = p;
if(p!=NULL)
p = p->next;
printf("p:%p q:%p\n",p,q);
};
free(head);
}
void list_add(struct list_node *head,struct list_node *node)
{
if(head->next==NULL)
{
head->next = node;
node->prev = head;
}
else
{
node->next = head->next;
head->next->prev = node;
head->next = node;
node->prev = head;
}
}
void list_add_tail(struct list_node *head,struct list_node *node)
{
struct list_node *p;
if(head->next == NULL)
{
head->next = node;
node->prev = head;
}
else
{
for(p=head->next;p->next!=NULL;p=p->next);
p->next = node;
node->prev = p;
}
}
void list_delete(struct list_node *head)
{
struct list_node *p;
p = head->next;
if(p==NULL)
{
printf("list+delete:empty list!\n");
}
else
{
head->next = p->next;
if(p->next != NULL)
p->next->prev = head;
free(p);
}
}
int list_delete_tail(struct list_node *head)
{
struct list_node *p;
printf("head->next:%p\n",head->next);
if(head->next == NULL)
{
printf("list_delete_list:empty list!\n");
return -1;
}
p = head->next;
for(p;p->next!=NULL;p=p->next);
p->prev->next = NULL;
p->prev = NULL;
free(p);
return 0;
}
void list_delete_by_id(struct list_node *head,struct list_node *node)
{
struct list_node *p;
if(node == head->next){
head->next = node->next;
if(node->next!=NULL)
node->next->prev = head;
}
else
{
for(p=head->next;p->next!=node;p=p->next);
{
p->next = node->next;
if(node->next !=NULL)
node->next->prev = p;
}
}
free(node);
}
struct list_node *list_foreach(struct list_node *head,int val)
{
struct list_node *p;
p = head->next;
for(p;p->data!=val;p=p->next);
return p;
}
int main(void)
{
struct list_node *p,*head;
head = (struct list_node*)malloc( sizeof(struct list_node));
head->data = 0;
head->next = NULL;
head->prev = NULL;
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 1;
p->next = NULL;
p->prev = NULL;
list_add(head,p);
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 2;
p->next = NULL;
p->prev = NULL;
list_add(head,p);
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 3;
p->next = NULL;
p->prev = NULL;
list_add(head,p);
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 4;
p->next = NULL;
p->prev = NULL;
list_add(head,p);
// list_delete_by_id(head,head->next);
// list_print(head);
// list_delete_(head);
list_print(head);
list_delete(head);
list_print(head);
list_delete(head);
list_print(head);
list_delete(head);
list_print(head);
list_delete_tail(head);
list_delete_tail(head);
list_print(head);
// list_delete_tail(head);
// list_print(head);
// p = list_foreach(head,2);
// printf("%d\n",p->data);
// list_free(head);
return 0;
}