ICode9

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

数据结构----链表

2020-02-25 20:01:24  阅读:272  来源: 互联网

标签:Node List plist 链表 pnode 数据结构 节点


内存

先来谈谈内存
在这里插入图片描述

代码区里存放程序的代码,即CPU执行的机器指令,并且是只读的;
全局区里存放定义的全局变量;
栈区里存放着定义的局部变量,系统自动回收释放;
堆区需要手动申请malloc,手动释放free
(栈区内存小,堆区内存很大很大)
学习数据结构先得明白内存!

链表

鄙人普通本科,表示老师课上讲的什么头插,尾插,节点的,搞得后来都晕圈了,淦。
面向过程的写法确实容易让小白(我)晕圈,为了更好的搞懂链表,我去学习了另一种面向对象的写法。
在这里插入图片描述

数据就是数据,节点就是节点,最后再来一个List总表(列车管理员!)

数据–Data

假设存放了int型的a,b和一个char型的ch,这些组成数据域,一共占有9个字节。很简单的一个结构体Data

节点–Node

又是一个结构体,里面存放着Data型的数据 data,以及指向其他节点的Node* 类型的指针。放一张图片来说明一下吧!
在这里插入图片描述
这样就实现了很简单的人人都能理解的链表,各个节点随机分布在内存中(堆区),利用pnext指针将其串联!大家肯定着急问表头呢?别急,往下看

链表–List

这种写法我们只需要定义一个结构体List,让他来充当管理员的身份,List结构体中有三个变量:分别是pfront------指向第一个节点的指针变量(Node型)
prear--------指向最后一个节点的指针变量(Node
型)
count-------共有多少个节点的数量(int型)
再来一张图吧!在这里插入图片描述
哈哈哈哈你想头插就头插,尾插就尾插,是不是一下感觉清爽了很多!记住,我们用的是面向对象的写法,也就是说,制订了各种规则,使得链表的归链表管,节点的归节点管,我不需要一步一步的展现出来只需调用即可。

1.main.cpp

#include<stdio.h>
#include<stdlib.h>
#include"list.h"
#include"node.h"
/*
List   链表   list.h list.cpp
Node   节点    node.h node.cpp
data   数据	   data.h data.cpp
*/
int main()
{
	List* pList;//定义一个指针
	ListInit(&pList);//初始化链表
	CreatNode(pList);//五个节点
	TraverList(pList, ShowData);
}

2.list.cpp&list.h

list.cpp:

#include"list.h"
//初始化链表 成功放回1,失败返回0
int ListInit(List **pplist)//pplist 是指向plist的指针(二级指针)
{
	*(pplist) = (List*)malloc(sizeof(List));
	if (*pplist == NULL)
	{
		return 0;
	}
	else
	{
		(*pplist)->pfront = NULL;
		(*pplist)->prear = NULL;
		(*pplist)->count = 0;
	}
	return 1;
}
//判断链表是否为空
int IsEmpty(List* plist)
{
	if (plist->count == 0)
		return 1;
	return 0;
}

void InsertList(List* plist, Node* pnode)
{
	//尾插
	if (IsEmpty(plist))
	{
		plist->pfront = pnode;
		plist->prear = pnode;
		plist->count++;
	}
	else
	{
		plist->prear->pnext = pnode;
		plist->prear = pnode;
		plist->count++;
	}
}
//遍历链表   留接口 函数指针---指向函数的指针
void TraverList(List* plist, void(*Traver)(Node* pnode))
{
	Node* ptemp = plist->pfront;
	int listsize = plist->count;
	while (listsize)
	{
		Traver(ptemp);//需要遍历链表的功能函数!
		ptemp = ptemp->pnext;
		listsize--;
	}
}

简单说明一下,这里写的主要是一些操作这个链表的函数,面向对象,只想关于链表的事情,节点的事情我不用管,反正会通过参数传过来,我不用管节点怎么来的。重点谈一下 TraverList这个函数,注意 我留了*** 接口 *** !也就是说,当我需要遍历链表来实现某种功能的时候,我只要写出那个功能函数,就像一个插口一样,需要用的时候拿过来调用即可,(指向函数的指针!!)比如我要遍历链表来打印,那我只需要写ShowData,我要遍历链表来修改某个值,只要写ModifyData,方便!!等等等等,我感叹与面向对象的思维,很有趣。
list.h:

#pragma once
#include<stdlib.h>
struct Data
{
	int a;
	int b;
	char ch;
};
struct Node
{
	Data data;
	struct Node* pnext;
};
struct List
{
	Node* pfront;//第一个节点的指针
	Node* prear;//最后一个节点的指针
	int count;//有多少个节点
};
int ListInit(List** pplist);
int IsEmpty(List* plist);
void InsertList(List* plist, Node* pnode);
void TraverList(List* plist, void(*Traver)(Node* pnode));

头文件这里做函数的声明即可!

3.node.cpp&node.h

 node.cpp
#include"node.h"
#include<stdio.h>
#include"list.h"
void ShowData(Node* pnode)
{
	printf("a=%d\tb=%d\t%c\n", pnode->data.a, pnode->data.b, pnode->data.ch);
}
void CreatNode(List* pList)
{
	for (int i = 0; i < 5; i++)
	{
		//创建节点
		Node* pnode = (Node*)malloc(sizeof(Node));
		pnode->data.a = rand() % 1200;//a是1-1200的随机数
		pnode->data.b = 0;//b=0
		pnode->data.ch = rand() % 26 + 65;//ch是随机大写英文字母
		pnode->pnext = NULL;
		InsertList(pList, pnode);
	}
}

我仅仅写了很简单的打印链表的内容这个函数,哈哈哈,后期搞点有难度的,这个好懂呀。
注意,节点里只有节点,不要去想链表哪里来,链表会通过参数传过来!我随便编的创建五个节点,实际上可以根据需求做出改动的,(我写的是无敌easy版,我菜嘻嘻)
调用了尾插法将节点插入链表中去
node.h

#pragma once
#include<stdlib.h>
#include"list.h"
void CreatNode(List* pList);
void ShowData(Node* pnode);

就声明了两个函数,哈哈哈

运行结果

拿图说话
在这里插入图片描述
a是1-1200随机数
b=0
ch随机大写字母
成功

看看main函数我们只写了几行,就完成了链表的初始化,节点的创建,节点的插入,链表的遍历,而且这样写有一个好处,不用每次都把链表写一遍,是不是很方便呢??
我giao
简直了对不对
我刚学的时候也是这个表情
哈哈哈哈哈哈
有写错的请指出
拜托!这对我很重要!!!
2020冲鸭,疫情退散!

三年柏拉图 发布了54 篇原创文章 · 获赞 4 · 访问量 864 私信 关注

标签:Node,List,plist,链表,pnode,数据结构,节点
来源: https://blog.csdn.net/weixin_45460987/article/details/104502266

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

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

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

ICode9版权所有