C++的节点定义

一.链表

用一组地址任意的储蓄单元(当然,存储单元可以连续,也可以不连续)依次储蓄线性表中的各个元素。链表可以用指针实现,例如:

int *lists;

也可以用数组:

int x[/*指定的链表数量,我这里随便填一个*/10005];
//注意不要越界,int的范围是2e9
1.单向、线性链表

这种性质的节点由两部分组成:元素自身信息(即数据区:data),还有后继元素位置组成(即link)。
整个链表有一个是外指针/头结点指针list输出,以表明链表的首地址。

如果链表为空,那么list=NULL

2.双向链表

双向链表的每个链节点输了数据区(data)外设两个指针:

一个llink,指向了直接前区节点

一个rlink,指向了直接后继节点

当然,data仍然存在,不要把他忽略了!!!!!!!!!!

3.循环链表

链表的最后一个链接点的指针指针指向了链表第一个节点,生个链表形成了一个环形,从任意节点出发都可以找到其他节点

二.二叉树

二叉树(binary tree,简写为BT),是一种度数指向2的数,每个节点最多有2个叉。

遍历二叉树很简单,一般只要从左到右就可以了。(一共有4中方法:前序遍历、中序遍历、后序遍历和层次遍历)

三.利用结构体和指针定义链表节点

代码如下:

struct node{
    int data; //数据区
    struct node*next //指针区
}NODE,*PNODE;

如果想换成二叉树,代码如下:

struct node{
    int data;
    struct node*LeftChild;
    struct node*RightChild;
}NODE,*PNODE;

四.节点的定义-应用

1.模拟链表
【题目描述】

在图论题编程中,通常情况下需要使用邻接链表的结构。因为动态指针比静态数组存储较慢,很多OI选手就是用数组模拟的指针。请你操作一下。

有n个节点,从1~n。M条边,每条边要用连接的2个定点表示,如:(3,8),表示定点3~8之间的边(无向边)。

请输出每个顶点的通过边相邻的顶点

来源:CSP考试

【样例输入】

5 6
1 3
2 4
1 4
2 3
3 5
2 5

【样例输出】

2 4 3

3 5 3 4

3 5 2 1

2 1 2

2 2 3

【代码】
#include<iostream>
using namespace std;
struct node{
	int v;
	int next;
}a[200001];
int n,m,p,k[5001],c[5001];
void insert(int u,int v){
	a[++p].v=v;
	a[p].next=c[u];
	c[u]=p;
	k[u]++;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		insert(u,v);
		insert(v,u);
	}
	for(int i=1;i<=n;i++){
		cout<<k[i]<<' ';
		for(int j=c[i];j>0;j=a[j].next){
			cout<<a[j].v<<' ';
		}
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值