带表头双向循环链表——增删改查

完整代码

#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");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值