【C语言】单向链表的简单实现

1、实现的主要函数:

/*
	初始化链表:
		参数:int _value(第一个节点的值)
		返回值:list(链表的头节点)
*/
list listInit(int _value);
/*
	遍历链表
		参数:list _list(链表名字)
		返回值:无
*/
void listPrintAll(list _list);
/*
	添加节点到结尾
		参数:list *_listPtr(需要添加节点的链表的指针)int _value(需要添加的值)
*/
void listAppend(list *_listPtr, int _value);
/*
	删除指定位置的节点
	参数:list *_listPtr(需要删除节点的链表的指针)int _location(需要删除的位置)
*/
int listRemove(list *_listPtr, int _location);

2、源代码:

// main.c.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/*
	节点结构体:
		该节点的值:int value
		指向下一节点的指针:node *nextPtr
*/
typedef struct node
{
	int value = 0;
	node *nextPtr = NULL;
}node;

/*
	头节点结构体
		指向下一节点的指针:node *nextPtr
*/
typedef struct list
{
	node * nextPtr = NULL;
}list;
/*
	初始化链表:
		参数:int _value(第一个节点的值)
		返回值:list(链表的头节点)
*/
list listInit(int _value)
{
	list head;//头节点
	node *firstNode = (node*)malloc(sizeof(node));//第一个节点
	firstNode->value = _value;//第一个节点赋值
	firstNode->nextPtr = NULL;//第一个节点指针
	head.nextPtr = firstNode;//头节点指向第一个节点
	return head;//返回头节点
}
/*
	遍历链表
		参数:list _list(链表名字)
		返回值:无
*/
void listPrintAll(list _list)
{
	printf("{\n");
	node *nNodePtr = _list.nextPtr;//得到第一个节点
	int count = 0;
	for (nNodePtr; nNodePtr->nextPtr != NULL; nNodePtr = nNodePtr->nextPtr)//遍历所有节点
	{
		printf("\t%d:%d\n", count, nNodePtr->value);
		count++;
	}
	printf("\t%d:%d\n", count, nNodePtr->value);//最后一个节点的nextPtr = NULL,所以不能再for循环中打印
	printf("}\n");
}
/*
	添加节点到结尾
		参数:list *_listPtr(需要添加节点的链表的指针)int _value(需要添加的值)
*/
void listAppend(list *_listPtr, int _value)
{
	node *nNodePtr = _listPtr->nextPtr;//得到头节点
	node *lastNodePrt = (node*)malloc(sizeof(node));//创建新节点
	for (nNodePtr; nNodePtr->nextPtr != NULL; nNodePtr = nNodePtr->nextPtr);//得到尾节点
	lastNodePrt->nextPtr = NULL;
	lastNodePrt->value = _value;
	nNodePtr->nextPtr = lastNodePrt;//将新节点连接到尾节点
}
/*
	删除指定位置的节点
	参数:list *_listPtr(需要删除节点的链表的指针)int _location(需要删除的位置)
*/
int listRemove(list *_listPtr, int _location)
{
	node *nNodePtr = _listPtr->nextPtr;//得到第一个节点
	int count = 0;
	node *tempNodePtr = (node*)malloc(sizeof(node));//创建一个临时节点
	if (_location == 0)//当location == 0时
	{
		tempNodePtr->nextPtr = nNodePtr->nextPtr;//保存第二个节点
		_listPtr->nextPtr = tempNodePtr->nextPtr;//头节点指向第二个节点
		free(nNodePtr);//释放第一个节点
		free(tempNodePtr);//释放临时节点
		return 0;
	}
	for (nNodePtr; nNodePtr->nextPtr != NULL; nNodePtr = nNodePtr->nextPtr)//当location > 0时
	{
		if (count == _location-1)
		{
			if (nNodePtr->nextPtr == NULL)//若location大于最大下标,返回-1
			{
				return -1;
			}
			tempNodePtr->nextPtr = nNodePtr->nextPtr;//将要删除的节点
			nNodePtr->nextPtr = nNodePtr->nextPtr->nextPtr;//跳过要删除的节点
			free(tempNodePtr->nextPtr);//释放要删除的节点
			free(tempNodePtr);//释放临时的节点
			return 0;
		}
		count++;
	}
}
/*
	主函数
		参数:无
		返回值:0
*/
int main()
{
	list myList = listInit(250);//初始化节点
	listAppend(&myList, 249);//添加第二个节点
	listAppend(&myList, 248);//添加第三个节点
	listAppend(&myList, 247);//添加第四个节点
	listPrintAll(myList);//打印所有节点
	listRemove(&myList, 2);//移除第三个节点
	listPrintAll(myList);//打印所有节点
	getc(stdin);
	return(0);
}

3、结果

{
        0:250
        1:249
        2:248
        3:247
}
{
        0:250
        1:249
        2:247
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值