数据结构----链表

内存

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

代码区里存放程序的代码,即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函数我们只写了几行,就完成了链表的初始化,节点的创建,节点的插入,链表的遍历,而且这样写有一个好处,不用每次都把链表写一遍,是不是很方便呢??简直了对不对
哈哈哈哈哈哈
有写错的请指出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值