一.链表
用一组地址任意的储蓄单元(当然,存储单元可以连续,也可以不连续)依次储蓄线性表中的各个元素。链表可以用指针实现,例如:
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;
}

616

被折叠的 条评论
为什么被折叠?



