单向单链表的实现

#pragma  once
// 值类型 
typedef int DataType;

typedef struct SListNode {
	DataType data; // 值 
	struct SListNode *pNext; // 指向下一个结点 
} SListNode;

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

// 初始化 
void SListInit(SListNode **ppFirst)
{
	assert(ppFirst != NULL);
	*ppFirst = NULL;
}
SListNode *NewspanceNode(int data)
{
	SListNode *pNewNode = (SListNode*)malloc(sizeof(SListNode));
	assert(pNewNode);
	pNewNode->data = data;
	pNewNode->pNext = NULL;
	return pNewNode;
}

// 尾部插入 
void SListPushBack(SListNode** ppFirst, DataType data)
{
	assert(ppFirst != NULL);
	SListNode  *pNode = NewspanceNode(data);//能否直接开辟空间
	if (*ppFirst == NULL)
	{
		*ppFirst = pNode;
		return;
	}
	SListNode *pNewNode;
	for (pNewNode = *ppFirst; pNewNode->pNext != NULL; pNewNode = pNewNode->pNext)
	{
	}
	pNewNode->pNext = pNode;
}

// 头部插入 
void SListPushFront(SListNode **ppFirst, DataType data)
{
	assert(ppFirst != NULL);
	
	SListNode *pNode = NewspanceNode(data);
	pNode->pNext = *ppFirst;
	*ppFirst = pNode;
}

// 尾部删除 
void SListPopBack(SListNode **ppFirst)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	if ((*ppFirst)->pNext == NULL)
	{
		free(*ppFirst);
		*ppFirst = NULL;
		return;
	}
	SListNode *pNode;
	for (pNode=*ppFirst; pNode->pNext->pNext != NULL; pNode = pNode->pNext)
	{

	}
	free(pNode->pNext);
	pNode->pNext = NULL;

}
// 头部删除 
void SListPopFront(SListNode **ppFirst)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	SListNode *pNode;
	pNode = *ppFirst;
	*ppFirst = (*ppFirst)->pNext;
	free(pNode);
}

// 给定结点插入,插入到结点前 
void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	SListNode *pNode = *ppFirst;
	if (*ppFirst == pPos)
	{
		SListPushFront(ppFirst,data);
		return;
	}
	SListNode *pNewNode = NewspanceNode(data);
	
	while (pNode->pNext != pPos)
	{
		pNode = pNode->pNext;
	}
	pNode->pNext = pNewNode;
	pNewNode->pNext = pPos;
}

// 给定结点删除 
void SListErase(SListNode **ppFirst, SListNode *pPos)
{
	assert(ppFirst!=NULL);
	assert(*ppFirst != NULL);
	SListNode  *pNode;
	pNode = *ppFirst;
	if (pPos == *ppFirst)
	{
		SListPopFront(ppFirst);
		return;
	}
	while (pNode->pNext != pPos)
	{
		pNode = pNode->pNext;
	}
	pNode->pNext = pPos->pNext;
	free(pPos);
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL 
int SListFind(SListNode *pFirst, DataType data)
{
	SListNode *pNode;
	for (pNode = pFirst; pNode; pNode = pNode->pNext)
	{
		if (pNode->data == data)
		{
			return pNode;
		}
	}
	return NULL;
}
// 按值删除,只删遇到的第一个 
void SListRemove(SListNode **ppFirst, DataType data)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	SListNode *pNode = SListFind(*ppFirst,data);
	if (pNode != NULL)
	{
		SListErase(ppFirst, pNode);
	}
}

// 按值删除,删除所有的 
void SListRemoveAll(SListNode **ppFirst, DataType data)
{
	assert(ppFirst != NULL);
	assert(*ppFirst != NULL);
	SListNode *pNode = *ppFirst;
	SListNode *pCur;
	while (pNode->pNext)
	{
		if (pNode->pNext->data == data)
		{
			pCur=pNode->pNext;
			pNode->pNext = pNode->pNext->pNext;//能否用结点删除
			free(pCur);
		}
		else{
			pNode = pNode->pNext;
		}
	
	}
	if ((*ppFirst)->data == data)
	{
		SListPopFront(ppFirst);
	}
}
// 销毁 
void SListDestroy(SListNode **ppFirst)
{
	assert(ppFirst!=NULL);
	SListNode *pNode, *pNext;
	pNode = *ppFirst;
	while (pNode != NULL)
	{
		pNext = pNode->pNext;
		free(pNode);
		pNode = pNext;
	}
	*ppFirst = NULL;
}
void print(SListNode *pFirst)
{
	SListNode *pNode;
	for (pNode = pFirst; pNode; pNode = pNode->pNext)
	{
		printf("%d -> ", pNode->data);
	}
	printf("NULL\n");
}

void test()
{
	SListNode *pFirst;
	SListInit(&pFirst);
	assert(pFirst == NULL);
	SListPushFront(&pFirst, 1);
	SListPushFront(&pFirst, 2);
	SListPushFront(&pFirst, 3);
	print(pFirst);
	SListPushBack(&pFirst, 4);
	SListPushFront(&pFirst, 3);
	print(pFirst);
	SListPopFront(&pFirst);
	print(pFirst);
	SListPopBack(&pFirst);
	print(pFirst);
	SListInsert(&pFirst,pFirst->pNext->pNext, 10);
	print(pFirst);
	SListInsert(&pFirst, pFirst, 12);
	print(pFirst);
	SListErase(&pFirst, pFirst);
	print(pFirst);
	SListRemove(&pFirst, 1);
	print(pFirst);
	SListPushFront(&pFirst, 3);
	SListPushFront(&pFirst, 3);
	SListPushBack(&pFirst, 3);
	SListPushBack(&pFirst, 3);
	print(pFirst);
	SListRemoveAll(&pFirst, 3);
	print(pFirst);
	SListDestroy(&pFirst);
}

#include"slist.h"
#include"Interview.h"
int main()

{
	//TestMergeOrderedList();
	//test3();
	//test2();
	//test1();
	test();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CDatreides/article/details/80860466