当前位置: 首页 > article >正文

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

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

头文件:(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;                           
}                                          
                                           


http://www.kler.cn/a/552143.html

相关文章:

  • Redis7——基础篇(四)
  • 深度学习06 寻找与保存最优模型
  • Flink SQL与Doris实时数仓Join实战教程(理论+实例保姆级教程)
  • WPS/WORD$OffterAI
  • Vue3项目,蛋糕商城系统
  • C++ Primer 访问控制与封装
  • Android Studio:如何使用 RxBus 类进行事件发布和订阅
  • Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析
  • 算法12-贪心算法
  • 前端基础——axios、fetch和xhr来封装请求
  • 用LangGraph轻松打造测试用例生成AI Agent
  • 【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库
  • 青少年网络安全竞赛python 青少年网络安全大赛
  • 【故障处理】- 11g迁19C数据泵报错: ORA-39083 ORA-06598 导致数据库大量对象导入不进去
  • Linux环境Docker使用代理推拉镜像
  • Postgresql的三种备份方式_postgresql备份
  • ARM中断流程思考。
  • 百度搜索融合 DeepSeek 满血版,开启智能搜索新篇
  • 微信小程序---计划时钟设计与实现
  • 欢乐力扣:旋转图像