动态链表与静态链表的构造


链表真让人犯迷糊

动态链表

动态链表应该来说更加容易理解。(博主也是稀里糊涂)

首先建立一个结构体:

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;    
}

啊啊啊啊,写博客好累啊)其实还是比动态数组好理解一点的,就这样了(~~是不是觉得写了一个题目之后恍然大悟了,没错多刷题,~~狗头保命溜了溜了)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值