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

一、双向循环列表

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 ;                           
}                                      
相关推荐
im_AMBER8 小时前
数据结构 09 二叉树作业
数据结构·笔记·学习
l1t10 小时前
利用DeepSeek修改数据结构提升求解集合程序效率
数据结构·python·deepseek
先做个垃圾出来………12 小时前
偏移量解释
数据结构·算法
立志成为大牛的小牛12 小时前
数据结构——三十三、Dijkstra算法(王道408)
数据结构·笔记·学习·考研·算法·图论
小王C语言14 小时前
哈希表实现
数据结构·哈希算法·散列表
靖难都14 小时前
数据结构:单链表
数据结构
perseveranceX14 小时前
插入排序:扑克牌式的排序算法!
c语言·数据结构·插入排序·时间复杂度·排序稳定性
CS创新实验室15 小时前
典型算法题解:长度最小的子数组
数据结构·c++·算法·考研408
Ialand~17 小时前
深度解析 Rust 的数据结构:标准库与社区生态
开发语言·数据结构·rust
Yupureki19 小时前
从零开始的C++学习生活 18:C语言复习课(期末速通)
c语言·数据结构·c++·学习·visual studio