【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
}
上一篇: VS初始化命令 ASP.NET常用技巧
下一篇: 详解如何使用Java编写图形化的窗口