#include <stdio.h>
#include <stdlib.h>
#define CREATE_OK 0
#define CREATE_NO 1
#define MALLOC_OK 0
#define MALLOC_NO 1
#define EMPTY_OK 0
#define EMPTY_NO 1
typedef struct cnode
{
int num;
struct cnode *next;
}Cnode, *Clink;
int is_malloc_ok(Clink node)
{
if (NULL == node)
{
return MALLOC_NO;
}
else
{
return MALLOC_OK;
}
}
//判断链表是否为空
int is_link_empty(Clink head)
{
if (head->next == head)
{
return EMPTY_OK;
}
else
{
return EMPTY_NO;
}
}
//创建结点
int create_node(Clink *new_node)
{
*new_node = (Clink)malloc(sizeof(Cnode));
if (MALLOC_OK != is_malloc_ok(*new_node))
{
return CREATE_NO;
}
else
{
return CREATE_OK;
}
}
//创建链表
int create_link(Clink *head)
{
int mark = create_node(head);
if (mark != CREATE_OK)
{
return CREATE_NO;
}
else
{
(*head)->next = *head;
return CREATE_OK;
}
}
//头插
void insert_node_head(Clink head, Clink new_node)
{
new_node->next = head->next;
head->next = new_node;
}
//尾插
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;
}
//前插
void insert_node_mid_before(Clink head, Clink new_node, int loc)
{
Clink p = NULL, q = NULL;
q = head;
p = head->next;
while (p != head && p->num != loc)
{
q = p;
p = p->next;
}
new_node->next = p;
q->next = new_node;
}
//后插
void insert_node_mid_after(Clink head, Clink new_node, int loc)
{
Clink p = NULL;
p = head->next;
while (p->next != head && p->num != loc)
{
p = p->next;
}
new_node->next = p->next;
p->next = new_node;
}
//排序插(从小到大)
void insert_node_sort(Clink head, Clink new_node)
{
Clink p = NULL, 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;
}
//按值删除结点
void delete_node(Clink head)
{
int num;
printf("Please input a num you want to delete:\n");
scanf("%d", &num);
Clink p = NULL, q = NULL;
q = head;
p = head->next;
while (p != head && p->num != num)
{
q = p;
p = p->next;
}
if (head == p)
{
printf("No such node!\n");
}
else
{
q->next = p->next;
free(p);
p = NULL;
printf("The node was deleted!\n");
}
}
//长度
int length_link(Clink head)
{
int length = 0;
Clink p = NULL;
p = head;
while (p->next != head)
{
p = p->next;
length++;
}
return length;
}
//遍历
void display_link(Clink head)
{
if (NULL == head)
{
printf("No such link!\n");
}
else if (EMPTY_NO != is_link_empty(head))
{
printf("The link is empty!\n");
}
else
{
printf("The link is:\n");
Clink p = NULL;
p = head->next;
while (p != head)
{
printf("%4d", p->num);
p = p->next;
}
}
printf("\n");
}
//清空(除头结点)
void empty_link(Clink head)
{
if (EMPTY_NO != is_link_empty(head))
{
return;
}
Clink p = NULL;
p = head->next;
while (p != head)
{
head->next = p->next;
free(p);
p = head->next;
}
}
//释放内存
void release_link(Clink *head)
{
empty_link(*head);
free(*head);
*head = NULL;
printf("The link is released!\n");
}
//翻转
void reverse_link(Clink head)
{
if (EMPTY_OK == is_link_empty(head))
{
return;
}
Clink p1 = NULL, p2 = NULL, p3 = NULL;
p1 = head->next;
p2 = p1->next;
if (head == p2)
{
return;
}
p3 = p2->next;
while (p3 != head)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
head->next->next = head;
head->next = p2;
}
//从小到大排序
void sort_link(Clink head)
{
if (EMPTY_OK == is_link_empty(head))
{
return;
}
Clink p = NULL, q = NULL;
q = head->next;
p = q->next;
if (head == p)
{
return;
}
int i, j, tmp;
for (i = 0; i < length_link(head) - 1; i++)
{
for (j = 0; j < length_link(head) - 1 - i; j++)
{
if (q->num > p->num)
{
tmp = q->num;
q->num = p->num;
p->num = tmp;
}
q = p;
p = p->next;
}
q = head->next;
p = q->next;
}
}
int main()
{
Clink head = NULL;
int mark = create_link(&head);
while (mark != CREATE_OK)
{
mark = create_link(&head);
}
Clink new_node = NULL;
int i;
int loc;
for (i = 0; i < 10; i++)
{
while (CREATE_OK != create_node(&new_node))
{
}
new_node->num = rand() % 100;
//insert_node_head(head, new_node);
insert_node_tail(head, new_node);
}
printf("old link:\n");
display_link(head);
printf("从小到大排列的链表:\n");
sort_link(head);
display_link(head);
printf("翻转后的链表:\n");
reverse_link(head);
display_link(head);
/* length_link(head);
delete_node(head);
display_link(head);
length_link(head);
*/
printf("插入位置:\n");
scanf("%d", &loc);
printf("插入的值:\n");
scanf("%d", &new_node->num);
//insert_node_mid_before(head, new_node, loc);
insert_node_mid_after(head,new_node,loc);
display_link(head);
printf("清空\n");
empty_link(head);
display_link(head);
printf("释放内存\n");
release_link(&head);
display_link(head);
return 0;
}