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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yp18792574062/article/details/75446924
//不带头结点的单链表
#include<stdio.h>
#include<malloc.h>
//链表结构体
typedef struct _Node
{
	int val;
	struct _Node* next;
}Node,*LinkList;
void InitList(LinkList* list)
{
	*list = NULL;
}
void InsertHeadList(LinkList* list)
{
	int data;
	scanf("%d", &data);
	while (data != 0)
	{
		Node* node = (Node*)malloc(sizeof(Node));
		node->val = data;
		if (*list == NULL)
		{
			*list = node;
			(*list)->next = NULL;
		}
		else
		{
			node->next = *list;
			*list = node;
		}
		scanf("%d", &data);
	}
}
void Print(LinkList list)
{
	Node* s = list;
	while (s != NULL)
	{
		printf("%d ", s->val);
		s = s->next;
	}
	printf("\n");
}
void InsertTailList(LinkList* list)
{
	int data;
	scanf("%d", &data);
	while (data != 0)
	{
		Node* node = (Node*)malloc(sizeof(Node));
		node->val = data;
		node->next = NULL;
		if (*list == NULL)
		{
			*list = node;
		}
		else
		{
			Node* s = *list;
			while (s->next != NULL)
			{
				s = s->next;
			}
			s->next = node;
		}
		scanf("%d", &data);
	}
}
void DeleteHeadList(LinkList* list)
{
	if (*list == NULL)
	{
		return;
	}
	Node* s = *list;
	*list = (*list)->next;
	free(s);
}
void DeleteTailList(LinkList* list)
{
	if (*list == NULL)
	{
		return;
	}
	Node* s = *list;
	if (s->next == NULL)
	{
		DeleteHeadList(list);
	}
	while (s->next->next != NULL)
	{
		s = s->next;
	}
	Node* r = s->next;
	s->next = s->next->next;
	free(r);
}
int Count(LinkList list)
{
	Node* s = list;
	int count = 0;
	while (s != NULL)
	{
		s = s->next;
		count++;
	}
	return count;
}
bool IsEmpty(LinkList list)
{
	if (list != NULL)
	{
		return false;
	}
	return true;
}
void Clear(LinkList* list)
{
	while (*list != NULL)
	{
		DeleteHeadList(list);
	}
}
void Reverse(LinkList* list)
{
	if (*list == NULL || (*list)->next == NULL)
	{
		return;
	}
	//三节点法
	Node* first;
	Node* second;
	Node* last;
	first = *list;
	second = (*list)->next;
	last = second->next;
	first->next = NULL;
	//如果有三个节点以上开始转置
	while (last != NULL)
	{
		//连接
		second->next = first;
		//后移
		first = second;
		second = last;
		last = last->next;
	}
	second->next = first;
	*list = second;


}
int main(void)
{
	LinkList list;
	//初始化
	InitList(&list);
	//插入
	//头插
	//InsertHeadList(&list);
	//尾插
	InsertTailList(&list);
	//统计节点个数
	int ncount = Count(list);
	printf("ncount=%d\n", ncount);
	//单链表原地转置
	Reverse(&list);
	//打印
	Print(list);
	//删除
	//头删
	DeleteHeadList(&list);
	//尾删
	DeleteTailList(&list);
	Print(list);
	//判断是否为空
	bool temp = IsEmpty(list);
	if (temp)
	{
		printf("空\n");
	}
	else
	{
		printf("不是空\n");
	}
	//清空
	Clear(&list);
	temp = IsEmpty(list);
	if (temp)
	{
		printf("空\n");
	}
	else
	{
		printf("不是空\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yp18792574062/article/details/75446924
今日推荐