代码实现链表的操作函数

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

typedef int DataType;

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

SListNode *NewSpace()
{
	SListNode *pNew = (SListNode *)malloc(sizeof(SListNode));
	assert(pNew);
	pNew->pNext = NULL;
	pNew->data = 0;
	return pNew;
}
	
//初始化  

void SListInit(SListNode **ppFirst)
{
		assert(ppFirst);
		(*ppFirst) = NULL;
		return;
}

//头插  
void PushFront(SListNode **ppFirst, DataType data)
{
		assert(*ppFirst);
		SListNode *pTmpNode = NewSpace();
		pTmpNode->data = data;
		pTmpNode->pNext = (*ppFirst);
		(*ppFirst) = pTmpNode;
}

//尾插  
void PushBack(SListNode **ppFirst, DataType data)
{
		assert(ppFirst);
		if ((*ppFirst) == NULL){
			(*ppFirst) = NewSpace();
			(*ppFirst)->pNext = NULL;
			(*ppFirst)->data = data;
			return;
		}

		SListNode *pTmpNode = (*ppFirst);
		while (pTmpNode->pNext != NULL){
			pTmpNode = pTmpNode->pNext;
		}
		pTmpNode->pNext = NewSpace();
		pTmpNode->pNext->pNext = NULL;
		pTmpNode->pNext->data = data;
}

//头删  
void PopFront(SListNode **ppFirst)
{
		if ((*ppFirst) == NULL){
			printf("ERROR\n");
			return;
		}
		SListNode *pTmpNode = (*ppFirst);
		(*ppFirst) = (*ppFirst)->pNext;
		free(pTmpNode);
		pTmpNode = NULL;
}

//尾删  
void PopBack(SListNode **ppFirst)
{
		if ((*ppFirst) == NULL){
			printf("ERROR\n");
			return;
		}
		SListNode *pTmpNode = (*ppFirst);
		while (pTmpNode->pNext->pNext != NULL){
			pTmpNode = pTmpNode->pNext;
		}
		free(pTmpNode->pNext);
		pTmpNode->pNext = NULL;
}

//按数据删  
void DeData(SListNode **ppFirst, DataType data)
{
		assert(*ppFirst);
		SListNode *pTmpNode = (*ppFirst);

		if (pTmpNode->data == data){               //判断是否为第一个结点的数据  
			(*ppFirst) = (*ppFirst)->pNext;
			free(pTmpNode);
			pTmpNode = NULL;
			return;
		}

		while (pTmpNode->pNext != NULL){
			if (pTmpNode->pNext->data == data){
				SListNode *pNode = pTmpNode->pNext;
				pTmpNode->pNext = pNode->pNext;
				free(pNode);
				pNode = NULL;
				return;
			}
			pTmpNode = pTmpNode->pNext;
		}
		if (pTmpNode->data == data){               //上条语句退出后还剩最后一个结点没有判断  
			free(pTmpNode);
			pTmpNode = NULL;
			return;
		}
		printf("Not Found!\n");
}

//按数据删除所有遇到的  
void DeDataAll(SListNode **ppFirst, DataType data)
{
		assert(*ppFirst);
		SListNode *pTmpNode = (*ppFirst);

		if ((*ppFirst)->data == data){
			pTmpNode = (*ppFirst);
			(*ppFirst) = (*ppFirst)->pNext;
			free(pTmpNode);
			pTmpNode = NULL;
		}

		while (pTmpNode->pNext != NULL){
			if (pTmpNode->pNext->data == data){
				SListNode *pNode = pTmpNode->pNext;
				pTmpNode->pNext = pNode->pNext;
				free(pNode);
				pNode = NULL;
				continue;
			}
			pTmpNode = pTmpNode->pNext;
		}

		if (pTmpNode->data == data){
			free(pTmpNode);
			pTmpNode = NULL;

		}
}

//按地址删  
void DePos(SListNode **ppFirst, SListNode *pPos)
{
		assert(ppFirst);
		assert(*ppFirst);

		SListNode *pTmpNode = (*ppFirst);
		if (pPos == (*ppFirst)){
			(*ppFirst) = (*ppFirst)->pNext;
			free(pTmpNode);
			pTmpNode = NULL;
			return;
		}
}

//前插 
void InsertFront(SListNode **ppFirst, SListNode *pPos, DataType data)
{
		assert(*ppFirst);
		assert(ppFirst);

		SListNode *pTmpNode = (*ppFirst);
		if ((*ppFirst) == pPos){
			pTmpNode = NewSpace();
			pTmpNode->data = data;
			pTmpNode->pNext = (*ppFirst);
			(*ppFirst) = pTmpNode;
			return;

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

		}
		SListNode *pNode = NewSpace();
		pNode->data = data;
		pNode->pNext = pTmpNode->pNext;
		pTmpNode->pNext = pNode;
}

// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL   
void FindPos(SListNode **ppFirst, DataType data)
{
		assert(*ppFirst);

		SListNode *pTmpNode = (*ppFirst);
		while (pTmpNode != NULL){
			if (pTmpNode->data == data){
				printf("按值查找,返回地址      %p\n\n", pTmpNode);
				return;

			}
			pTmpNode = pTmpNode->pNext;

		}
		printf("Not Found!\n");
}

//销毁  
void Destory(SListNode **ppFirst)
{
		assert(*ppFirst);

		SListNode *pTmpNode = (*ppFirst);
		while ((*ppFirst) != NULL){
			(*ppFirst) = (*ppFirst)->pNext;
			free(pTmpNode);
			pTmpNode = (*ppFirst);

		}
		pTmpNode = NULL;
}

//打印  
void Display(SListNode *ppFirst)
{
		assert(ppFirst);
		SListNode *pTmpNode = ppFirst;
		while (pTmpNode->pNext != NULL){
			printf("%d  ", pTmpNode->data);
			pTmpNode = pTmpNode->pNext;

		}
		printf("%d  \n\n", pTmpNode->data);
}

int main(void)
{
		SListNode *SL;
		SListInit(&SL);
		PushBack(&SL, 11);
		PushBack(&SL, 3);
		PushBack(&SL, 3);
		PushBack(&SL, 66);
		PushBack(&SL, 77);
		printf("尾插                    ");
		Display(SL);

		PushFront(&SL, 4);
		PushFront(&SL, 3);
		PushFront(&SL, 2);
		PushFront(&SL, 1);
		printf("头插                    ");
		Display(SL);

		PopFront(&SL);
		printf("头删                    ");
		Display(SL);

		PopBack(&SL);
		printf("尾删                    ");
		Display(SL);

		DeData(&SL, 4);
		printf("按数据删                ");
		Display(SL);

		DeDataAll(&SL, 3);
		printf("按数据删除所有遇到的    ");
		Display(SL);

		DePos(&SL, (SL->pNext));
		printf("按地址删                ");
		Display(SL);


		InsertFront(&SL, SL->pNext, 99);
		printf("按地址插入              ");
		Display(SL);

		FindPos(&SL, 2);

		printf("销毁			\n\n");
//		Destory(&SL);
//		Display(SL);

		system("pause");
		return 0;
}

猜你喜欢

转载自blog.csdn.net/ironman240/article/details/80726651