数据结构单向循环链表

本文详细介绍了如何使用C语言实现单向循环链表,包括创建链表、头插法和尾插法插入节点、遍历链表以及判断和删除链表头尾节点的操作。
摘要由CSDN通过智能技术生成

#include <stdio.h>                                                           
#include <stdlib.h>                                                          
#include "03_Looplinklist.h"                                                 
 /*                                                                           
  * function:    //创建一个单向循环链表                                       
 * @param [ in]                                                              
 * @param [out]                                                              
  * @return                                                                   
 */                                                                          
 LoopLinklist*  create_Looplinklist(void)                                     
 {                                                                            
 LoopLinklist *head=(LoopLinklist*)malloc(sizeof(LoopLinklist));          
 if(NULL==head)                                                           
  {                                                                        
     printf("头结点申请失败,链表创建失败\n");                            
         return NULL;                                                         
     }                                                                        
    //头结点中链表长度要初始化为0                                            
     head->data.len=0;                                                        
     //头结点中的指针域要初始化为自身                                         
     head->next=head;                                                         
    return head;                                                             
 }                                                                            
  /*                                                                       
 * function:    //头插法插入                                             
 * @param [ in]                                                          
 * @param [out]                                                          
 * @return                                                               
 */                                                                      
                                                                         
int insert_LooplinklistHead(LoopLinklist* head,datatype num)             
{                                                                        
    //创建一个新结点                                                     
    LoopLinklist* temp=(LoopLinklist*)malloc(sizeof(LoopLinklist));      
    if(NULL==temp)                                                       
    {                                                                    
        printf("创建一个新结点失败,插入失败\n");                        
        return -1;                                                       
    }                                                                    
    //将结点进行初始化                                                   
    temp->data.text=num;                                                 
    temp->next=head;                                                     
                                                                         
    //将新的结点头插法插入链表                                           
    temp->next=head->next;                                               
    head->next=temp;                                                     
                                                                         
    head->data.len++;   //更新头结点中链表长度度                         
                                                                         
    return 0;                                                            
}                                                                        
    /*                                                
     * function:    //遍历链表                        
     * @param [ in]                                   
     * @param [out]                                   
     * @return                                        
     */                                               
void show_Looplinklist(LoopLinklist* head)            
{                                                     
    LoopLinklist* p=head->next;                       
    while(p!=head)                                    
    {                                                 
        printf("%d\t",p->data.text);                  
        p=p->next;                                    
    }                                                 
    putchar(10);                                      
    return;                                           
}                                                     
                                                                           
/*                                                                         
 * function:    //尾插法插入数据                                           
 * @param [ in]                                                            
 * @param [out]                                                            
 * @return                                                                 
 */                                                                        
                                                                           
int insert_LooplinklistRear(LoopLinklist* head,datatype num)               
{                                                                          
    //创建一个新结点                                                       
    LoopLinklist* temp=(LoopLinklist*)malloc(sizeof(LoopLinklist));        
    if(NULL==temp)                                                         
    {                                                                      
        printf("创建一个新结点失败,插入失败\n");                          
        return -1;                                                         
    }                                                                      
    //将结点进行初始化                                                     
    temp->data.text=num;                                                   
    temp->next=NULL;                                                       
                                                                           
    //找到尾结点                                                           
    LoopLinklist*p=head;                                                   
    while(p->next!=head)                                                   
    {                                                                      
            p=p->next;                                                     
    }                                                                      
    //插法插入数据                                                         
    temp->next=p->next;                                                    
    p->next=temp;                                                          
                                                                           
    head->data.len++;   //更新头结点中链表长度                             
    return 0;                                                              
}                                                                          
 /*                                                
 * function:    判断链表是否为空                  
 * @param [ in]                                   
 * @param [out]                                   
 * @return      为空返回1,不为空返回0            
 */                                               
int isEmpty_Looplinklist(LoopLinklist*head)       
{                                                 
    return head->next==head?1:0;                  
}                                                 
  /*                                                          
 * function:    //头删法                                    
 * @param [ in]                                             
 * @param [out]                                             
 * @return                                                  
 */                                                         
datatype  delete_LooplinklistHead(LoopLinklist*head)        
{                                                           
    //判断是否为空                                          
    if(isEmpty_Looplinklist(head))                          
    {                                                       
        printf("链表为空,删除失败\n");                     
        return (datatype)(-1);                              
    }                                                       
    //备份要删除的结点p                                     
    LoopLinklist*p=head->next;                              
    //修改头结点中指针域的指向                              
    head->next=p->next;                                     
                                                            
    datatype num=p->data.text;                              
    //释放结点p                                             
    free(p);                                                
    p=NULL;                                                 
                                                            
    head->data.len--;                                       
    return num;                                             
}                                                           
   /*                                                              
 * function:    //尾删法                                        
 * @param [ in]                                                 
 * @param [out]                                                 
 * @return                                                      
 */                                                             
datatype  delete_LooplinklistRear(LoopLinklist*head)            
{                                                               
    //判断是否为空                                              
    if(isEmpty_Looplinklist(head))                              
    {                                                           
        printf("链表为空,删除失败\n");                         
        return (datatype)(-1);                                  
    }                                                           
    //找到倒数第二个结点                                        
    LoopLinklist*p,*q;                                          
    p=head;                                                     
    while(p->next->next!=head)                                  
    {                                                           
        p=p->next;                                              
    }                                                           
        q=p->next;                                              
        p->next=q->next;                                        
                                                                
    datatype num=p->next->data.text;                            
    free(q);                                                    
    q=NULL;                                                     
                                                                
    head->data.len--;                                           
    return num;                                                 
}                                                                                                                                                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值