单链表的增删改查(反转一个单链表)

本文详细介绍了单链表的各种操作,包括初始化、销毁、插入、删除、查找、打印及反转等,提供了完整的代码实现,适合初学者理解单链表的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单链表的增删改查(反转一个单链表)

sList.h

#ifndef _SLIST_H_
#define _SLIST_H_

#define _CRT_SECURE_NO_WARNINGS

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

typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType _data;
	struct SListNode* _next;
}SListNode;

typedef struct SList
{
	SListNode* _head;
}SList;

void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
// 在pos的前面进行插入
void SListInsertBefore(SList* plist, SLTDataType x);
void SListEraseAfter(SListNode* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
void TestSList();
void SListReverse(SList* plist);

#endif	//_SLITS_H_

sList.c

#include "sList.h"

//将单链表置空
void SListInit(SList* plist) {
	asser(plist);
	plist->_head = NULL;
}

//将单链表销毁
void SListDestory(SList* plist) {
	assert(plist);
	SListNode* tmp;
	while (plist->_head) {
		tmp = plist->_head;
		plist->_head = plist->_head->_next;
		free(tmp);
	}
}

//单链表头插
void SListPushFront(SList* plist, SLTDataType x) {
	assert(plist);
	SListNode* cur = (SListNode*)malloc(1*sizeof(SListNode));
	cur->_data = x;
	cur->_next = plist->_head;
	plist->_head = cur;
}

//单链表头删
void SListPopFront(SList* plist) {
	assert(plist);
	SListNode* tmp;
	if (plist->_head) {
		tmp = plist->_head;
		plist->_head = plist->_head->_next;
		free(tmp);
	}
}

//在单链表中查找x,返回cur
SListNode* SListFind(SList* plist, SLTDataType x) {
	assert(plist);
	SListNode* cur;
	for (cur = plist->_head; cur; cur = cur->_next) {
		if (cur->_data == x) {
			return cur;
		}
	}
	return NULL;
}

// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x) {
	assert(pos);
	SListNode* cur = (SListNode*)malloc(1 * sizeof(SListNode));
	cur->_data = x;
	cur->_next = pos->_next;
	pos->_next = cur;
}

// 在pos的前面进行插入
void SListInsertBefore(SList* plist, SLTDataType x) {
	assert(plist);
	SListNode* cur;
	SListNode* newdata;
	if (plist->_head->_data == x) {
		SListPushFront(plist, x);
		return;
	}
	for (cur = plist->_head; cur->_next; cur = cur->_next) {
		if (cur->_next->_data == x) {
			break;
		}
	}
	newdata->_next = cur->_next;
	cur->_next = newdata;
}

//单链表后删操作
void SListEraseAfter(SListNode* pos) {
	assert(pos);
	SListNode* tmp;
	tmp = pos->_next;
	pos->_next = tmp->_next;
	free(tmp);
}

//单链表中删除x
void SListRemove(SList* plist, SLTDataType x) {
	assert(plist);
	int cur = SListFind(plist, x);
	if (cur) {
		SListEraseAfter(cur);
	}
}

//打印单链表
void SListPrint(SList* plist) {
	assert(plist);
	SListNode* cur;
	for (cur = plist->_head; cur; cur = cur->_next) {
		printf("%d->", cur->_data);
	}
	printf("NULL\n");
}

//翻转一个单链表
void SListReverse(SList* plist) {
	SListNode* tmp = plist->_head->_next;
	while (tmp) {
		plist->_head->_next = tmp->_next;
		tmp->_next = plist->_head;
		plist->_head = tmp;
		tmp = plist->_head->_next;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值