链表——双向链表

双向链表

结构体:

typedef int datatype;

typedef struct node_t

{

datatype data;//数据域 

struct node_t *next;//指向下一个节点的指针 next 下一个

struct node_t *prior;//指向前一个节点的指针 prior 前一个

}link_node_t,*link_list_t;

//将双向链表的头指针和尾指针封装到一个结构体里 

//思想上有点像学的链式队列

typedef struct doublelinklist

{

link_list_t head; //指向双向链表的头指针

link_list_t tail; //指向双向链表的尾指针

int len;

}double_node_t,*double_list_t;

头文件:

"[code=C]"

	
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_t
{
	datatype data;//数据域 
	struct node_t *next;//指向下一个节点的指针 next 下一个
	struct node_t *prior;//指向前一个节点的指针 prior 前一个
}link_node_t,*link_list_t;

//将双向链表的头指针和尾指针封装到一个结构体里 
//思想上有点像学的链式队列
typedef struct doublelinklist
{
	link_list_t head; //指向双向链表的头指针
	link_list_t tail; //指向双向链表的尾指针
	int len;
}double_node_t,*double_list_t;
//1.创建一个空的双向链表
double_list_t createEmptyDoubleLinkList();
//2.向双向链表的指定位置插入数据 post位置, data数据
int insertIntoDoubleLinkList(double_list_t p, int post, datatype data);
//3.遍历双向链表
void showDoubleLinkList(double_list_t p);
//4.删除双向链表指定位置的数据
int deletePostDoubleLinkList(double_list_t p, int post);
//5.判断双向链表是否为空
int isEmptyDoubleLinkList(double_list_t p);
//6.求双向链表的长度
int lengthDoubleLinkList(double_list_t p);
//7.查找指定数据出现的位置 data被查找的数据
int searchPostDoubleLinkList(double_list_t p,datatype data);
//8.修改指定位置的数据,post修改的位置 data被修改的数据
int changeDataDoubleLinkList(double_list_t p,int post, datatype data);
//9.删除双向链表中的指定数据 data代表删除所有出现的data数据
int deleteDataDoubleLinkList(double_list_t p, datatype data);



"[code=C/"

函数:

"[code=C]"
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_t
{
	datatype data;//数据域 
	struct node_t *next;//指向下一个节点的指针 next 下一个
	struct node_t *prior;//指向前一个节点的指针 prior 前一个
}link_node_t,*link_list_t;

//将双向链表的头指针和尾指针封装到一个结构体里 
//思想上有点像学的链式队列
typedef struct doublelinklist
{
	link_list_t head;//指向双向链表的头指针
	link_list_t tail; //指向双向链表的尾指针
	int len;
}double_node_t,*double_list_t;
//1.创建一个空的双向链表
double_list_t createEmptyDoubleLinkList()
{
    
    double_list_t p=(double_node_t *)malloc(sizeof(double_node_t));
    if(p==NULL)
    {
        perror("p err");
        return NULL;
    }
    p->head= p->tail=(link_node_t *)malloc(sizeof(link_node_t));
    if(p->head==NULL)
    {
        perror("p err");
        return NULL;
    }
    p->len=0;
    p->head->next=NULL;
    p->head->prior=NULL;
    return p;
}
//2.向双向链表的指定位置插入数据 post位置, data数据
int insertIntoDoubleLinkList(double_list_t p, int post, datatype data)
{   
    link_list_t temp=NULL;
    if(post<0||post>p->len)
    {
        printf("insertIntoDoubleLinkList error");
        return -1;
    }
    link_list_t pnew=(link_list_t )malloc(sizeof(link_node_t));
        if(pnew==NULL)
    {
        perror("pnew err");
        return -1;
    }
   
   pnew->data=data;
   pnew->next=NULL;
   pnew->prior=NULL;

   if(post==p->len)//尾插
   {
       p->tail->next=pnew;
       pnew->prior=p->tail;
       p->tail=pnew;
   }
   else
   {
       if(post<p->len/2)//头插
       {
           temp=p->head;
          for(int i=0;i<=post;i++)
        {
         temp=temp->next;
        }
       }
       else
       {
         temp=p->tail;
         for(int i=0;i<=p->len-post-1;i++)
         {
             temp=temp->prior;
         }
       }
       temp->prior->next=pnew;
       pnew->prior=temp->prior;
       pnew->next=temp;
       temp->prior=pnew;
   }
p->len++;
return 0;
}
//3.遍历双向链表
void showDoubleLinkList(double_list_t p)
{
    link_list_t p1=p->head;
    // link_list_t p2=p->tail;
    while(p1->next!=NULL)
    {
        p1=p1->next;
        printf("%d  ",p1->data);
       
    }
    // while(p2!=p->head)
    // {
    //     printf("%d  ",p2->data);
    //     p2=p2->prior;
    // }
    printf("\n");
}
//4.删除双向链表指定位置的数据
int deletePostDoubleLinkList(double_list_t p, int post)
{
     link_list_t temp=NULL;
      if(post<0||post>p->len)
    {
        printf("deletePostDoubleLinkList error");
        return -1;
    }
    link_list_t pdel=NULL;
    if(post==p->len-1)
    {
       pdel=p->tail;
       p->tail=p->tail->prior;
        free (pdel);
        pdel=NULL;
    }
    else
    {
        if(post<p->len/2)
       {
           temp=p->head;
          for(int i=0;i<=post;i++)
        {
         temp=temp->next;
        }
       }
       else
       {
         temp=p->tail;
         for(int i=0;i<=p->len-post-1;i++)
         {
             temp=temp->prior;
         }
       }
       temp->prior->next=temp->next;
       temp->next->prior=temp->prior;
       free(temp);
       temp=NULL;
    }
    p->len--;
    return 0;
    

}
//5.判断双向链表是否为空
int isEmptyDoubleLinkList(double_list_t p)
{
return p->head==p->tail;
}
//6.求双向链表的长度
int lengthDoubleLinkList(double_list_t p)
{
    return p->len;
}
//7.查找指定数据出现的位置 data被查找的数据
int searchPostDoubleLinkList(double_list_t p,datatype data)
{
     link_list_t temp=NULL;
     int i=1;
     temp=p->head;
     while(temp->next!=NULL)
     {
      temp=temp->next;
      if(temp->data==data)
      {
        printf("%d  ",i);
       
      }   
      i++;
     }
     printf("\n");
     return -1;
    
}
//8.修改指定位置的数据,post修改的位置 data被修改的数据
int changeDataDoubleLinkList(double_list_t p,int post, datatype data)
{
   link_list_t temp=NULL;
   if(post<p->len/2)
   {
       temp=p->head;
       for(int i=0;i<=post;i++)
       temp=temp->next;
   }
   else
   {
       
       temp=p->tail;
       for(int i=0;i<p->len-post-1;i++)
       temp=temp->prior;
   }
   temp->data=data;
    return 0;
}
//9.删除双向链表中的指定数据 data代表删除所有出现的data数据
int deleteDataDoubleLinkList(double_list_t p, datatype data)
{    link_list_t pdel=NULL;
     link_list_t temp=NULL;
     int i=1;
     temp=p->head->next;
     while(temp!=NULL)
     {
      if (temp->data==data)
      {
          if(temp==p->tail)
          {
              p->tail=p->tail->prior;
              free(p->tail->next);
              p->tail->next=NULL;
          }
          else
          {
              temp->prior->next=temp->next;
               temp->next->prior=temp->prior;
               pdel=temp;
               temp=temp->next;
               free(pdel);
               pdel=NULL;
          }
          p->len--;
      }
      else
      {
          temp=temp->next;
      }
      

    //   if(temp->data==data)
    //   {
    //     deletePostDoubleLinkList(p, i);
    //   }

    //   temp=temp->next;
    //   i++;
     }
     return 0;
}
int main(int argc, char const *argv[])
{
    double_list_t p=createEmptyDoubleLinkList();
   
    insertIntoDoubleLinkList(p,0,1);
    insertIntoDoubleLinkList(p,1,2);
    insertIntoDoubleLinkList(p,2,3);
    insertIntoDoubleLinkList(p,3,4);
    insertIntoDoubleLinkList(p,4,3);
    showDoubleLinkList(p);
    deletePostDoubleLinkList(p, 2);
     showDoubleLinkList(p);
    searchPostDoubleLinkList(p,3);
    changeDataDoubleLinkList(p,2, 3);
    showDoubleLinkList(p);
    deleteDataDoubleLinkList(p, 3);
    showDoubleLinkList(p);
    return 0;
}

"[code=C/"

相关推荐

  1. ——双向

    2024-04-13 15:56:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 15:56:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 15:56:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 15:56:02       82 阅读
  4. Python语言-面向对象

    2024-04-13 15:56:02       91 阅读

热门阅读

  1. mysql 大表凌晨定时删除数据

    2024-04-13 15:56:02       31 阅读
  2. 【J1】【map】考试

    2024-04-13 15:56:02       27 阅读
  3. linux下根据进程pid获取对应的window id的方法

    2024-04-13 15:56:02       33 阅读
  4. 【leetcode面试经典150题】44. 两数之和(C++)

    2024-04-13 15:56:02       34 阅读
  5. P8715 [蓝桥杯 2020 省 AB2] 子串分值 (双边检测)

    2024-04-13 15:56:02       30 阅读
  6. 2025秋招复习计划

    2024-04-13 15:56:02       38 阅读
  7. 我可以信任XEX吗?

    2024-04-13 15:56:02       32 阅读
  8. 实战自动化修改主机名

    2024-04-13 15:56:02       34 阅读
  9. 以太坊源码阅读01

    2024-04-13 15:56:02       29 阅读