带头结点的单链表的各种操作

#include <stdlib.h>
#include <stdio.h>
#include <string.h>  //这是常规的三个头文件
#pragma warning(disable:4996)  //这是为了避免vs报错。
//带头节点的单链表
struct LinkedNode {    //定义结构体用以表示链表的结点
	int data;
	struct LinkedNode* next;
};
//基本操作
//创建链表
struct LinkedNode* Init_LinkList();
//遍历
void foreach_LinkList(struct LinkedNode* header);
//插入:在给定某个值之前插入,如果给定值在链表中没有,那么插入链表尾
void insert_LinkList(struct LinkedNode* header, int oldVal, int newVal);
//删除一个结点
void deleteNode_LinkList(struct LinkedNode* header, int delVal);
//销毁
void destroy_LinkList(struct LinkedNode* header);
//清空 
void clear_LinkList(struct LinkedNode* header);
//逆序  A-B-C-D  --->  D-C-B-A
void reverse_LinkList(struct LinkedNode* header);

//基本操作
//创建链表,尾插法。
struct LinkedNode* Init_LinkList()
{
	//创建头结点
	struct LinkedNode* header = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
	header->data = -1;
	header->next = NULL;
	struct LinkedNode* pCurrent = header;
	int val = -1;
	while (true)
	{
		printf("input node data:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;//输入结束 
		}
		//创建一个新的节点,然后插入链表尾
		struct LinkedNode* newNode = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
		newNode->data = val;
		newNode->next = NULL;
		pCurrent->next = newNode;
		pCurrent = newNode;
	}
	return header;
}

//遍历
void foreach_LinkList(struct LinkedNode* header)
{
	if (NULL == header || NULL == header->next)
	{
		return;
	}
	struct LinkedNode* pCurrent = header->next;
	while (pCurrent != NULL)
	{
		printf("%d  ", pCurrent->data);
		pCurrent = pCurrent->next;
	}
	printf("\n");
}

//插入:在给定某个值之前插入,如果给定值在链表中没有,那么插入链表尾
void insert_LinkList(struct LinkedNode* header, int oldVal, int newVal)
{
	if (NULL == header)
	{
		return;
	}
	struct LinkedNode* pPrev = header;
	struct LinkedNode* pCurrent = header->next;
	struct LinkedNode* newNode = (struct LinkedNode*)malloc(sizeof(struct LinkedNode));
	newNode->data = newVal;
	newNode->next = NULL;
	while (pCurrent != NULL)
	{
		if (pCurrent->data == oldVal)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
	if (pCurrent == NULL)
	{
		pPrev->next = newNode;
	}
	newNode->next = pCurrent;
	pPrev->next = newNode;
	return;
}

//删除一个结点
void deleteNode_LinkList(struct LinkedNode* header, int delVal)
{
	if (NULL == header)
	{
		return;
	}
	struct LinkedNode* pPrev = header;
	struct LinkedNode* pCurrent = header->next;
	while (pCurrent != NULL)
	{
		if (pCurrent->data == delVal)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
	if (pCurrent == NULL)
	{
		return;
	}
	pPrev->next = pCurrent->next;
	free(pCurrent);
	pCurrent = NULL;
	return;
}

//销毁
void destroy_LinkList(struct LinkedNode* header)
{
	clear_LinkList(header);
	header->next = NULL;
	free(header);
	header = NULL;
	return;
}

//清空 
void clear_LinkList(struct LinkedNode* header)
{
	if (header == NULL)
	{
		return;
	}
	struct LinkedNode* pCurrent = header->next;
	while (pCurrent != NULL)
	{
		struct LinkedNode* pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;
	}
	header->next = NULL;
	return;
}

//逆序  A-B-C-D  --->  D-C-B-A
void reverse_LinkList(struct LinkedNode* header)
{
	if (NULL == header)
	{
		return;
	}
	struct LinkedNode* pPrev = header->next;
	struct LinkedNode* pCurrent = pPrev->next;
	struct LinkedNode* t = NULL;
	while (pCurrent)  //让链表里面的每相邻两元素改变指针。
	{
		t = pCurrent->next;
		pCurrent->next = pPrev;
		pPrev = pCurrent;
		pCurrent = t;
	}
	header->next->next = NULL;  //让第一个结点的NEXT域为NULL
	header->next = pPrev;     //新链表的第一个结点是pPrev,因为pPrev是该链表的最后一个结点
}
发布了27 篇原创文章 · 获赞 0 · 访问量 420

猜你喜欢

转载自blog.csdn.net/weixin_40007143/article/details/104045154
今日推荐