动态链表
动态链表应该来说更加容易理解。(博主也是稀里糊涂)
首先建立一个结构体:
struct Node{
int data;
Node *next;//这个是用来储存下一个Node成员的地址的。
};
先定义几个结点:
Node *pre,*p,*head;
head=new head;//申请一个这样的空间作为head的地址
head->next=NULL;//初始化
pre=head;//表示的是当前的结点,作为一个移动参数
开始投放数据了:
for(int i=0;i<n;i++)
{
p=new p;//表示下一个结点
p->data=a[i];
p->next=NULL;
pre->next=p;//将pre和p给连接起来
pre=p;//当前结点就变成p了观察结构,此时的p->next也是空的地址,所以在继续录入数据的过程中总会把后面一个变量成员的地址,赋给当前这个成员的*next变量上,这样就完成数据的录入。
}
收尾了,进行数据的访问:
p=head;//这就是head的用处了,不能把前面的给丢了。这里有人就要问了,着head的*next不是NULL吗,怎么现在又有值了呢,请仔细观察,pre=head这个操作,它其实是在原有的地址上进行操作的(它没有new pre)。
while(p!=NULL)//这里可能会写成p->next!=NULL注意这个地方是值的,如果break的话,就少了一个值
{
printf("%d",p->data);
p=p->next;//访问下一个成员
}
吼吼吼!!!当然很多朋友都是追求完美的小可爱,那么你肯定想到了如何构建一个函数出来。很好,这交给你了。(还是敲一遍好了)
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct node{
int data;
int *next;
}
node * create(int Arryn[])
{
node *p,*pre,*head;
head=new head;
head->next=NULL;
pre=head;
for(int i=0;i<5;i++)//(5是数组的个数)
{
p=new p;
p->data=Arryn[i];
p->next=NULL;
pre->next=p;
pre=p;
}
return head;//这是一个指针形式的变量,与函数类型相对应
}
int main()
{
int Arryn[5]={1,2,3,4,5};
node *L=create(Arryn);//得到的就是头指针了。此时还没有数据
L=L->next;//有了有了
while(L!=NULL)
{
printf("%d ",L->data);
L=L->next;
}
return 0;
}
哈哈哈哈哈会了吧······(什么还不会,那就多敲几遍,会明白的,没有什么问题是敲代码解决不了的,有的话,多敲几遍)
静态链表
感觉差不多(就是更加糊涂了)
首先看结构挖特征,静态链表呢,不用指针来表示地址,而是用数据的形式通过数组下标来表示。
三个数据
a b c
c d e
首先构建结构体:
struct Node{
char data;
int next;
//bool flag;
}node[maxn];
录入数据:
for(int i=0;i<n;i++)
{
int address;char data;int next;
scanf("%d%c%d",&address,&data,&next);
node[address].data=data;
node[address].next=next;
}
访问:
for(int p=head;p!=-1;p=node[p].next)//这个其实就是表示的是在这个循环结束之后去访问下一个成员
{
printf("%c ",node[p].data);
}
还是扔个题目上去吧(copy from 算法笔记)给定两个静态链表的首地址,给定两个静态链表(自己建好)然后求这两条链表第一次交集的地方(地址若为-1,则是链表的结尾处)
11111 22222 9
67890 i 00002
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
67890
(聪明的你是不是已经想到了解决方法呢!!!!,快来尝试尝试吧)上代码!!!
#include<iostream>
#include<cstdio>
#define maxn 500007
using namespace std;
struct Node{
char data;
int next;
bool flag;
}node[maxn];
int main()
{
for(int i=0;i<maxn;i++)node[i].flag=false;//我记得可以直接在结构体中进行初始化。
int s1,s2,n;
scanf("%d%d%d",&S1,&s2,&n);
for(int i=0;i<n;i++)
{
int address,next;char data;
scanf("%d%c%d",&address,&data,&next);
node[address].data=data;
node[address].next=next;
}
int p;
for(p=s1;p!-1;p=node[p].next)
node[p].flag=true;//先遍历第一条链表,标注已经都在第一条中出现了
for(p=s2;p!=-1;p=node.next)
{
if(node[p].flag==true)break;//如果出现,就直接退出已经找到了
}
if(p!=-1)printf("%05d",p);
else printf("-1\n");//注意-1没有这种补零的形式
return 0;
}
(啊啊啊啊,写博客好累啊)其实还是比动态数组好理解一点的,就这样了(~~是不是觉得写了一个题目之后恍然大悟了,没错多刷题,~~狗头保命溜了溜了)