单向循环链表
1.创建结点
int is_malloc_ok(Clink new_node)
{
if(NULL == new_node)
{
printf("malloc fail!\n");
return MALLOC_NO;
}
else
{
return MALLOC_OK;
}
}
int create_node(Clink *new_node)
{
*new_node = (Clink) malloc(sizeof(Node));
if(MALLOC_OK == is_malloc_ok(*new_node))
{
return CREATE_OK;
}
else
{
return CREATE_NO;
}
}
2.创建一个只有头结点的单向循环链表
void create_clink(Clink *head)
{
if(CREATE_OK == create_node(head))
{
(*head)->next = *head;
}//创建一个只有头结点的单向循环链表
else
{
return;
}
}
3.头插
void insert_node_head(Clink head,Clink new_node)
{
new_node->next = head->next;
head->next = new_node;
}//头插
4.尾插
void insert_node_tail(Clink head,Clink new_node)
{
Clink p = NULL;
p = head;
while(p->next != head)
{
p = p->next;
}
p->next = new_node;
new_node->next = head;//指向头结点的连接断了,重新指向
}//尾插
5.中间前插
void insert_node_mid_before(Clink head,Clink new_node,int num)
{
Clink p,q = NULL;
q = head;
p = head->next;
while(p != head && p->num != num)
{
q = p;
p = p->next;
}
q->next = new_node;
new_node->next = p;
}//中间前插
6.中间后插
void insert_node_mid_after(Clink head,Clink new_node,int num)
{
Clink p = NULL;
p = head->next;
while(p != head && p->num != num)
{
p = p->next;
}
new_node->next = p->next;
p->next = new_node;//顺序不能乱
}
7.直插排序
void insert_node_sort(Clink head,Clink new_node)
{
Clink p,q = NULL;
q = head;
p = head->next;
while(p != head && p->num < new_node->num)
{
q = p;
p = p->next;
}
q->next = new_node;
new_node->next = p;
}
8.数据查找
Clink find_node(Clink head,int num)
{
Clink p = NULL;
p = head->next;
while(p != head && p->num != num)
{
p = p->next;
}
if(p == head)//注意不是NULL
{
return NULL;
}
else
{
return p;
}
}
9.数据删除
void delete_node(Clink head,int num)
{
Clink p,q = NULL;
q = head;
p = head->next;
while(p != head && p->num != num)
{
q = p;
p = p->next;
}
if(NULL == p)
{
printf("no such node\n");
}
else
{
q->next = p->next;
free(p);
}
}
10.链表长度统计
int Length_clink(Clink head)
{
Clink p = NULL;
p = head;
int count = 0;
while(p->next != head)
{
p = p->next;
count++;
}
return count;
}
11.清空链表
void make_empty(Clink head)
{
Clink p = NULL;
p = head->next;
while(p != head)
{
head->next = p->next;
free(p);
p = head->next;
}
}//置空链表,保留头结点
12.释放链表
void release_clink(Clink *head)
{
make_empty(*head);
free(*head);
*head = NULL;
printf("release clink ok!\n");
}//释放链表
13.遍历链表
void display_clink(Clink head)
{
Clink p = NULL;
p = head->next;
while(p != head)
{
printf("%d ",p->num);
p = p->next;
}
printf("\n");
}//遍历
14.逆序
void reverse_clink(Clink head)
{
Clink p,q;
p = head->next;
head->next = head;//断开head->next指向,重新指向自己
while(p != head)
{
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}//逆序