#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct hnode
{
int num;
struct hnode * next;
};
typedef struct hnode Hnode;
typedef Hnode * CircHlink;
enum result_val{RET_OK = 1000,RET_NO};
int is_malloc_ok( CircHlink new_node)
{
if(new_node == NULL)
{
return RET_NO;
}
else
{
return RET_OK;
}
}
int create_node( CircHlink * new_node)
{
*new_node = ( CircHlink)malloc((unsigned)sizeof(Hnode));
if(RET_NO == is_malloc_ok(*new_node))
{
return RET_NO;
}
else
{
return RET_OK;
}
}
void create_link( CircHlink * head)
{
create_node(head);
(*head)->next = *head ;
}
void display_link( CircHlink head)
{
CircHlink p =NULL;
if(head == NULL)
{
printf("no link !\n");
}
else
{
p = head->next;
if(head->next == head)
{
printf("the link is empty !\n");
return;
}
else
{
while(p != head)
{
printf("%d\n",p->num);
p = p->next;
}
}
}
}
void insert_node_head( CircHlink head, CircHlink new_node)
{
new_node->next = head->next;
head->next = new_node;
}
void insert_node_mind_sort( CircHlink head, CircHlink new_node)
{
CircHlink p = NULL;
CircHlink q = NULL;
p = (head)->next;
q = head;
while(p != head && p->num < new_node->num)
{
q = p;
p = p->next;
}
q->next = new_node;
new_node->next = p;
}
void insert_node_tail( CircHlink head, CircHlink new_node)
{
CircHlink p = NULL;
p = head;
while(p->next != head)
{
p = p->next;
}
p->next = new_node;
new_node->next = head;
}
void insert_node_mind_front( CircHlink head, CircHlink new_node,int loc)
{
CircHlink p = NULL;
CircHlink q = NULL;
p = head->next;
q = head;
while(p != head && p->num != loc)
{
q = p;
p = p->next;
}
q->next = new_node;
new_node->next = p;
}
void insert_node_mind_behand(CircHlink head,CircHlink new_node,int loc)
{
CircHlink p = NULL;
p = head;
while(p->next != NULL && p->num != loc)
{
p = p->next;
}
new_node->next = p->next;
p->next =new_node;
}
void reverse_node( CircHlink head)
{
CircHlink p1 = NULL;
CircHlink p2 = NULL;
CircHlink p3 =NULL;
p1 = head->next;
if( head ->next == head)
{
printf("the link is empty !\n");
}
else if((head)->next->next == head)
{
printf("is only one node \n");
}
else if(((head)->next)->next->next == head)
{
p2 = p1->next;
p2->next = p1;
(head)->next->next = head;
head->next = p2;
}
else
{
p2 = p1->next;
p3 = p2->next;
p2->next = p1;
p1->next = head;
head->next = p2;
while(p3 != head)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
(head)->next =p2;
}
}
void delete_node( CircHlink head,int num)
{
CircHlink p = NULL;
CircHlink q = NULL;
q = head;
p = head->next;
while(p != head && p->num != num)
{
q = p;
p = p->next;
}
if(p == head)
{
printf("NO find\n");
}
else
{
q->next = p->next;
free(p);
}
}
int length_link( CircHlink head)
{
CircHlink p = NULL;
int count = 0;
p = head->next;
while(p != head)
{
count++;
p = p->next;
}
return count;
}
CircHlink find( CircHlink head,int num)
{
CircHlink p = NULL;
p = head->next;
while(p != head && p->num != num)
{
p = p->next;
}
if(p == head)
{
return NULL;
}
else
{
return p;
}
}
void make_empty( CircHlink head)
{
CircHlink p =NULL;
p = head->next;
while(head->next != head)
{
p = head->next;
head->next = head->next->next;
free(p);
}
}
void release_link( CircHlink * head)
{
make_empty(*head);
while(*head != NULL)
{
if((*head)->next == *head)
{
free(*head);
}
*head = NULL;
}
}
int main()
{
CircHlink head = NULL;
CircHlink new_node = NULL;
CircHlink p = NULL;
int i;
int loc;
int num;
int count=0;
srand((unsigned)time(NULL));
create_link(&head);
for(i = 0; i < 10; i++)
{
if(RET_OK == create_node(&new_node))
{
new_node->num = rand() % 100;
//new_node->num = i+1;
insert_node_mind_sort(head,new_node);
//insert_node_head(head,new_node);
//insert_node_tail(head,new_node);
}
else
{
i--;
}
}
/*count = length_link(head);//长度
printf("the length is %d\n",count);*/
display_link(head);
/*printf("please input the num\n");//查找
scanf("%d",&num);
p = find(head,num);
if(p == NULL)
{
printf("no found\n");
}
else
{
printf("the result is %d\n",p->num);
}
*/
/*printf("\nplease input the num\n");//删除
scanf("%d",&num);
printf("\nthe result is \n");
delete_node(head,num);
display_link(head);*/
/*if(RET_OK == create_node(&new_node))//插入
{
printf("please input the loc\n");
scanf("%d",&loc);
printf("please input the num\n");
scanf("%d",&new_node->num);
printf("\n");
//insert_node_mind_front(head,new_node,loc);
insert_node_mind_behand(head,new_node,loc);
display_link(head);
}*/
// display_link(head);
printf("the reverse is \n");
reverse_node(head);//逆序
display_link(head);
make_empty(head);
display_link(head);
release_link(&head);
display_link(head);
}
C语言循环链表的实现
最新推荐文章于 2025-04-14 22:13:55 发布