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

数据结构-----双向链表

一、双向循环列表

head.h

#ifndef __head_h__                                                
#define __head_h__                                                
                                                                  
                                                                  
#include <stdio.h>                                                
#include <string.h>                                               
#include <stdlib.h>                                               
                                                                  
enum                                                              
{                                                                 
    SUCCESS,                                                      
    FALSE=-1                                                      
};                                                                
typedef char datatype;                                            
//双向列表结构体                                                  
typedef struct Node                                               
{                                                                 
    //存数据域                                                    
    datatype data;                                                
    //存上一个地址                                                
    struct Node *back;                                            
    //存下一个地址                                                
    struct Node *next;                                            
}*Doublelink;                                                     
//头插                                                            
Doublelink insert_head(datatype element,Doublelink head);         
//输出                                                            
void output_head(Doublelink head);                                
//头删                                                            
Doublelink delete_head_link(Doublelink head);                     
//尾插                                                            
Doublelink insert_back_link(Doublelink head,datatype element);    
//尾删                                                            
Doublelink delete_back_link(Doublelink head);                     
                                                                  
#endif                                                            

main.c

#include "head.h"                             
                                              
int main(int argc, const char *argv[])        
{                                             
    Doublelink head=NULL;//定义双向列表头节点 
    int n;                                    
    printf("请输入n的值:");                  
    scanf("%d",&n);                           
    datatype element;                         
    for(int i=0;i<n;i++)                      
    {                                         
        printf("请输入%d个数的值:",i+1);     
        getchar();                            
        element=getchar();                    
        head=insert_head(element,head);       
    }                                         
    //输出                                    
    output_head(head);                        
    //头删                                    
    printf("头删后的结果为:\n");             
    head=delete_head_link(head);              
    output_head(head);                        
    //尾插                                    
    printf("请输入在末尾要插入的值:");       
    getchar();                                
    element=getchar();                        
    printf("尾插后的结果为:\n");             
    head=insert_back_link(head,element);      
    output_head(head);                        
    //尾删                                    
    printf("尾删后的结果为:\n");             
    head=delete_back_link(head);              
    output_head(head);                        
    return 0;                                 
}                                             

test.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->back=s;
        return s;
}
//头插
Doublelink insert_head(datatype element,Doublelink head)
{
        //创建新节点
        Doublelink s=create_node();
        s->data=element;
        //链表为空
        if(head==NULL)
                head=s;
        //存在至少一个节点
        else
        {
                Doublelink rear=head->back;
                s->next=head;
                head->back=s;
                head=s;
                rear->next=head;
                head->back=rear;
        }
        return head;
}
//遍历(正向)
void output_head(Doublelink head)
{
        //链表为空
        if(head==NULL)
        {
                printf("输出失败\n");
                return;
        }
        else
        {
                Doublelink p=head;
                do
                {
                        printf("%c ",p->data);
                        p=p->next;
                }while(p!=head);
                putchar(10);
        }
}
//头删
Doublelink delete_head_link(Doublelink head)
{
        //链表为空
        if(head==NULL)
        {
                printf("删除失败\n");
                return head;
        }
        else
        {
                Doublelink p=head;
                head=head->next;
                head->back=p->back;
                p->back->next=head;
                free(p);
                p=NULL;
                return head;
        }
}

//尾插
Doublelink insert_back_link(Doublelink head,datatype element)
{
        Doublelink s=create_node();
        s->data=element;
        if(head==NULL)
                head=s;
        Doublelink p=head;
        while(p->next!=head)
        {
                p=p->next;
        }
        p->next=s;
        s->next=head;
        s->back=p;
        head->back=s;
        return head;
}


//尾删                                      
Doublelink delete_back_link(Doublelink head)
{
    //判断为空
    if(head==NULL)
    {
        printf("尾删失败\n");
        return head;
    }
    Doublelink p=head->back;
    Doublelink q=p->back;                   
    q->next=head;
    head->back=q;
    free(p);
    p=NULL;
    return head;
}   

二、双向链表的尾删

//尾删                                 
void delete_back_link(Doublelink head) 
{                                      
    //判断为空                         
    if(head==NULL)                     
    {                                  
        printf("尾删失败\n");          
        return ;                       
    }                                  
    Doublelink p=head;                 
    if(p->next==NULL)                  
    {                                  
        head=delete_head_link(head);   
        return;                        
    }                                  
    while(p->next!=NULL)               
    {                                  
        p=p->next;                     
    }                                  
    p->back->next=NULL;                
    free(p);                           
    p=NULL;                            
    return ;                           
}                                      


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

相关文章:

  • 面试知识点2
  • React useState 和 useEffect 使用坑点注意总结
  • 【微信小程序】订阅消息
  • 【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
  • 【数据挖掘】ARFF格式与数据收集
  • 健康养生:从生活细节开启活力之旅
  • Windows 启动 SSH 服务
  • android社畜模拟器
  • 信息学奥赛c++语言:数组逆序重存放
  • JavaScript 前端面试 3(等于、全等、instanceof、typeof 、原型、原型链)
  • 当一个后端下载了一个VUE开源项目,怎么开始着手玩一下
  • Spring中的日志
  • Linux的基础指令和环境部署,项目部署实战(下)
  • 【DeepSeek】Mac m1电脑部署DeepSeek
  • 校园网架构设计与部署实战
  • Linux学习笔记之进程切换
  • 微服务SpringCloudAlibaba组件Spring Cloud Gateway网关教程【详解gatway网关以及各种过滤器配置使用,附有示例+代码】
  • 一个简单的ubuntu/开发板初始化脚本
  • HTML/CSS中并集选择器
  • open-webui安装