linklist_xh.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist_xh.h"
loopLinkList* create_loopLinkList(void)
{
loopLinkList* head = (loopLinkList*)malloc(sizeof(loopLinkList));
if(NULL == head)
{
printf("头结点申请失败!\n");
return NULL;
}
head->text.len = 0;
head->next = head;
return head;
}
//头插法
int insertHead_looplinlist(loopLinkList *head,dataType num)
{
//创建一个新结点
loopLinkList* temp = (loopLinkList*)malloc(sizeof(loopLinkList));
if(NULL == temp)
{
printf("创建失败!\n");
return 0;
}
temp->text.data = num;
temp->next = NULL;
//头插法插入数据
temp->next = head->next;
head->next = temp;
head->text.len++;
return 0;
}
//遍历链表
void show_looplinklist(loopLinkList* head)
{
loopLinkList *p = head;
while(p->next != head)
{
p = p->next;
printf("%d ",p->text.data);
}
printf("\n");
//更新头结点中记录的链表长度
head->text.len++;
return;
}
//尾插法
int insertTail_looplinlist(loopLinkList* head,dataType num)
{
loopLinkList* temp = (loopLinkList*)malloc(sizeof(loopLinkList));
if(NULL == temp)
{
printf("创建失败!\n");
return 0;
}
//初始化新结点
temp->text.data = num;
temp->next = NULL;
loopLinkList* p = head;
while(p->next != head)
{
p = p->next;
}
p->next = temp;
temp->next = head;
head->text.len++;
return 0;
}
//判空
int isEmpty_looplinlist(loopLinkList* head)
{
return head->next == NULL?1:0;
}
//头删
dataType delHead_looplinlist(loopLinkList* head)
{
if(isEmpty_looplinlist(head))
{
printf("链表为空!");
return (dataType)0;
}
loopLinkList* temp = head->next;
head->next = head->next->next;
dataType num = temp->text.data;
free(temp);
temp = NULL;
head->text.len--;
return num;
}
//尾删
dataType delTail_looplinlist(loopLinkList* head)
{
if(isEmpty_looplinlist(head))
{
printf("链表为空!");
return (dataType)0;
}
loopLinkList* p = head;
loopLinkList* temp;
while(p->next != head)
{
temp = p;
p = p->next;
}
temp->next=temp->next->next;
free(p);
p = NULL;
head->text.len--;
return 0;
}
//按位置插入
void insert_location_looplinlist(loopLinkList *head,dataType index,dataType num)
{
if(index<1 || index >head->text.len+1)
{
printf("位置非法!");
return;
}
int i;
loopLinkList* temp=head;
loopLinkList* p = (loopLinkList*)malloc(sizeof(loopLinkList));
if(NULL == p)
{
printf("插入失败!\n");
return ;
}
//初始化新结点
p->text.data = num;
p->next = NULL;
for(i=0;i<index-1;i++)
{
temp = temp->next;
}
p->next = temp->next;
temp->next = p;
head->text.len++;
return;
}
//按位置删除
void del_location_looplinlist(loopLinkList* head,dataType index)
{
if(isEmpty_looplinlist(head))
{
printf("链表为空!");
return;
}
loopLinkList* temp = head;
for(int i=0;i<index-1;i++)
{
temp = temp->next;
}
loopLinkList* p = temp->next;
temp->next = temp->next->next;
free(p);
p = NULL;
head->text.len--;
return;
}
//按位置查找
void find_location_looplinlist(loopLinkList* head,dataType index)
{
loopLinkList* temp = head;
for(int i=0;i<index;i++)
{
temp = temp->next;
}
printf("%d",temp->text.data);
head->text.len++;
printf("\n");
return;
}
main_xh.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist_xh.h"
int main(int argc, const char *argv[])
{
loopLinkList* head = create_loopLinkList();
/* insertHead_looplinlist(head,12);
insertHead_looplinlist(head,22);
insertHead_looplinlist(head,32);
insertHead_looplinlist(head,42);
show_looplinklist(head);
insertTail_looplinlist(head,111);
insertTail_looplinlist(head,222);
insertTail_looplinlist(head,333);
show_looplinklist(head);
*/
/*
delHead_looplinlist(head);
show_looplinklist(head);
delTail_looplinlist(head);
show_looplinklist(head);
*/
/* insert_location_looplinlist(head,2,2222);
show_looplinklist(head);
del_location_looplinlist(head,8);
show_looplinklist(head);
find_location_looplinlist(head,2);
*/
loopLinkList* head = (loopLinkList*)malloc(sizeof(loopLinkList));
head->data = 1;
head->next = head;
node* current = head;
for (int i = 8; i >= 1; i--) {
loopLinkList* newNode = (loopLinkList*)malloc(sizeof(loopLinkList));
newNode->text.data = i;
newNode->next = head->next;
head->next = newNode;
}
int m = 4; // 每次数的节点数
int n = 8; // 初始节点个数
joseph(head);
return 0;
}
linllist_xh.h
#ifndef __LOOP_LINK_LIST__
#define __LOOP_LINK_LIST__
typedef int dataType;
union msg{
dataType data;
int len;
};
typedef struct node
{
struct node* next;
union msg text;
}loopLinkList;
loopLinkList* create_loopLinkList(void);
int insertHead_looplinlist(loopLinkList *head,dataType num);
void show_looplinklist(loopLinkList* head);
int insertTail_looplinlist(loopLinkList* head,dataType num);
dataType delHead_looplinlist(loopLinkList* head);
dataType delTail_looplinlist(loopLinkList* head);
void insert_location_looplinlist(loopLinkList *head,dataType index,dataType num);
void del_location_looplinlist(loopLinkList* head,dataType index);
void find_location_looplinlist(loopLinkList* head,dataType index);
void joseph(loopLinkList* head);
#endif