欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-06 23:49:02
...

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
}