数据结构--链表的增删改查


关于链表的一些基本操作~


#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

typedef int DataType;
typedef struct SListNode
{
	DataType	data;
	struct SListNode *pNext;
}SListNode;

//初始化
void SListInit(SListNode  **ppFirst)
{
	assert(ppFirst!=NULL);
	*ppFirst = NULL;

}

//销毁
void SListDestroy(SListNode **ppFirst)
{
	assert(ppFirst!=NULL);
	SListNode   *pNode, *pNext;
	pNode = *ppFirst;
	while (pNode!=NULL)
	{
		pNext = pNode->pNext;
		free(pNode);
		pNode = pNext;
	}
	*ppFirst = NULL;
}

//申请空间
SListNode  *CreateNewNode(int data)
{
	SListNode *NewNode = (SListNode *)malloc(sizeof(SListNode));
	assert(NewNode);
	NewNode->data = data;
	NewNode->pNext = NULL;
	return NewNode;
}
//尾插
void PushBack(SListNode **ppFirst, DataType data)
{
	assert(ppFirst);
	//1.申请空间
	SListNode *pNewNode = CreateNewNode(data);
	//2.
	if (*ppFirst == NULL)
	{
		*ppFirst = pNewNode;
		return;
	}
	SListNode *pNode = *ppFirst;
	while (pNode->pNext!=NULL)
	{
		pNode = pNode->pNext;
	}
	pNode->pNext = pNewNode;

}

//头插
void PushFront(SListNode  **ppFirst, int data)
{
	assert(ppFirst);
	SListNode *pNewNode = CreateNewNode(data);
	pNewNode->pNext = *ppFirst;
	*ppFirst = pNewNode;
}
//头删
void PopFront(SListNode **ppFirst)
{
	assert(ppFirst);
	assert(*ppFirst);
	SListNode *poldFirst = *ppFirst;
	*ppFirst = (*ppFirst)->pNext;
	free(poldFirst);
}

//尾删
void PopBack(SListNode  **ppFirst)
{
	assert(ppFirst);
	assert(*ppFirst);
	while ((*ppFirst)->pNext == NULL)
	{
		free(*ppFirst);
		*ppFirst = NULL;
		return;
	}
	SListNode *pNode=*ppFirst;
	while (pNode->pNext->pNext != NULL)
	{
		pNode = pNode->pNext;
	}
	free (pNode->pNext);
	pNode->pNext = NULL;
}
//查找
SListNode *Find(SListNode  *pFirst, int data)
{
	SListNode *pNode;
	for (pNode = pFirst; pNode; pNode=pNode->pNext)
	{
		if (pNode->data == data)
		{
			return pNode;
		}
	}
	return NULL;
}
//按节点插入
void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
	assert(ppFirst);
	SListNode *pNode = *ppFirst;
	if ( pPos==*ppFirst)
	{
		PushFront(ppFirst, data);
		return;
	}

	while (pNode->pNext != pPos)
	{
		pNode = pNode->pNext;
	}

	SListNode *pNewNode = CreateNewNode(data);
	pNode->pNext = pNewNode;
	pNewNode->pNext = pPos;
}
//按节点删除
void Erase(SListNode **ppFirst,SListNode *pPos)
{
	assert(ppFirst);
	assert(*ppFirst);
	//SListNode *pNode = *ppFirst;
	if (pPos == *ppFirst)
	{
		PopFront(ppFirst);
		return;
	}
	SListNode *pCur;
	for (pCur = *ppFirst; pCur != pPos; pCur = pCur->pNext)
	{
	}
	pCur->pNext = pPos->pNext;
	free(pPos);
}
//删除第一次遇见的
void Remove(SListNode **ppFirst, DataType data)
{
	SListNode *pFound = Find(*ppFirst, data);
	if (pFound != NULL) {
		Erase(ppFirst, pFound);
	}
}
//删除所有出现的
void RemoveAll(SListNode **ppFirst, DataType data)
{
	SListNode *pNode = *ppFirst;
	SListNode *pNext;

	while (pNode->pNext) {
		if (pNode->pNext->data == data) {
			pNext = pNode->pNext;
			pNode->pNext = pNode->pNext->pNext;
			free(pNext);
		}
		else {
			pNode = pNode->pNext;
		}
	}

	if ((*ppFirst)->data == data) {
		PopFront(ppFirst);
	}
}
//打印
void print(SListNode  *pFirst)
{
	SListNode *pNode;
	for (pNode = pFirst; pNode; pNode=pNode->pNext)
	{
		printf("%d-> ", pNode->data);
	}
	printf("NULL\n");
}
void SList()
{
	SListNode *pFirst;
	

	//初始化
	SListInit(&pFirst);
	//尾插
	PushBack(&pFirst, 1);
	PushBack(&pFirst, 2);
	PushBack(&pFirst, 3);
	PushBack(&pFirst, 6);
	print(pFirst);
	//头插
	PushFront(&pFirst, 3);
	PushFront(&pFirst, 14);
	PushFront(&pFirst, 3);
	print(pFirst);
	//头删
	PopFront(&pFirst);
	print(pFirst);
	//尾删
	PopBack(&pFirst);
	print(pFirst);
	//查找
	SListNode *pFound = Find(pFirst, 3);
	if (pFound == NULL)
	{
		printf("没找到!");

	}
	else
	{
		printf("%d\n ", pFound->data);
		Insert(&pFirst, pFound, 16);
		Erase(&pFirst, pFound);
	}
	print(pFirst);
	//根据数据删除
	//Remove(&pFirst, 3);
	RemoveAll(&pFirst, 3);
	print(pFirst);

	//销毁
	SListDestroy(&pFirst);

}

猜你喜欢

转载自blog.csdn.net/z_juan1/article/details/80729933