双向链表的操作与使用(学习笔记)

问题:上一节,学了单链表。我们都是从头开始找到尾。可我不想这样,我能不能从后找前呢?

因此,出现了双向链表

一、双向链表的概述

1、双向链表的定义:

        在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。

 

 二、双向链表的搭建(即定义一个类型)

	//比单链表多了一个指向前一个与自己同类型的的结点
typedef struct List
   {

        //数据域

         int data;

         //指针域    
         struct  List *pri;             //指向前一个结点  
                
         struct  List *next;            //指向下一个的结点        
   }DLL;

三、创建一个空的双向链表

	//比单链表多了一个指向前一个与自己同类型的的结点
typedef struct List
   {

        //数据域

         int data;

         //指针域    
         struct  List *pri;             //指向前一个结点  
                
         struct  List *next;            //指向下一个的结点        
   }DLL;

 
DLL * CreateList()
{

   //申请内存,作为这个表的空间
    
   DLL * list =(DLL *)malloc(sizeof(DLL));
 
  //初始化变量
    list->data = 0;        //可以省去这步

    list->pri = list->next = NULL;

    return list;
}	
	

四、创建节点

DLL * CreateNode(int data)
{

   DLL *newNode =(DLL *)malloc(sizeof(DLL));
   
    
    newNode->data = data;
 
    newNode->pri=newNode->next=NULL;
    
    return newNode;
}	
	
	

五、双向链表的插入删除

推荐:看——嵌入式与Linux那些事(博主)

六、双向链表的查找(与单链表一样的方法)

DLL *FindList(DLL* head,int data)
{
    DLL * FindNode= head;

    while (FindNode) 
    {
        if (FindNode->data == data)
        {
            return FindNode;
        }
        FindNode=FindNode->next;
    }
    
    return NULL;       //没有找到此数据,返回给主函数一个NULL;
}



    
    







}

七、双向链表的打印


void PrintList(DLL* head)
{
    DLL * q=head;
    while (q)   //q为真,说明定义成功
    {
        
        if (q->next==NULL)    此判断满足,则只有一个节点
        {
            printf("%d\n",q->data);
        }
        else
        {
            printf("%d\n",q->data);
        }
        q=q->next;
    }
}

八,更改双向链表的数据

DLL *ChangeList(DLL * head, int site,int newdata)
{
    DLL *Newlist =head;
 
    for (int i=0; i<site-1; i++) 
    {
        Newlist=Newlist->next;
    }
    Newlist->data=newdata;
    return Newlist;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值