单链表的基本操作

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

typedef int DataType;
typedef struct ListNode
{
	struct ListNode* pNext;//指向链表中下一个结点
	 DataType data;//当前结点所保存的元素
}Node,*PNode;

//生成一个新结点
PNode BuySListNode(DataType data);

//打印链表
void PrintSList(PNode PHead);

// 链表的初始化 
void SListInit(PNode* pHead); 

// 尾插 
void SListPushBack(PNode* pHead, DataType data); 

// 尾删 
void SListPopBack(PNode* pHead); 

// 头插 
void SListPushFront(PNode* pHead, DataType data); 

// 头删 
void SListPopFront(PNode* pHead); 

// 在链表中查找值为data的元素,找到后返回值为data的结点 
PNode SListFind(PNode pHead, DataType data); 

// 在pos位置插入值为data的结点 
void SListInsert(PNode* pHead, PNode pos, DataType data); 

// 删除pos位置额结点 
void SListErase(PNode* pHead, PNode pos); 

// 获取链表中值data的结点 
int SListSize(PNode pHead,DataType data); 

// 判断链表是否为空 
int SListEmpty(PNode pHead); 

// 销毁聊表 
void SListDestroy(PNode* pHead); 

///////////////////////////////
void testInitAndPushBack();
void testPopBackAndPushFront();
void testFindAndInsert();
void testEraseAndSize();

SList.c
#include "SList.h"

void PrintSList(PNode pHead)
{
	PNode pCur=pHead;
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return ;
	}
	while(pCur)
	{
		printf("%d->",pCur->data);
		pCur=pCur->pNext ;
	}
	printf("NULL\n");
}

void SListInit(PNode* pHead)
{
	assert(pHead);
	*pHead=NULL;
}

PNode BuySListNode(DataType data)
{
	PNode pNewNode=(PNode)malloc(sizeof(Node));	
	if(pNewNode==NULL)
	{
		assert(0);
		return NULL;
	}

	pNewNode->data =data;
	pNewNode->pNext =NULL;

	return pNewNode;
}

void SListPushBack(PNode* pHead, DataType data)
{
	PNode pCur=*pHead;

	assert(pHead);
	//链表为空
	if(*pHead==NULL)
	{
		*pHead=BuySListNode(data);
	}
	//链表中有结点
	else 
	{
		while(pCur->pNext)
		{
			pCur=pCur->pNext;
		}
		pCur->pNext =BuySListNode(data);
	}
}

void SListPopBack(PNode* pHead)
{
	PNode pCur=*pHead;
	PNode pre=NULL;
	assert(pHead);//检验链表是否存在
	//链表为空
	if(pHead==NULL)
	{
		return;
	}
	//链表中只有一个结点
	else if((*pHead)->pNext==NULL)
	{
		free(*pHead);
		*pHead=NULL;
	}
	//链表中含有多个结点
	else
	{
		while(pCur->pNext)
		{
			pre=pCur;
			pCur=pCur->pNext;
		}
		free(pCur);
		pre->pNext =NULL;
	}
}


void SListPushFront(PNode* pHead, DataType data)
{
	PNode pNewNode=BuySListNode(data);
	assert(pHead);

	pNewNode->pNext =(*pHead);
	*pHead=pNewNode;
}

void SListPopFront(PNode* pHead)
{
	PNode pDelNode=*pHead;
	assert(pHead);
	if(*pHead==NULL)
	{
		printf("链表为空\n");
		return;
	}
	else
	{
		*pHead=(*pHead)->pNext ;
		free(pDelNode);
		pDelNode=NULL;
	}
}

PNode SListFind(PNode pHead, DataType data)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return NULL;
	}
	while(pHead)
	{
		if(pHead->data ==data)
		{
			return pHead;
		}
		pHead=pHead->pNext ;
	}
	return NULL;
}

void SListInsert(PNode* pHead, PNode pos, DataType data)
{
	PNode pNewNode=NULL;
	assert(pHead);
	if(*pHead==NULL || pos==NULL)
	{
		SListPushBack(pHead,data);
	}
	else
	{
		PNode pCur=NULL;
		PNode pNewNode=NULL;
		int tmp;

		pNewNode =BuySListNode(data);
		pNewNode->pNext =pos->pNext ;
		pos->pNext =pNewNode;

		tmp=pos->data ;
		pos->data =pNewNode->data ;
		pNewNode->data=tmp;
	}
}

void SListErase(PNode* pHead, PNode pos)
{
	PNode del=NULL;
	PNode pre=NULL;
	assert(pHead);
	if(*pHead==NULL || pos==NULL)
	{
		return;
	}

	del=*pHead;
	while(del && del!=pos)
	{
		pre=del;
		del=del->pNext ;
	}
	if(del->pNext !=NULL)
	{
		pre->pNext=del->pNext ;
		free(del);
		del=NULL;
	}
	else
	{
		free(del);
		pre->pNext =NULL;
	}
}

int SListSize(PNode pHead,DataType data)
{
	int count=0;
	if(pHead==NULL)
	{
		printf("链表为空\n");
		return 0;
	}
	while(pHead)
	{
		if(pHead->data ==data)
		{
			count++;
		}
		pHead=pHead->pNext  ;
	}
	return count;
}

int SListEmpty(PNode pHead)
{
	if(pHead==NULL)
	{
		return 0;
	}
	else
	{
		return 1;//不为空
	}
}

void SListDestroy(PNode* pHead)
{
	PNode cur;
	PNode next;
	assert(pHead);
	if(*pHead==NULL)
	{
		return;
	}
	cur=*pHead;
	while(cur)
	{
		next=cur->pNext ;
		free(cur);
		cur=next;
	}
	*pHead=NULL;
}
/////////////////////////////////////////
//测试
void testPushBackAndPopBack()
{
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,2);
	SListPushBack(&pHead,3);
	PrintSList(pHead);
	SListPopBack(&pHead);
	PrintSList(pHead);
	SListDestroy(&pHead);
}

void testPushFrontAndPopFront()
{	
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,2);
	SListPushBack(&pHead,3);
	PrintSList(pHead);
	SListPushFront(&pHead,5);
	PrintSList(pHead);	
	SListPopFront(&pHead);
	PrintSList(pHead);	
	SListDestroy(&pHead);
}

void testFindAndInsert()
{
	PNode pHead,pCur;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,5);
	SListPushBack(&pHead,7);
	PrintSList(pHead);
	pCur=SListFind(pHead,7);
	SListInsert(&pHead,pCur,9);
	PrintSList(pHead);
	SListDestroy(&pHead);
}

void testEraseAndSize()
{
	int ret=0;
	PNode pHead;
	SListInit(&pHead);
	SListPushBack(&pHead,1);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,5);
	SListPushBack(&pHead,3);
	SListPushBack(&pHead,4);
	SListPushBack(&pHead,9);
	SListPushBack(&pHead,3);

	PrintSList(pHead);
	/*pCur=SListFind(pHead,3);
	SListErase(&pHead,pCur);
	PrintSList(pHead);*/
	ret=SListSize(pHead,3);
	printf("count=%d\n",ret);
	SListDestroy(&pHead);
}

test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

int main() 
{
	//testPushBackAndPopBack();
	//testPushFrontAndPopFront();
	//testFindAndInsert();
	testEraseAndSize();
	return 0; 
}

阅读更多
上一篇动态顺序表的基本操作
下一篇链表的面试题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭