嵌入式-单向循环链表

单向循环链表

头插法、尾删法、头删法、尾插法、按位插入、按位删除、遍历。

linklist_main.c文件

 #include <stdio.h>
 #include <stdlib.h>
 #include "./linklistfunc.h"
 
 
 int main(int argc, const char *argv[])
 {
     loopLinklist* head =create_looplinklist();
 
 
     //尾插法
     insert_linklist(head,100);
     insert_linklist(head,90);
     insert_linklist(head,80);
     show_linklist(head);
 
 
 //头插法
     insertbyfront_linklist(head,30);
     insertbyfront_linklist(head,40);
     show_linklist(head);
 
 //头删法
     deletebyfront_linklist(head);
     show_linklist(head);
 
 //尾删法
     deletebyrear_linklist(head);
     show_linklist(head);
 
                                                                  
 //按位置插入(Bitwise按位)
     insert_linklistBitwise(head,10,2);
     show_linklist(head);
 
 //按位置删除
     delete_linklistBitwise(head,2);
     show_linklist(head);
 
 
 
 
     return 0;
 }
                                                                  
                                                                  

linklistfunc.c文件

 #include <stdio.h>
 #include <stdlib.h>
 #include "./linklistfunc.h"
 
 
 loopLinklist* create_looplinklist(void)
 {
     //*phead代表访问了phead指向的那块空间
     loopLinklist* head = (loopLinklist*)malloc(sizeof(loopLinklist));
 
     if(NULL == head)
     {
         printf("单向循环链表创建失败\n");
         return NULL;
     }
 
     head->text.len =0;
     head->next = head;
 
     return head;
 }
 
 
//尾插法
void insert_linklist(loopLinklist *head,datatype num)
{
    //创建一个新的结点                                                          
    loopLinklist* temp = (loopLinklist*)malloc(sizeof(loopLinklist));
    if(NULL==temp)
    {
        printf("创建结点失败,尾插失败\n");

        return;
    }

    temp->text.data = num;
    temp->next= NULL;


    //找到尾节点p的值
    loopLinklist *p =head;
    while(p->next != head)
    {
        p=p->next;

    }

    temp->next=p->next;
    p->next=temp;

    //更新链表的长度
    head->text.len++;

    return;

}
//头插法
void insertbyfront_linklist(loopLinklist *head,datatype num)
{
    //创建一个新的结点
    loopLinklist* temp = (loopLinklist*)malloc(sizeof(loopLinklist));
    if(NULL==temp)                                                          
    {
        printf("创建结点失败,头插失败\n");

        return;
    }

    temp->text.data = num;
    temp->next= NULL;

    temp->next = head->next;
    head->next=temp;

    //更新结点链表长度
    head->text.len++;

    return ;
}


//头删法
datatype deletebyfront_linklist(loopLinklist *head)
{
    if(head->next==head)
    {
        printf("链表为空,删除失败\n");
        return (datatype)-1;
    }

    //备份需要删除的结点
    loopLinklist* temp = head->next;
    head->next=temp->next;

    datatype num = temp->text.data;
    free(temp);

    //更新结点链表长度
    head->text.len--;

    return num;
}

 //尾删法
 datatype deletebyrear_linklist(loopLinklist* head)
 {
     if(head->next==head)                                   
     {
         printf("链表为空,删除失败\n");
         return (datatype)-1;
     }
 
     //遍历找到倒数第二个结点,删除倒数第一个结点
     loopLinklist* p = head;
     while(p->next->next != head)
     {
         p = p->next;
     }
 
     loopLinklist* temp = p->next;
     p->next=p->next->next;
 
     datatype num = temp->text.data;
     free(temp);
 
     //更新结点链表长度
     head->text.len--;
     return num;
 }
 
 
 
//按位置插入(Bitwise按位)
 void insert_linklistBitwise(loopLinklist* head,datatype num,int n)
 {
                                                                             
 //判断插入的位置是否合法
 if(n<1 || n>head->text.len+1)
     {
         printf("插入位置非法\n");
     }
 //向第n个位置插入,则需要找到第n-1个位置插入
 //若在找的途中,p指向NULL,则代表插入位置非法

     loopLinklist *p = head;
     for(int i=0;i<n-1;i++)
     {
         p=p->next;
         if(NULL == p)
         {
             printf("插入位置非法\n");

             return ;
         }
     }
     //先创建结点
     loopLinklist* temp =(loopLinklist*)malloc(sizeof(loopLinklist));

     if(NULL == temp)
     {
     printf("创建结点失败,按位置插入失败\n");
     return ;

     }
     temp->text.data = num;//数据域赋值
     temp->next = NULL;//指针域赋值


    temp->next=p->next;
    p->next = temp;

    //更新头结点中链表的长度
    head->text.len++;

    return ;
}

//按位置删除                                                           
void delete_linklistBitwise(loopLinklist* head,int n)
{
    //判断链表是否为空
    if(NULL ==head->next)
    {
        printf("链表为空,删除失败\n");

        return ;
    }
    //判断删除位置是否合法
    if(n<1)
    {
        printf("删除位置非法\n");

        return;
    }
    //找到要删除的位置的前一个结点位置
    //删除第n个位置,则需要找到第n-1个位置
   loopLinklist *p = head;
    for(int i=0;i<n-1;i++)
    {
        p=p->next;

        if(p->next == NULL)
        {
            printf("当前插入的位置非法\n");
            return ;
        }

    }


    //p指向的是要删除的结点的前一个位置
    loopLinklist* temp=p->next;
    p->next=temp->next;
    free(temp);
    temp=NULL;

    //更新头结点中链表的长度
    head->text.len--;

    return ;
}


//遍历链表
void show_linklist(loopLinklist*head)
{
    loopLinklist* p =head;
    while(p->next != head)
    {
        p=p->next;
        printf("%d ",p->text.data);
    }
    putchar(10);

    return ;
}



linklistfunc.h文件

  #ifndef __LINKLIST__
  #define __LINKLIST__
 
 
  typedef int datatype;
 
 
 
  //结构体
  typedef struct looplklist
  {
      union
      {
          int len;//若是头结点,则是用len存储链表长度
          datatype data;//若是有效数据结点,则用data存放有效数据
 
      }text;//数据域
 
      struct looplklist* next;//指针域
  }loopLinklist;
 
 loopLinklist* create_looplinklist(void);
 
  //尾插法
  void insert_linklist(loopLinklist *head,datatype num);
 
 //遍历链表                             
 void show_linklist(loopLinklist*head);
 
 //头插法
 void insertbyfront_linklist(loopLinklist *head,datatype num);
 
 
 //头删法
 datatype deletebyfront_linklist(loopLinklist *head);
                                                                           
 //尾删法
 datatype deletebyrear_linklist(loopLinklist* head);
 
                                                                          
//按位置插入(Bitwise按位)
 void insert_linklistBitwise(loopLinklist* head,datatype num,int n);


 //按位置删除
void delete_linklistBitwise(loopLinklist* head,int n);




#endif

                                                                          
                                                                          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值