ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言单向链表生成

2022-04-04 16:02:01  阅读:175  来源: 互联网

标签:Node 结点 List 单向 C语言 链表 pnode 指针


我是通过bilibili 学习的链表知识,视频的地址如下:
https://www.bilibili.com/video/BV1BE411h7kG

  • 链表的作用
    我们平常使用存储数据都是使用的数组居多,那么为啥还要用链表呢?
    使用数组的时候,我们往往需要对需要存储的数据的大小进行评估,否则容易造成空间的浪费,显得比较麻烦。而链表则
    完全不需要考虑这个问题,我们可以存储任意大小的数据而不需要对它进行预估。
    参考博文:
    https://blog.csdn.net/kevin_yzlong/article/details/65628753

  • 链表的组成

    如上图所示,链表里面存放的是头结点的指针,尾结点的指针,以及结点的个数。那么,结点又是什么呢?

  • 结点
    结点包含着我们要存储的数据,并且包含着指向下一个结点的指针

    如上图所示,结点是一个接着一个的,有点类似于数组,但是不同的是他们之间的地址并不是连续的。结点分为两部分组成:
    一个是我们要存储的数据,一个是指向下一个结点的指针。
    图片来源:https://www.jianshu.com/p/73d56c3d228c

  • 生成链表的思路

  1. 首先,声明要存储的数据类型,一般可以采用结构体产生。
点击查看代码
typedef struct DATA 
{
	int x;
	int y;
	
}Data;
  1. 其次,声明结点和链表
点击查看代码
//结点
typedef struct NODE
{
	Data data;
	struct NODE *pnext;
}Node;


//链表
typedef struct LIST
{
	Node* pfront; /* 第一个结点指针*/
	Node* prear;  /* 最后一个结点指针*/
	int count;	  /* 结点的个数*/
}List;
  1. 生成链表
    生成链表的过程用到了一个二级指针,通过二级指针为链表开辟空间
    开辟成功后对之进行初始化
    int ListInit(List** pplist)
    使用ListInit函数对链表进行初始化。

4.对链表进行操作
包括添加结点、遍历、显示等。

  • 注意
    在视频的讲解中并没有涉及到内存的释放,但是有malloc的地方必然会有free。
    那么如何释放呢?这个问题困扰了我一天,开始没有意识到链表的释放有它的流程,因此,浪费了很多时间。
    我当时的疑问在于:对Node *pnode申请了空间但是并没有对应释放,这样会造成内存泄露。
    查了资料以后我认为是这样:假如一个指针p,一个指针q都指向一个空间,那么平常所谓的free就是free掉这片空间,
    因此,free(p)或者free(q)都是可行的。在这里,Node *pnode 指向的是结点空间,链表中包含了指向结点空间的指针,
    因此在链表中释放掉这部分空间就可以了。
for (int i = 0; i < 6; i++)
 	{
 		Node *pnode = (Node *)calloc(1, sizeof(Node));	/*制造结点*/
 		pnode->data.x = rand() % 10;
 		pnode->data.y = rand() % 10;
 		pnode->pnext = NULL;	/*结点不指向下一个结点*/
 		InserList(pList, pnode);/*将产生的结点插入到列表中*/
 		
 }

那么,如何释放结点空间呢?
链表结点空间的释放,需要引入一个中间指针变量,利用这个变量来存储每个结点的指针(“顺藤摸瓜”过程中每个结点的指针)
释放的时候将这个中间指针释放掉即可。

点击查看代码
void FreeList(Node *pnode) {

	//************************************
	// Method:    FreeList
	// FullName:  FreeList
	// Access:    public 
	// Returns:   void
	// Qualifier: 用以释放列表中各个结点所占据的内存
	// Parameter: List * plist	指向列表的指针
	//************************************

	Node *pfreenode;
	
	while (pnode != NULL)
	{
		
		pfreenode = pnode;
		pnode = pnode->pnext;
		free(pfreenode);
	}


}

还有一点需要注意的是,在初始化过程中用到二级指针为输入的指针变量申请空间,也是需要释放的。
由于这个空间是列表变量(List *pList)需要一直使用,因此,在主函数的后面将之释放掉。

最后
这是我第一次写博文,也是刚刚学习到链表的知识,可能在理解上以及讲述上有问题,希望和大家一起交流,共同进步!!!

整体代码如下
头文件:list.h

点击查看代码
#pragma once  //保证只被编译一次
#include <stdlib.h>
#include <stdio.h>

//数据
typedef struct DATA 
{
	int x;
	int y;
	
}Data;

//结点
typedef struct NODE
{
	Data data;
	struct NODE *pnext;
}Node;


//链表
typedef struct LIST
{
	Node* pfront; /* 第一个结点指针*/
	Node* prear;  /* 最后一个结点指针*/
	int count;	  /* 结点的个数*/
}List;


int ListInit(List **pplist);
void TraverList(List *plist, void(*Traver)(Node* pnode));
int IsEmpty(List* plist);
void InserList(List* plist, Node* pnode);
void ShowData(Node * pnode);
void FreeList(Node *pnode); 

源文件:list.cpp

点击查看代码
#include "List.h"
int ListInit(List **pplist);
void TraverList(List *plist, void(*Traver)(Node* pnode));
int IsEmpty(List* plist);
void InserList(List* plist, Node* pnode);
void ShowData(Node * pnode);
void FreeList(Node *pnode);

源文件:main.cpp

点击查看代码
#include "List.h"
#include <time.h>
int main()
{

 	List *pList;		/*定义一个指针*/
 	ListInit(&pList);	/*对链表进行初始化*/
 	srand((unsigned)time(NULL));
 	for (int i = 0; i < 6; i++)
 	{
 		Node *pnode = (Node *)calloc(1, sizeof(Node));	/*制造结点*/
 		pnode->data.x = rand() % 10;
 		pnode->data.y = rand() % 10;
 		pnode->pnext = NULL;	/*结点不指向下一个结点*/

 		InserList(pList, pnode);/*将产生的结点插入到列表中*/
 		
 	}
 
 	TraverList(pList, ShowData);/*对链表进行遍历,并将结点中的数据表现出来*/

	Node *pfree;
	pfree = pList->pfront;
	FreeList(pfree);			/*将列表生成过程中开辟的空间释放掉*/
	free(pList);
	getchar();
}

标签:Node,结点,List,单向,C语言,链表,pnode,指针
来源: https://www.cnblogs.com/gaory/p/16098512.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有