单向循环链表 - 约瑟夫环 //不带头结点的单向循环链表
定义实现节点
typedef int data_t;
typedef struct node{
data_t data; //保存数据
struct node *next; //保存下一个节点的地址
}link_node_t;
创建空链表
//创建空链表
link_node_t *create_link_list(data_t x)
{
//定义头结点,在堆上分配空间
link_node_t *h = NULL;
h = (link_node_t *)malloc(sizeof(link_node_t));
if(h == NULL){
printf("create_link_list malloc error\n");
return NULL;
}
//初始化头结点,数据域和指针域赋值
h->data = x;
h->next = h;
return h;
}
插入一个节点 - 首插法 - 在头结点后面插入一个节点
int insert_frist(link_node_t *h, data_t x)
{
//新建一个节点,保存要插入的数据元素
link_node_t *new = (link_node_t *)malloc(sizeof(link_node_t));
if(new == NULL){
printf("insert_frist malloc failed\n");
return -1;
}
new->data = x;
//建立新的连接
new->next = h->next;
h->next = new;
return 0;
}
删除一个节点 - 任意位置
int delete_any_node(link_node_t *h, int pos)
{
int i;
link_node_t *p = NULL, *q = NULL;
if(pos<1 || pos>length_link_list(h)-1){
printf("delete_any_node pos error\n");
return -1;
}
p = h;
for(i=1; i<=pos-1; i++)
p = p->next;
q = p->next;
p->next = q->next;
free(q);
return 0;
}
遍历,打印链表中所有的数据
void print_link_list(link_node_t *h)
{
link_node_t *p = h;
while(p->next != h){
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data);
/*
do{
printf("%d ", p->data);
p = p->next;
}while(p != h);
*/
}
求链表长度
//求链表长度
int length_link_list(link_node_t *h)
{
link_node_t *p = h;
int len = 0;
do{
len++;
p = p->next;
}while(p != h);
return len;
}