C语言单向链表实现

LinkList.h

#pragma once
typedef int SDataType;
//链表节点	
typedef struct SListNode {
	SDataType _data;
	struct SListNode* _PNext;
}Node,*PNode;

typedef struct SList { //封装链表结构,类似于头节点
	PNode _pHead;//指向链表的第一个节点
} Slist;



void SListInit(SList *s);//初始化链表

void SListPushBack(SList* s, SDataType data);//在链表表尾部插入数据

void SListPopBack(SList* s);//删除链表最后一个节点

void SListPushFront(SList* s, SDataType data);//链表首部插入数据

void SListPopFront(SList* s);//删除链表第一个节点

void SListInsert(PNode pos, SDataType data);//在链表pos位置后插入数据

void SListErase(SList* s, PNode pos);//删除链表s中pos位置的节点

PNode SListFind(SList* s, SDataType data);//在链表s中查找数据data,查询成功返回指针,失败返回NULL

void SListRemove(SList* s, SDataType data);//移除链表中第一个值为data的元素

int SListSize(SList* s);//获取链表s的长度

int SListEmpty(SList* s);//检测链表是否为空

void SListClear(SList* s);//将链表中有效节点清空

void SListDestroy(SList* s);//销毁链表

void SListPrint(SList* s);//打印链表

 

LinkList.cpp

// LinkList.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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


PNode BuySListNode(SDataType data) {
	Node* pNode = (Node*)malloc(sizeof(Node));
	pNode->_data = data;
	pNode->_PNext = NULL;
	return pNode;
}

void SListInit(SList* s) {
	//初始化链表
	assert(s);
	s->_pHead=BuySListNode(NULL);
}

void SListPushBack(SList* s, SDataType data) {
	//在链表表尾部插入数据
	//创建节点
		PNode pNewNode = BuySListNode(data);
		PNode pCur = s->_pHead;
		while (pCur->_PNext)
		{
			pCur = pCur->_PNext;
		}
		//最后一个节点指向新节点
		pCur->_PNext = pNewNode;
	
}

void SListPopBack(SList* s){
	//删除链表最后一个节点
	PNode pPre = s->_pHead;
	PNode pCur=pPre->_PNext;
	while (pCur->_PNext)
	{
		pPre = pCur;
		pCur = pCur->_PNext;
	}
	free(pCur);
	pPre->_PNext = NULL;
}

void SListPushFront(SList* s, SDataType data) {
	//链表首部插入数据
	PNode pNewNode = BuySListNode(data);
	pNewNode->_PNext = s->_pHead->_PNext;
	s->_pHead->_PNext = pNewNode;
}
void SListPopFront(SList* s){
	//删除链表第一个节点
	PNode pHead = s->_pHead;
	if (pHead) {//如果存在首节点
		PNode pFir = pHead->_PNext;
		PNode pSec = pFir->_PNext;
		pHead->_PNext = pSec;
		free(pFir);
	}
}void SListInsert(PNode pos, SDataType data) {
	//在链表pos位置后插入数据
	if (!pos) {
		return;
	}
	PNode pNew = BuySListNode(data);
	pNew->_PNext = pos->_PNext;
	pos->_PNext = pNew;
}

void SListErase(SList* s, PNode pos) {
	//删除链表s中pos位置的节点
	PNode pPre = s->_pHead;
	PNode pCur = pPre->_PNext;
	while (pCur&&pos!=pCur)
	{
		pPre = pCur;
		pCur = pCur->_PNext;
	}
	if (pCur) {
		pPre->_PNext = pCur->_PNext;
		free(pCur);
		pos = NULL;
	}

}

PNode SListFind(SList* s, SDataType data) {
	//在链表s中查找数据data,查询成功返回指针,失败返回NULL
	PNode pPre = s->_pHead;
	PNode pCur = pPre->_PNext;
	while (pCur&&pCur->_data!=data)
	{
		pPre = pCur;
		pCur = pCur->_PNext;
	}
	if (pCur) {
		return pPre->_PNext;
	}
	return NULL;
}

void SListRemove(SList* s, SDataType data) {
	//移除链表中第一个值为data的元素
	PNode pPre = s->_pHead;
	PNode pCur = pPre->_PNext;
	while (pCur && pCur->_data != data)
	{
		pPre = pCur;
		pCur = pCur->_PNext;
	}
	if (pCur) {
		pPre->_PNext = pCur->_PNext;
		free(pCur);
	}
}

int SListSize(SList* s) {
	//获取链表s的长度
	int count = 0;
	PNode pCur = s->_pHead;
	while (pCur->_PNext)
	{
		++count;
		pCur = pCur->_PNext;
	}
	return count;
}int SListEmpty(SList* s) {
	//检测链表是否为空
	return s->_pHead->_PNext == NULL ? 1 : 0;
}
void SListClear(SList* s) {
	//将链表中有效节点清空
	while (!SListEmpty(s))
	{
		SListPopFront(s);
	}
}

void SListDestroy(SList* s) {//销毁链表
	SListClear(s);
	free(s->_pHead);
}
void SListPrint(SList* s) {//打印链表
	PNode pCur = s->_pHead;
	while (pCur->_PNext)
	{
		pCur = pCur->_PNext;
		printf("%d\t",pCur->_data);
	}
	printf("\n");
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值