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

一、双向循环列表

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 ;                           
}                                      
相关推荐
chao_78925 分钟前
回溯题解——子集【LeetCode】二进制枚举法
开发语言·数据结构·python·算法·leetcode
秋说1 小时前
【PTA数据结构 | C语言版】将数组中元素反转存放
c语言·数据结构·算法
qqxhb2 小时前
零基础数据结构与算法——第四章:基础算法-排序(中)
数据结构·算法·排序算法·归并·快排·堆排
木叶丸3 小时前
编程开发中,那些你必须掌握的基本概念
前端·数据结构·编程语言
手握风云-5 小时前
优选算法的链脉之韵:链表专题
数据结构·算法·链表
老虎06276 小时前
数据结构(Java)--位运算
java·开发语言·数据结构
小汉堡编程9 小时前
数据结构——vector数组c++(超详细)
数据结构·c++
雾里看山13 小时前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
好好研究15 小时前
学习栈和队列的插入和删除操作
数据结构·学习
挺菜的18 小时前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法