欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 数据结构--双向链表,双向循环链表

数据结构--双向链表,双向循环链表

2025/3/20 8:52:57 来源:https://blog.csdn.net/qq_66012182/article/details/145691610  浏览:    关键词:数据结构--双向链表,双向循环链表

双向链表的头插,尾插,头删,尾删

头文件:(head.h)

#include <string.h>                                          
#include <stdlib.h>                                          typedef char datatype;                                       
typedef struct node                                          
{                                                            datatype data;                                           struct node* next;                                       struct node* prev;                                       
}*Doublelink;                                                Doublelink Create_node();                                    Doublelink insert(Doublelink head,datatype element);         void show(Doublelink head);                                  Doublelink head_delete(Doublelink head);                     Doublelink tail_insert(Doublelink head,datatype element);    Doublelink tail_delete(Doublelink head);                     #endif                                                       

 test.c

#include"head.h"                                  
int main(int argc, const char *argv[])            
{                                                 Doublelink head=NULL;                         int n;                                        datatype element;                             printf("请输入要插入数据的个数:");           scanf("%d",&n);                               for(int i=0;i<n;i++)                          {                                             printf("请输入插入的数据:");             //  scanf(" %c",&element);                    getchar();                                element=getchar();                        head=insert(head,element);//头插          }                                             head=head_delete(head);  //头删           show(head);  //遍历                           printf("请输入尾插插入的个数:");             scanf("%d",&n);                               for(int i=0;i<n;i++)                          {                                             printf("请输入插入的数据:");             //  scanf(" %c",&element);                    getchar();                                element=getchar();                        head=tail_insert(head,element);//尾插     }                                             head=tail_delete(head);                       show(head);                                   return 0;                                     
}                                                 

main.c

#include"head.h"                                         Doublelink Create_node()                                 
{                                                        Doublelink s=(Doublelink)malloc(sizeof(struct node));if(NULL==s)                                          return NULL;                                     s->data=0;                                           s->next=s->prev=NULL;                                return s;                                            
}                                                        //头插                                                   
Doublelink insert(Doublelink head,datatype element)      
{                                                        Doublelink s=Create_node();                          s->data=element;                                     if(NULL==head)                                       {                                                    head=s;                                          }                                                    else                                                 {                                                    s->next=head;                                    head->prev=s;                                    head=s;                                          }                                                    return head;                                         
}                                                        
//遍历                                      
void show(Doublelink head)                  
{                                           if(NULL==head)                          {                                       return;}                                       //正向遍历                              Doublelink p=head;                      while(p->next!=NULL)                    {                                       printf("%c\t",p->data);             p=p->next;                          }                                       printf("%c\n",p->data);                 //反向遍历                              
/*  while(p!=NULL)                          {                                       printf("%c\t",p->data);             p=p->prev;                          }                                       
*/                                          
}                                           //头删                                      
Doublelink head_delete(Doublelink head)     
{                                           //判断链表是否为空                      if(NULL==head)                          {                                       return head;                        }                                       //链表存在多个节点                      Doublelink del=head;                    head=head->next;                        free(del);                              del=NULL;                               return head;                            
}                                           //尾插                                                   
Doublelink tail_insert(Doublelink head,datatype element) 
{                                                        Doublelink s=Create_node();                          s->data=element;                                     //链表为空                                           if(NULL==head)                                       {                                                    head=s;                                          return head;                                     }                                                    //链表节点个数>=1                                    Doublelink p=head;                                   while(p->next!=NULL)                                 {                                                    p=p->next;                                       }                                                    p->next=s;                                           s->prev=p;                                           return head;                                         
}                                                        //尾删                                   
Doublelink tail_delete(Doublelink head)  
{                                        if(NULL==head)                       {                                    return head;                     }                                    Doublelink p=head;                   while(p->next!=NULL)                 {                                    p=p->next;                       }                                    if(p->prev!=NULL)                {                                p->prev->next=NULL;          }                                free(p);                     p=NULL;                      return head;                         
}                                        

双向循环链表的头插,头删,尾插,尾删

head.h

#ifndef __HEAD_H__                                        
#define __HEAD_H__                                        
#include <stdio.h>                                        
#include <string.h>                                       
#include <stdlib.h>                                       typedef char datatype;                                    
typedef struct node                                       
{                                                         datatype data;                                        struct node* next;                                    struct node* prev;                                    
}*Doublelink;                                             Doublelink Create_node();                                 Doublelink insert(Doublelink head,datatype element);      void show(Doublelink head);                               Doublelink head_delete(Doublelink head);                  Doublelink tail_insert(Doublelink head,datatype element); Doublelink tail_delete(Doublelink head);                  #endif                                                    

test.c

#include"head.h"                                     
int main(int argc, const char *argv[])               
{                                                    Doublelink head=NULL;                            int n;                                           datatype element;                                printf("请输入要插入数据的个数:");              scanf("%d",&n);                                  for(int i=0;i<n;i++)                             {                                                printf("请输入插入的数据:");                //  scanf(" %c",&element);                       getchar();                                   element=getchar();                           head=insert(head,element);//头插             }                                                head=head_delete(head);  //头删              show(head);  //遍历                              printf("请输入尾插插入的个数:");                scanf("%d",&n);                                  for(int i=0;i<n;i++)                             {                                                printf("请输入插入的数据:");                //  scanf(" %c",&element);                       getchar();                                   element=getchar();                           head=tail_insert(head,element);//尾插        }                                                head=tail_delete(head);                          show(head);                                      return 0;                                        
}                                                    

main.c

#include"head.h"                                          Doublelink Create_node()                                  
{                                                         Doublelink s=(Doublelink)malloc(sizeof(struct node)); if(NULL==s)                                           return NULL;                                      s->data=0;                                            s->next=s->prev=s;                                    return s;                                             
}                                                         //头插                                                    
Doublelink insert(Doublelink head,datatype element)       
{                                                         //创建节点                                            Doublelink s=Create_node();                           s->data=element;                                      //链表为空链表                                        if(NULL==head)                                        {                                                     head=s;                                           }                                                     //链表节点数>=1                                       else                                                  {                                                     Doublelink real=head->prev;                       s->next=head;                                     head->prev=s;                                     head=s;                                           real->next=head;                                  head->prev=real;                                  }                                                     return head;                                          
}                                                         
//遍历                               
void show(Doublelink head)           
{                                    if(NULL==head)                   {                                return;                      }                                //正向遍历                       Doublelink p=head;               while(p->next!=head)             {                                printf("%c\t",p->data);      p=p->next;                   }                                printf("%c\n",p->data);          
}
//头删                                 
Doublelink head_delete(Doublelink head)
{                                      //判断链表是否为空                 if(NULL==head)                     {                                  return head;                   }                                  //链表存在多个节点                 Doublelink p=head;                 //找到最后一个节点的位置           while(p->next!=head)               {                                  p=p->next;                     }                                  Doublelink del=head;               head=head->next;                   //连接头尾,让链表重新循环     p->next=head;                      head->prev=p;                      free(del);                         del=NULL;                          return head;                       
}                                      
//尾插                                                       
Doublelink tail_insert(Doublelink head,datatype element)     
{                                                            //创建节点                                               Doublelink s=Create_node();                              s->data=element;                                         //链表为空                                               if(NULL==head)                                           {                                                        head=s;                                              return head;                                         }                                                        //链表节点个数>=1                                        Doublelink p=head;                                       while(p->next!=head)                                     {                                                        p=p->next;                                           }                                                        p->next=s;                                               //连接表头和表尾                                         s->next=head;                                            head->prev=s;                                            return head;                                             
}                                                            
//尾删                                     
Doublelink tail_delete(Doublelink head)    
{                                          //判断链表是否为空                     if(NULL==head)                         {                                      return head;                       }                                      Doublelink p=head;                     p=head->prev;                          //如果链表只有一个节点                 if(head->next==head)                   {                                      free(p);                           return NULL;                       }                                      //删除尾节点                           p->prev->next=head;                head->prev=p->prev;                free(p);                           p=NULL;                            return head;                           
}                                          

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词