ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

单向循环链表的操作

2026/9/25 10:16:45 拓冰建站 浏览量
单向循环链表的操作

main函数:

 #ifndef __loopLinkList_H__#define __loopLinkList_H__typedef int datatype;union msg{    //若数据的类型也为int,则不需要这个联合体datatype data;int len;       //放头结点,记录链表长度};typedef struct node{union msg text;struct node* next; //指针,由于指针指向这一整个节点,所以类型为struct node*}loopLinkList;loopLinkList* create_loopLinkList(void);void insertHead_loopLinkList(loopLinkList* head,datatype num);void insertTail_loopLinkList(loopLinkList* head,datatype num);void deleteHead_loopLinkList(loopLinkList* head);void deleteTail_loopLinkList(loopLinkList* head);void show_loopLinkList(loopLinkList* head);#endif                                                                          

功能函数:

#include<stdio.h>                                                                
#include <stdlib.h>                                                              
#include "./13_loopLinkList.h"                                                   
//创建一个单向循环链表                                                           
loopLinkList* create_loopLinkList()                                              
{                                                                                //定义头结点并初始化                                                         loopLinkList* head=(loopLinkList*)malloc(sizeof(loopLinkList));              head->next=head;                                                             head->text.len=0;                                                            return head;                                                                 
}                                                                                
//判断链表是否为空                                                               
int isEmpty_loopLinkList(loopLinkList* head)                                     
{                                                                                //1表示链表为空,0表示链表不为空                                             return head->next==head?1:0;                                                 
}                                                                                
//头插                                                                           
void insertHead_loopLinkList(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;                                                                      
}                                                                                
//尾插                                                                           
void insertTail_loopLinkList(loopLinkList* head,datatype num)                    
{                                                                                //申请一个空间定义一个新的结点                                               loopLinkList* temp=(loopLinkList*)malloc(sizeof(loopLinkList));              if(NULL == temp)                                                             {                                                                            printf("结点定义失败!\n");                                              return;                                                                  }                                                                            //初始化这个结点                                                             temp->text.data=num;                                                         temp->next=NULL;                                                             //找到链表最后一个结点                                                       loopLinkList* p=head;                                                        while(p->next!=head)                                                         {                                                                            p=p->next;                                                               }                                                                            //插入temp                                                                   temp->next=head;                                                             p->next=temp;                                                                head->text.len--;                                                            return;                                                                      
}   
//按位置插入                                                               
void insertByPositon_loopLinkList(loopLinkList* head,datatype num,int pos) 
{                                                                          if(pos<1 || pos >head->text.len+1)                                     {                                                                      printf("插入位置不合法!\n");                                      }                                                                      loopLinkList* temp = (loopLinkList*)malloc(sizeof(loopLinkList));      temp->text.data=num;                                                   temp->next=NULL;                                                       loopLinkList* p=head;                                                  int i;                                                                 for(i=0;i<pos-1;i++)                                                   {                                                                      p=p->next;                                                         }                                                                      temp->next=p->next;                                                    p->next=temp;                                                          head->text.len++;                                                      return;                                                                
}                                                                          
//头删                                                                     
void deleteHead_loopLinkList(loopLinkList* head)                           
{                                                                          if(isEmpty_loopLinkList(head))                                         {                                                                      printf("链表为空,删除失败!\n");                                   return;                                                            }                                                                      loopLinkList* temp=head->next;                                         head->next=temp->next;                                                 free(temp);                                                            head->text.len--;                                                      return;                                                                
}                                                                          //尾删                                                          void deleteTail_loopLinkList(loopLinkList* head)                {                                                               if(isEmpty_loopLinkList(head))                              {                                                           printf("链表为空,删除失败!\n");                        return;                                                 }                                                           loopLinkList* p=head;                                       while(p->next->next!=head)                                  {                                                           p=p->next;                                              }                                                           free(p->next);                                              p->next=head;                                               head->text.len--;                                           return;                                                     }                                                               //按位置删除                                                    void deleteBypos_loopLinkList(loopLinkList* head,int pos)       {                                                               if(isEmpty_loopLinkList(head))                          {                                                           printf("链表为空,删除失败!\n");                        return;                                                 }                                                           loopLinkList* p=head;                                       int i;                                                      for(i=0;i<pos-1;i++)                                        {                                                           p=p->next;                                              }                                                           free(p->next);                                              p->next=p->next->next;                                      head->text.len--;                                           return;                                                     }                                                               //遍历                                                          void show_loopLinkList(loopLinkList* head)                      {                                                               loopLinkList* p=head;                                       if(isEmpty_loopLinkList(head))                              {                                                           printf("链表为空!\n");                                 return;                                                 }                                                           while(p->next!=head)                                        {                                                           p=p->next;                                              printf("%d ",p->text.data);                             }                                                           printf("\n");                                               return;                                                     }   
//约瑟夫问题 void josepg_loopLinkList(int n ,int k,int m){loopLinkList* head = create_loopLinkList();//将1到n的数据插入到循环列表中int i=0;for(i=1;i<=n;i++){insertTail_loopLinkList(head,i);}//删除头结点,将头指针指向头结点后的第一个有效数据loopLinkList* p=head;while(p->next!=head){p=p->next;}//p就是当前链表的尾结点//移动头指针到第一个有效数据head=head->next;//释放头结点free(p->next);//将尾结点的指针指向第一个有效数据p->next=head;//通过循环找到编号为1的位置p=head;for(i=0;i<k-1;i++){p=p->next;}//p就是编号为1的位置while(p->next != p)//当链表中只有一个结点时退出循环{//找到要出列的那个数的前一个结点for(i=0;i<m-2;i++){p=p->next;}//p就是要出列的前一个结点//将要数列的那个结点存起来,后面方便释放loopLinkList* temp = p->next;//将p的指针域指向要出列的结点的下一个结点,即将要出列的那个节点删除p->next = temp->next;//打印出列的结点里面的数printf("%d ",temp->text.data);//释放该结点free(temp);                                                                    temp=NULL;//将刚刚出队的下一个结点置为1p=p->next;}//上述循环后,整个链表中还剩一个结点printf("%d\n",p->text.data);free(p);p=NULL;}

头文件:

 #ifndef __loopLinkList_H__                                                                                             #define __loopLinkList_H__                                                                                             typedef int datatype;                                                                                                  union msg{    //若数据的类型也为int,则不需要这个联合体                                                                datatype data;                                                                                                         int len;       //放头结点,记录链表长度                                                                                };                                                                                                                     typedef struct node{                                                                                                   union msg text;                                                                                                    struct node* next; //指针,由于指针指向这一整个节点,所以类型为struct node*                                        }loopLinkList;                                                                                                         loopLinkList* create_loopLinkList(void);                                                                               void insertHead_loopLinkList(loopLinkList* head,datatype num);                                                         void insertByPositon_loopLinkList(loopLinkList* head,datatype num,int pos);                                            void insertTail_loopLinkList(loopLinkList* head,datatype num);                                                         void deleteHead_loopLinkList(loopLinkList* head);                                                                      void deleteTail_loopLinkList(loopLinkList* head);                                                                      void show_loopLinkList(loopLinkList* head);                                                                            
void josepg_loopLinkList(int n,int k,int m);void deleteBypos_loopLinkList(loopLinkList* head,int pos);#endif