20、数据结构笔记之十九双向链表

20、数据结构笔记之十九双向链表

           本篇名言:“人的生命,似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花。

之前实现的都是单向列表,那么我们来看下双向链表。

1.  双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

2.  定义结构体

typedefstructDoubleLinkedList 

    intdata; 

    structDoubleLinkedList*pre; 

    structDoubleLinkedList*next; 

}DlinkedList_Node;

一个节点需要指向前面节点同时指向后面节点,需要二个指针。

3.  创建链表

具体过程是输入一个值,如果不是65535,则创建一个节点,前向指针指向head,head指向该节点。如果是65535则打印输入结束。

Head->pre=NULL

创建链表最后返回一个指向双向链表的指针头。

 

DlinkedList_Node*createDLink() 

    DlinkedList_Node*head,*p,*s; 

    intx; 

    head = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

    p =head; 

    while(1) 

    { 

       printf("please input the data: \n"); 

        scanf("%d",&x); 

        if(x!= 65535) 

        { 

            s= (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

            s->data = x; 

           s-> pre = p; 

           p->next = s; 

           p=s; 

        } 

        else

           { 

               printf("\n数据输入结束\n"); 

                break

           } 

    } 

    p->next= NULL

    head =head ->next; 

   head->pre = NULL

    returnhead; 

 

 

 

 

4.  插入节点

DlinkedList_Node*insertDlinkedList_Node(DlinkedList_Node *head,inti

    DlinkedList_Node*p,*temp; 

    p = head

    temp = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

    temp->data = i

    if(i< p->data)//比头结点数据小,插入到链表头部  

    { 

        head =temp; 

        head->next= p;//此处p为原来的head  

        head->pre= NULL

       p->pre = head;//此处p为原来的head  

        returnhead

    } 

    while(p!= NULL && i> p->data)//寻找合适的插入位置  

    { 

                     if(p->next)

                                p= p->next; 

                     else

                                break;

    } 

    if(p && i < p->data)//在链表中间某处找到合适插入位置  

    { 

        temp->next = p; 

        temp->pre = p->pre; 

        p->pre->next = temp; 

        p->pre = temp; 

        returnhead

    } 

    else//没有找到合适的位置,只有将数据插入到链表尾部  

    {  

 

       p->next = temp;  //遍历到链表尾部,p==NULL  

        temp->pre = p; 

        temp->next = NULL

        returnhead

    } 

 

 

5.  删除节点

 

DlinkedList_Node*deleteDlinkedList_Node(DlinkedList_Node *head,inti

    DlinkedList_Node*p; 

    p = head

    if(p->data== i

    { 

        head =p->next; 

        head->pre= NULL

       free(p); 

        returnhead

    } 

    while(p) 

    { 

        if(p->data== i

        { 

       p->pre->next = p->next; 

       p->next->pre = p->pre; 

       free(p); 

        returnhead

        } 

        p =p->next; 

    } 

    printf("没有找到想要删除的数据\n"); 

    returnhead

 

 

6.  Main函数

插入相等的数字会出乱子的,大家自己可以去运行查看。

创建链表,然后插入2个数,接着删除2个数字,一个在链表中,一个不在,每次都输出一下,最后释放节点。

int main() 

    DlinkedList_Node*head; 

    head =createDLink(); 

   printDLink(head); 

    head =insertDlinkedList_Node(head,1012);

           printDLink(head); 

           head= insertDlinkedList_Node(head,10);

           printDLink(head); 

    head =deleteDlinkedList_Node(head,1991);

           printDLink(head); 

           head= deleteDlinkedList_Node(head,2);

   printDLink(head); 

           freelink(head);

 

7.  源码

#include<cstdio>  

#include<cstdlib>  

typedefstructDoubleLinkedList 

    intdata; 

    structDoubleLinkedList*pre; 

    structDoubleLinkedList*next; 

}DlinkedList_Node

//建立链表  

DlinkedList_Node* createDLink() 

    DlinkedList_Node*head,*p,*s; 

    intx; 

    head = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

    p =head; 

    while(1) 

    { 

       printf("please input the data: \n"); 

        scanf("%d",&x); 

        if(x!= 65535) 

        { 

            s= (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

            s->data = x; 

           s-> pre = p; 

           p->next = s; 

           p=s; 

        } 

        else

           { 

                printf("\n数据输入结束\n"); 

               break

           } 

    } 

    p->next= NULL

           p =head;

    head =head ->next; 

   head->pre = NULL

           free(p);

    returnhead; 

//顺序、反序打印链表  

void printDLink(DlinkedList_Node *head

    DlinkedList_Node*p,*s; 

    p = head

    printf("正序输出双向链表:\n"); 

    while(p) 

    { 

       printf("%d ",p->data); 

        s =p; 

        p =p->next; 

    } 

    printf("\n逆序输出双向链表: \n"); 

    while(s) 

    { 

       printf("%d ",s->data); 

        s =s->pre; 

    } 

    printf("\n\n"); 

//删除一个结点  

DlinkedList_Node*deleteDlinkedList_Node(DlinkedList_Node *head,inti

    DlinkedList_Node*p; 

    p = head

    if(p->data== i

    { 

        head =p->next; 

        head->pre= NULL

       free(p); 

        returnhead

    } 

    while(p) 

    { 

        if(p->data== i

        { 

       p->pre->next = p->next; 

       p->next->pre = p->pre; 

       free(p); 

        returnhead

        } 

        p =p->next; 

    } 

    printf("没有找到想要删除的数据\n"); 

    returnhead

//插入一个结点  

DlinkedList_Node*insertDlinkedList_Node(DlinkedList_Node *head,inti

    DlinkedList_Node*p,*temp; 

    p = head

    temp = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node)); 

    temp->data = i

    if(i< p->data)//比头结点数据小,插入到链表头部  

    { 

        head =temp; 

        head->next= p;//此处p为原来的head  

        head->pre= NULL

       p->pre = head;//此处p为原来的head  

        returnhead

    } 

    while(p!= NULL && i> p->data)//寻找合适的插入位置  

    { 

                     if(p->next)

                                p= p->next; 

                     else

                                break;

    } 

    if(p && i < p->data)//在链表中间某处找到合适插入位置  

    { 

        temp->next = p; 

        temp->pre = p->pre; 

        p->pre->next = temp; 

        p->pre = temp; 

        returnhead

    } 

    else//没有找到合适的位置,只有将数据插入到链表尾部  

    {  

 

       p->next = temp;  //遍历到链表尾部,p==NULL  

        temp->pre = p; 

        temp->next = NULL

        returnhead

    } 

void freelink(DlinkedList_Node *head

{

            DlinkedList_Node*p,*temp;

           p = head;    

    while(p)//寻找合适的插入位置  

    {   temp = p;

                     p= p->next;

                     free(temp);

 

    } 

}

int main() 

    DlinkedList_Node*head; 

    head =createDLink(); 

    printDLink(head); 

    head =insertDlinkedList_Node(head,1012);

           printDLink(head); 

           head= insertDlinkedList_Node(head,10);

           printDLink(head); 

    head =deleteDlinkedList_Node(head,1991);

           printDLink(head); 

           head= deleteDlinkedList_Node(head,2);

   printDLink(head); 

           freelink(head);

}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值