完整代码
#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 bcnode
{
int num;
struct bcnode *front;
struct bcnode *rear;
}BCnode, *BClink;
int is_malloc_ok(BClink node)
{
if (NULL == node)
{
return MALLOC_NO;
}
else
{
return MALLOC_OK;
}
}
//判断链表是否为空
int is_link_empty(BClink head)
{
if (head->front == head&&head->rear==head)
{
return EMPTY_OK;
}
else
{
return EMPTY_NO;
}
}
//创建结点
int create_node(BClink *new_node)
{
*new_node = (BClink)malloc(sizeof(BCnode));
if (MALLOC_OK != is_malloc_ok(*new_node))
{
return CREATE_NO;
}
else
{
return CREATE_OK;
}
}
//创建链表
int create_link(BClink *head)
{
int mark = create_node(head);
if (mark != CREATE_OK)
{
return CREATE_NO;
}
else
{
(*head)->front= *head;
(*head)->rear = *head;
return CREATE_OK;
}
}
//头插
void insert_node_head(BClink head, BClink new_node)
{
head->rear->front=new_node;
new_node->rear = head->rear;
new_node->front = head;
head->rear = new_node;
}
//尾插
void insert_node_tail(BClink head, BClink new_node)
{
BClink p = NULL;
p = head;
while (p->rear != head)
{
p = p->rear;
}
new_node->front=p;
p->rear = new_node;
new_node->rear = head;
head->front=new_node;
}
//前插
void insert_node_mid_before(BClink head, BClink new_node, int loc)
{
BClink p = NULL;
p = head->rear;
while (p != head && p->num != loc)
{
p = p->rear;
}
new_node->rear = p;
new_node->front=p->front;
p->front->rear=new_node;
p->front = new_node;
}
//后插
void insert_node_mid_after(BClink head, BClink new_node, int loc)
{
BClink p = NULL;
p = head->rear;
while (p->rear != head && p->num != loc)
{
p = p->rear;
}
new_node->front = p;
new_node->rear=p->rear;
p->rear->front-new_node;
p->rear = new_node;
}
//排序插(从小到大)
void insert_node_sort(BClink head, BClink new_node)
{
BClink p = NULL;
p = head->rear;
while (p != head && p->num < new_node->num)
{
p = p->rear;
}
new_node->rear=p;
new_node->front=p->front;
p->front->rear = new_node;
p->front=new_node;
}
//按值删除结点
void delete_node(BClink head)
{
int num;
printf("Please input a num you want to delete:\n");
scanf("%d", &num);
BClink p = NULL;
p = head->rear;
while (p != head && p->num != num)
{
p = p->rear;
}
if (head == p)
{
printf("No such node!\n");
}
else
{
p->front->rear=p->rear;
free(p);
p = NULL;
printf("The node was deleted!\n");
}
}
//长度
int length_link(BClink head)
{
int length = 0;
BClink p = NULL;
p = head;
while (p->rear != head)
{
p = p->rear;
length++;
}
return length;
}
//遍历
void display_link(BClink 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");
BClink p = NULL;
p = head->rear;
while (p != head)
{
printf("%4d", p->num);
p = p->rear;
}
}
printf("\n");
}
//清空(除头结点)
void empty_link(BClink head)
{
if (EMPTY_NO != is_link_empty(head))
{
return;
}
BClink p = NULL;
p = head->rear;
while (p != head)
{
p->rear->front=head;
head->rear = p->rear;
free(p);
p = head->rear;
}
}
//释放内存
void release_link(BClink *head)
{
empty_link(*head);
free(*head);
*head=NULL;
printf("The link is released!\n");
}
//翻转
void reverse_link(BClink head)
{
if (NULL==head)
{
printf("error!\n");
}
else if(EMPTY_NO != is_link_empty(head))
{
printf("empty link!\n");
}
else
{
BClink p=NULL;
p=head->front;
while(p!=head)
{
printf("%4d",p->num);
p=p->front;
}
}
}
//从小到大排序
void sort_link(BClink head)
{
if (EMPTY_OK == is_link_empty(head))
{
return;
}
BClink p = NULL;
p = head->rear;
if (head == p->rear)
{
return;
}
p=p->rear;
int i=0;
int j=0;
int tmp=0;
for(i=0;i<length_link(head)-1;i++)
{
for(j=0;j<length_link(head)-1-i;j++)
{
if(p->front->num > p->num)
{
tmp=p->num;
p->num=p->front->num;
p->front->num=tmp;
}
p=p->rear;
}
p=head->rear->rear;
}
}
int main()
{
BClink head = NULL;
int mark = create_link(&head);
while (mark != CREATE_OK)
{
mark = create_link(&head);
}
BClink 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;
}
结构体定义+主函数
#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 bcnode
{
int num;
struct bcnode *front;
struct bcnode *rear;
}BCnode, *BClink;
int main()
{
BClink head = NULL;
int mark = create_link(&head);
while (mark != CREATE_OK)
{
mark = create_link(&head);
}
BClink 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;
}
创建双向循环链表
//分配内存
int is_malloc_ok(BClink node)
{
if (NULL == node)
{
return MALLOC_NO;
}
else
{
return MALLOC_OK;
}
}
//判断链表是否为空
int is_link_empty(BClink head)
{
if (head->front == head&&head->rear==head)
{
return EMPTY_OK;
}
else
{
return EMPTY_NO;
}
}
//创建结点
int create_node(BClink *new_node)
{
*new_node = (BClink)malloc(sizeof(BCnode));
if (MALLOC_OK != is_malloc_ok(*new_node))
{
return CREATE_NO;
}
else
{
return CREATE_OK;
}
}
//创建链表
int create_link(BClink *head)
{
int mark = create_node(head);
if (mark != CREATE_OK)
{
return CREATE_NO;
}
else
{
(*head)->front= *head;
(*head)->rear = *head;
return CREATE_OK;
}
}
插入
//头插
void insert_node_head(BClink head, BClink new_node)
{
head->rear->front=new_node;
new_node->rear = head->rear;
new_node->front = head;
head->rear = new_node;
}
//尾插
void insert_node_tail(BClink head, BClink new_node)
{
BClink p = NULL;
p = head;
while (p->rear != head)
{
p = p->rear;
}
new_node->front=p;
p->rear = new_node;
new_node->rear = head;
head->front=new_node;
}
//前插
void insert_node_mid_before(BClink head, BClink new_node, int loc)
{
BClink p = NULL;
p = head->rear;
while (p != head && p->num != loc)
{
p = p->rear;
}
new_node->rear = p;
new_node->front=p->front;
p->front->rear=new_node;
p->front = new_node;
}
//后插
void insert_node_mid_after(BClink head, BClink new_node, int loc)
{
BClink p = NULL;
p = head->rear;
while (p->rear != head && p->num != loc)
{
p = p->rear;
}
new_node->front = p;
new_node->rear=p->rear;
p->rear->front-new_node;
p->rear = new_node;
}
//排序插(从小到大)
void insert_node_sort(BClink head, BClink new_node)
{
BClink p = NULL;
p = head->rear;
while (p != head && p->num < new_node->num)
{
p = p->rear;
}
new_node->rear=p;
new_node->front=p->front;
p->front->rear = new_node;
p->front=new_node;
}
删除(按值)
//按值删除结点
void delete_node(BClink head)
{
int num;
printf("Please input a num you want to delete:\n");
scanf("%d", &num);
BClink p = NULL;
p = head->rear;
while (p != head && p->num != num)
{
p = p->rear;
}
if (head == p)
{
printf("No such node!\n");
}
else
{
p->front->rear=p->rear;
free(p);
p = NULL;
printf("The node was deleted!\n");
}
}
长度
//长度
int length_link(BClink head)
{
int length = 0;
BClink p = NULL;
p = head;
while (p->rear != head)
{
p = p->rear;
length++;
}
return length;
}
遍历
//遍历
void display_link(BClink 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");
BClink p = NULL;
p = head->rear;
while (p != head)
{
printf("%4d", p->num);
p = p->rear;
}
}
printf("\n");
}
翻转
//翻转
void reverse_link(BClink head)
{
if (NULL==head)
{
printf("error!\n");
}
else if(EMPTY_NO != is_link_empty(head))
{
printf("empty link!\n");
}
else
{
BClink p=NULL;
p=head->front;
while(p!=head)
{
printf("%4d",p->num);
p=p->front;
}
}
}
排序
//从小到大排序
void sort_link(BClink head)
{
if (EMPTY_OK == is_link_empty(head))
{
return;
}
BClink p = NULL;
p = head->rear;
if (head == p->rear)
{
return;
}
p=p->rear;
int i=0;
int j=0;
int tmp=0;
for(i=0;i<length_link(head)-1;i++)
{
for(j=0;j<length_link(head)-1-i;j++)
{
if(p->front->num > p->num)
{
tmp=p->num;
p->num=p->front->num;
p->front->num=tmp;
}
p=p->rear;
}
p=head->rear->rear;
}
}
清空(除头节点)
//清空(除头结点)
void empty_link(BClink head)
{
if (EMPTY_NO != is_link_empty(head))
{
return;
}
BClink p = NULL;
p = head->rear;
while (p != head)
{
p->rear->front=head;
head->rear = p->rear;
free(p);
p = head->rear;
}
}
释放内存(all)
//释放内存
void release_link(BClink *head)
{
empty_link(*head);
free(*head);
*head=NULL;
printf("The link is released!\n");
}