带头结点的单链表的插入,删除,转置,清空,判断空,统计节点数目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yp18792574062/article/details/75447478
//单链表  
//带头结点的单链表  
#include<stdio.h>  
#include<malloc.h>  
//单链表的结构体  
typedef struct _Node
{
	int data;
	struct _Node* next;
}Node, *LinkList;
void Init(LinkList* list)
{
	(*list) = (Node*)malloc(sizeof(Node));
	(*list)->next = NULL;
}
void InsertHeadList(LinkList list)
{
	int val;
	scanf("%d", &val);
	while (val != 0)
	{
		Node* node = (Node*)malloc(sizeof(Node));
		node->data = val;
		node->next = list->next;
		list->next = node;
		scanf("%d", &val);
	}
}
void PrintList(LinkList list)
{
	Node* r;
	r = list->next;
	while (r != NULL)
	{
		printf("%d ", r->data);
		r = r->next;
	}
	printf("\n");
}
void InsertTailList(LinkList list)
{
	int val;
	scanf("%d", &val);
	Node* s = list;
	while (s->next != NULL)
	{
		s = s->next;
	}
	while (val != 0)
	{
		Node* node = (Node*)malloc(sizeof(Node));
		node->data = val;
		node->next = NULL;
		s->next = node;
		s = node;
		scanf("%d", &val);
	}
}
void DeleteHeadList(LinkList list)
{
	if (list->next == NULL)
	{
		return;
	}
	Node* s = list->next;
	list->next = list->next->next;
	free(s);
}
void DeleteTailList(LinkList list)
{
	if (list->next == NULL)
	{
		return;
	}
	Node* r = list;
	while (r->next->next != NULL)
	{
		r = r->next;
	}
	Node* s = r->next;
	r->next = NULL;
	free(s);
}
void ClearList(LinkList list)
{
	while (list->next != NULL)
	{
		DeleteTailList(list);
	}
}
bool IsEmpty(LinkList list)
{
	if (list->next == NULL)
	{
		return true;
	}
	return false;
}
int nCountList(LinkList list)
{
	int num = 0;
	Node* r = list->next;
	while (r != NULL)
	{
		r = r->next;
		num++;
	}
	return num;
}
void ReverseList(LinkList list)
{
	//三指针法  
	//一个节点和空链表都是不需要逆转的  
	if (list->next == NULL || list->next->next == NULL)
	{
		return;
	}
	Node* pre;
	Node* mid;
	Node* last;
	pre = list->next;
	mid = pre->next;
	last = mid->next;
	pre->next = NULL;
	//如果有三个节点以上我们可以进入循环体进行操作  
	while (last != NULL)
	{
		//每次反转一个  
		mid->next = pre;
		//节点后移  
		pre = mid;
		mid = last;
		last = last->next;

	}
	mid->next = pre;
	list->next = mid;
}
int main(void)
{
	LinkList list;
	Init(&list);
	//单链表的插入  
	//头插  
	InsertHeadList(list);
	//尾插  
	InsertTailList(list);
	//统计节点数目  
	int nCount = nCountList(list);
	printf("nCount = %d\n", nCount);
	//单链表的删除  
	//头删  
	DeleteHeadList(list);
	//尾删  
	DeleteTailList(list);
	PrintList(list);
	//带头结点的单链表的逆序  
	ReverseList(list);
	PrintList(list);
	//清空  
	ClearList(list);
	//判断空  
	bool temp = IsEmpty(list);
	if (temp == true)
	{
		printf("空\n");
	}
	else
	{
		printf("不空\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yp18792574062/article/details/75447478