2019年7月31日星期三(数据结构)

2019731日星期三

. 双向链表

1. 双向链表的特征是什么?

单向链表节点里只有一个后继指针next,所以单向链表只能往后指。

双向链表节点里不仅仅有后继指针next,而是有前驱指针prev,双向链表既可以往前访问节点,也可以往后访问节点。

2. 双向链表模型?

struct list_node{

       /* 数据域 */

       ....;

 

       /* 指针域 */

       前驱指针...;

       后继指针...;

};

例子:假设该节点存放一个int类型的数据,那么节点结构体如何定义?

struct list_node{

       int a;

       struct list_node *prev;

       struct list_node *next;

};

. 双向链表的增删改查?

1. 初始化链表?

struct list_node *init_list_head(struct list_node *head)

{

       head = (struct list_node *)malloc(sizeof(struct list_node));

       if(head == NULL)

              printf("malloc head error! ");

      

       head->prev = NULL;

       head->next = NULL;

      

       return head;

}

2. 尾插链表?

int tail_add_list(struct list_node *head,int num)

{

       struct list_node *Node = NULL;

       Node = (struct list_node *)malloc(sizeof(struct list_node));

       if(Node == NULL)

              printf("malloc Node error! ");

      

       Node->a = num;

      

       struct list_node *p = NULL;

       for(p=head;p->next!=NULL;p=p->next);

      

       p->next = Node;

       Node->next = NULL;

       Node->prev = p;

      

       return 0;

}

3. 头插数据?

int head_add_list(struct list_node *head,int num)

{

       struct list_node *Node = NULL;

       Node = (struct list_node *)malloc(sizeof(struct list_node));

       if(Node == NULL)

              printf("malloc Node error! ");

      

       Node->a = num;

      

       Node->next = head->next;

      

       if(head->next != NULL)

              head->next->prev = Node;

      

       head->next = Node;

       Node->prev = head;

      

       return 0;

}

4. 遍历链表?

int backward_show_list(struct list_node *head)

{

       struct list_node *p = NULL;

       for(p=head;p->next!=NULL;p=p->next); //从循环中出来时,p就指向最后一个节点

      

       for(;p!=head;p=p->prev)

       {

              printf("p->a:%d ",p->a);

       }

      

       return 0;

}

 

int forward_show_list(struct list_node *head)

{

       struct list_node *p = NULL;

       for(p=head->next;p!=NULL;p=p->next)

       {

              printf("p->a:%d ",p->a);

       }

      

       return 0;

}

5. 搜索节点?

int search_list_node(struct list_node *head,int num)

{

       struct list_node *p = NULL;

       for(p=head->next;p!=NULL;p=p->next)

       {

              if(p->a == num)

              {

                     printf("p->a:%d ",p->a);

              }

       }

      

       return 0;

}

6. 删除节点?

int delete_list_node(struct list_node *head,int num)

{

       struct list_node *p = NULL;

       struct list_node *q = NULL;

      

       for(q=head,p=head->next;p!=NULL;q=p,p=p->next)

       {

              if(p->a == num)

              {

                     q->next = p->next;

                     if(p->next!=NULL) //说明删除的不是最后一个

                            p->next->prev = q;

                           

                     free(p);

              }

       }

      

       return 0;

}

int delete_list(struct list_node *head)

{

       struct list_node *p = NULL;

       struct list_node *q = NULL;

      

       for(p=q=head;p!=NULL;p=q)

       {

              q = p->next;

              free(p);

       }

      

       return 0;

}

原文地址:https://www.cnblogs.com/zjlbk/p/11278395.html