带表头循环单链表——增删改查

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

posted on 2022-02-18 23:36  慧茗子  阅读(24)  评论(0)    收藏  举报  来源