搜索
查看: 1755|回复: 27
打印 上一主题 下一主题

逻辑大挑战链表4

[复制链接]
跳转到指定楼层
楼主
发表于 2014-6-22 23:03:12 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 超神级 于 2014-6-22 23:11 编辑

关于3动态内存分配这篇明天补上.可以明天再来.
关于链表篇的话就使用<问题出现解决问题的思路来讲>
数组和链表的区别:
  数组:    优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
    缺点:大小固定,不适合动态存储,不方便动态添加
    链表:
     优点:可动态添加删除   大小可变   
     缺点:只能通过顺次指针访问,查询效率低
  在访问方式上   
        数组可以随机访问其中的元素   
        链表则必须是顺序访问,不能随机访问   
     
空间的使用上   
        链表可以随意扩大   
        数组则不能   
好了上面都是老套话现在真正开始:
         在数据的存储上数组和链表有显著的区别(地址的连续和不连续)我们怎么解决这个问题使得链表可以近似于数组
因为我们之前学过了结构体我们可以定义一个这样的结构体使得当前的链表节点可以找到下一个节点
可以定义一个这样的一个结构体
struct ahc

        int shuju;//数据
        int *xia;//存储下个节点的地址


┌─  ───────┬───┐
│data数据 │next 下个│

└─────────┴───┘
看到上面的那个图像了把先来几个链表的专业术语记不记无所谓的
图像里面的head是头节点..然后依次是是首节点...尾节点...
有了上面那个结构体我们就可以试着写链表了‘
我们先这样写
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
    int shuju;
  struct ahc*xia;//下一个节点的地址..
};
int main()
{

    ahc to;
    return 0;
}
这样写了以后我们还要写一部分算法,分配几块内存然后把他们串起来...假设我们需要5个节点
写好后应该是这个样子
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
    int shuju;
    struct ahc*xia;//下一个节点的地址
};
struct ahc *hanshu(void)
{
     int b,c;
struct ahc*to=(struct ahc*)malloc(sizeof(struct ahc));//VC6上不强制转换编译通不过。。。=_=!.
struct ahc*to2=to;
    for(b=1;b<=5;b++)
    {
        printf("请输入你要增加的shuju\n");
        scanf("%d",&c);
       struct ahc*xia2=(struct ahc*)malloc(sizeof(struct ahc));
       xia2->shuju=c;
        to2->xia=xia2;///to=to2->xia;两种方式
    }
   
      return to;
}
int main()
{

    ahc *to;
    to=hanshu();
    return 0;
}
简单吧核心代码就十几句.
关键点:
为什么要建立to2这个指针呢?????
我们把to的指向的那块储存空间赋值给了to2,to2也就是相当于to。
因为如果我们不定义to2节点的话to节点一直在变化我们就找不到指针的首地址了。
     xia2->shuju=c;
        to2->xia=xia2;///to=to2->xia;两种方式
为什么找不到呢!观察上面两段语句.
关键点:
to2->xia=xia2;
ps:观察上面语句。不要搞混了xia和xia2的关系.
...然后要考虑到多方面因素我们还需要加些代码。


例如我们不知道链表什么时候会结束(在我们不知道几个节点的情况下)
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
    int shuju;
    struct ahc*xia;//下一个节点的地址
};
struct ahc *hanshu(void)
{
     int b,c;
struct ahc*to=(struct ahc*)malloc(sizeof(struct ahc));//VC6上不强制转换编译通不过。。。=_=!.
struct ahc*to2=to;
    for(b=1;b<=5;b++)
    {
        printf("请输入你要增加的shuju\n");
        scanf("%d",&c);
       struct ahc*xia2=(struct ahc*)malloc(sizeof(struct ahc));
       xia2->shuju=c;
        to2->xia=xia2;///to=to2->xia;两种方式
        xia2->xia=NULL;
    }
   
      return to;
}
int main()
{

    ahc *1to;
    to=hanshu();
    return 0;
}
//比上面的代码多了个xia2->xia=NULL;这是为了什么.加个结束符,便于操作.
好了现在差不多了..明天再写遍历和释放内存,


1048521.jpg (13.83 KB, 下载次数: 0)

1048521.jpg

评分

参与人数 1啊哈币 +10 收起 理由
李掌柜 + 10 不错不错,很给力的教程

查看全部评分

28#
发表于 2014-7-3 15:35:40 | 只看该作者
谢谢!!看来学习真的是任重道远啊
27#
发表于 2014-7-3 15:23:49 | 只看该作者
小乖代码 发表于 2014-7-3 13:43
相当感谢!!有没有什么书籍推荐吗?UNIX方面的

鸟哥的linux私房菜
26#
发表于 2014-7-3 13:43:31 | 只看该作者
rosynirvana 发表于 2014-7-3 11:57
先装个unix系统学学shell
然后学好C和数据结构,刷刷OJ多写点代码
汇编看一眼知道是怎么回事就行,然后 ...

相当感谢!!有没有什么书籍推荐吗?UNIX方面的
25#
发表于 2014-7-3 11:57:51 | 只看该作者
小乖代码 发表于 2014-7-3 08:24
学习的目的是想以后能从事相关的行业。
可以说系统的学习吧,先把底子打好,后续再考虑往后端走

先装个unix系统学学shell
然后学好C和数据结构,刷刷OJ多写点代码
汇编看一眼知道是怎么回事就行,然后学学操作系统
24#
发表于 2014-7-3 08:24:32 | 只看该作者
rosynirvana 发表于 2014-7-2 22:57
先说你的学习目的吧

系统学习,还是学单片机,还是想学网络前端后端,还是想学什么的

学习的目的是想以后能从事相关的行业。
可以说系统的学习吧,先把底子打好,后续再考虑往后端走
23#
发表于 2014-7-2 22:57:35 | 只看该作者
小乖代码 发表于 2014-7-2 16:04
请问大神,能说下您的学习经验吗?或者说学习路线,我王爽的汇编也看了一半了,十分感谢

先说你的学习目的吧

系统学习,还是学单片机,还是想学网络前端后端,还是想学什么的
22#
发表于 2014-7-2 16:04:09 | 只看该作者
rosynirvana 发表于 2014-6-29 02:01
不要看王爽的汇编了,过时多少年的东西
对,那东西是过时,不叫基础

请问大神,能说下您的学习经验吗?或者说学习路线,我王爽的汇编也看了一半了,十分感谢
21#
 楼主| 发表于 2014-6-29 12:40:22 | 只看该作者
rosynirvana 发表于 2014-6-29 02:02
因为mingw是win下面对标准实现得最好得编译器

恩                                             
20#
发表于 2014-6-29 02:02:13 | 只看该作者
超神级 发表于 2014-6-28 21:08
嗯.是这样的我并不熟悉标准和编译器扩展..弱弱问下使用mingw最大的原因是什么?
嗯.懂了!
...好吧!

因为mingw是win下面对标准实现得最好得编译器
19#
发表于 2014-6-29 02:01:11 | 只看该作者
小乖代码 发表于 2014-6-28 21:40
不是吧 我下下步 还打算学习编译原理啊   问题我只是个爱好者

不要看王爽的汇编了,过时多少年的东西
对,那东西是过时,不叫基础

编译原理是比较高级的课程了,写两年代码之后再去看吧
18#
 楼主| 发表于 2014-6-28 22:04:16 | 只看该作者
小乖代码 发表于 2014-6-28 21:40
不是吧 我下下步 还打算学习编译原理啊   问题我只是个爱好者

如果你每天闲得无聊或者时间充足可以去学习。
17#
发表于 2014-6-28 21:40:09 | 只看该作者
超神级 发表于 2014-6-28 21:14
说实话如果你打算在软件行业混的话学这些有好处!如果你只是爱好者的话就放弃吧!还不如学一些软件开发来 ...

不是吧 我下下步 还打算学习编译原理啊   问题我只是个爱好者  
16#
 楼主| 发表于 2014-6-28 21:14:40 | 只看该作者
小乖代码 发表于 2014-6-28 20:55
现在已经在看数据结构  和王爽的汇编   说实话汇编让我对语言有种其他的看法

说实话如果你打算在软件行业混的话学这些有好处!如果你只是爱好者的话就放弃吧!还不如学一些软件开发来的实惠。
15#
 楼主| 发表于 2014-6-28 21:08:31 | 只看该作者
rosynirvana 发表于 2014-6-28 11:50
主流的编译器我都在用,unix的gcc clang windows下面的mingw
我能分清楚哪些是标准哪些是编译器扩展,从 ...

嗯.是这样的我并不熟悉标准和编译器扩展..弱弱问下使用mingw最大的原因是什么?
嗯.懂了!
...好吧!
一些乱七八糟的东西吧!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表