数据结构之双链表

在调试过程中发现

node=l和node=l->next,这两句理解没到位,node=l就是l的地址传给node并且l没有头结点,

而node=l->next表示node链表指向l链表的第一个结点,l有头结点

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{

  struct node *pre;
  int data;
  struct node *next;

}linklist;

linklist *init(void)  //链表初始化
{

    linklist *l=(linklist *)malloc(sizeof(linklist)); //链表开辟结点空间
    l->pre=NULL;
    l->data=0;
    l->next=NULL;
    return l;
}

void head_insert(linklist *l,int data)  //链表头插法
{
      linklist *node=NULL;

      node=(linklist *)malloc( sizeof(linklist));
      node->data=data;

       node->next=l->next;
       node->pre=l;
      if(l->next) //判断链表第一个结点是否为空
        {
           l->next->pre=node;
           l->next=node;
        }
       else
         l->next=node;

         l->data++;   //这局话的意思是用来记录链表的结点数,应为初始化时结点为0 

   /*  if(l->data==0 || l->next==NULL)
      {
          node->next=l->next;
          node->pre=l;
          l->next=node;   
          l->data++; 
     }else
     {
         node->next=l->next;
         node->pre=l;
         l->next=node;
         l->next->pre=node;
         l->data++;
     }
*/

}

void  nail_insert(linklist *l,int data) //链表尾插法
{
   linklist *node=NULL;
     node=l; //新变量用于遍历链表  
   linklist *n= (linklist *)malloc(sizeof(linklist));
    n->data=data;
   while(node->next !=0)  //遍历链表,尾插法就是必须在最后一个结点的指针域为NULL插入数据
   {
       node=node->next;
   }

     n->next=node->next;
   //  n->pre=node;
     node->next=n;
     n->pre=node;
     l->data++;  //记录结点数
}

int   delet(linklist *l,int data) //在链表中删除数据
{
     linklist *node=l->next; //node指向l的第一个结点
      while(node !=NULL)   //遍历
      {
        if(node->data==data)
          {

             node->pre->next=node->next;
             if(node->next)
                   node->next->pre=node->pre;
              l->data--;
              free(node);

              return 1;
          }
         node=node->next;
      }
    return 0;

}
void print(linklist *l)  //遍历
{
   linklist *node=l->next; 
   while(node !=NULL)
    {
        printf("%d->",node->data);
        node=node->next;
    }
    printf("NULL\n");

}
int main()
{

   linklist *l=NULL;
   l=init();
   head_insert(l,1);
   head_insert(l,2);
   head_insert(l,3);
   head_insert(l,4);
   print(l);

   nail_insert(l,5);
   nail_insert(l,6);
   nail_insert(l,7);
   print(l);

   delet(l,7);
   print(l);
   free(l);

   return  0;

}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值