香蕉树上第一根芭蕉——关于C语言中链表(动态链表静态链表)使用说明

本文参考自: 原文地址



C语言中链表的出现就是解决存储空间合理分配的问题。所以链表是由若干数据项组成的,这些数据项称为结点,也可以说这些节点作为一个独立数据单元,满足对数据的存储要求,可以正是由于这些节点的独立性,所以不再要求存放地址必须是连续的。比如存储一个hello,就可以把h放在地址0x1122e放在0x3344,l放在ox6732l放在0x3562o放在0x3678。这些地址完全不连续,那么又是如何将它们联系起来的呢?这就需要用到结点自身的指针,利用自身的指针指向下一个结点,比如存储h这个结点中的指针指向存储e这个结点,以此类推,这样就可以把hello串起来了。

1)静态链表使用

虽然说是这样,但是链表分为动态链表和静态链表,那现在先说说静态链表。静态链表如下图所示,不走就是先定义一个结构体,然后使用这个结构体再去定义变量,需要注意的是在C语言中结构体定义时一定要加上struct,但是在c++中,没有了这个限制,这也是算对c语言的一种优化吧。通过对定义的几个结构体赋值之后,再将第二个链表的地址给第一个链表指针,以此类推。需要注意的是,每个链表自带指针必须先赋值为空,毕竟谁会知道这个是不是尾结点呢。赋值好之后,遍历就可以哦,至于对结点指针赋值说明,将在下面的动态链表中提到。

需要说明的是在使用结构体时,要知道struct MyStruct其实所代表的含义不过是说相当于是int这样的作用,其他倒是没什么。这也就是为什么说一个函数定义中,函数定义中(【存储类型】 【返回值类型符】 函数名 【形参说明表】),那么这里struct  MyStruct就只是相当于个存储类型而已。

2)动态链表使用

         首先有了静态链表的基础之后,我们应该对链表有了个大概认识,好了,那就开始动态链表之旅吧。动态链表含义可以表现为两个方面,一是说结点个数是动态的,另一个是结点里面内存是动态的。在弄清楚这些之前要先看指针是如何移动的,看下面的图:

         很多文章会把所谓的P1=P2看成是什么P1指针移向P2,这让人费解,为什么指针会移动呢,其实说起来,这只不过是个临时变量存储而已,下面来看看具体代码。

         从这个代码中其他不必多说,想说的是在这里,上面所说的临时存储结构体变量其实不用分配空间可以,但是在这里是不必去使用malloc初始化,毕竟,这个P1只是装个地址而已,而装地址,那么在32位系统中,指针是固定大小的,也就是四个字节,但是在64位系统中,是8个字节,既然有那么大空间,就不必担心存不下你的地址,毕竟每个结点分配空间又不是和你地址大小有关!!当然,从另外一个方面来说,就是因为指针固定大小,才可能放在结构体中而且自己定义一个自身的结构体型指针。不过,在这里我有脑洞大开了一下下,之前在想结构体型指针和结构体区别到底是什么呢?现在好像想清楚了,那就是结构体型指针既可以完成指向自身结构体内元素的任务,但是又可以固定空间,就是不随你结构体类型变化而变化内存空间,否则它也放不到结构体里面去啊,上面说了,有点重复!但是有没有想过一个问题便是,如果你将malloc分配空间过大,比如你写成malloc(39*sizeof(struct MyStruct)),看看malloc语法规定就知道,其实他这里分配的是连续内存空间,那么动态链表意义似乎就大打折扣了吧,但是这也是为了方便你一次性分配多个空间嘛。所以这是一个令人焦灼的问题。所以如果你要产生一个又是动态分配内存,又是不连续地址,这个任务只能交给自己吧。毕竟如果你只是分配一两个,还是比较方便的。

         在做这个过程中还遇到了个问题,就是到底一些指针赋值搞来搞去是什么意思,现在好像可以总结一下了,总结结果如下图:

2

3scanf函数输入字符串

或许你以为说scanf函数会将等待你的输入,其实是不会的,对于这个函数有一个输入和缓存机制,就是说如果你输入有多,那么就会放入缓存区,如果还是这个函数扫描,那么必然结果是不必等待你输入了,如下面这个例子中,会发现你如果直接输入jihshk,会直接输出,或许这个例子不够明显,那么看看另外一个更明显例子。

看看这个例子,你会发现你只输入个ko但是打印了三次helloworld

还有个地方需要注意的是,在vs中,输入是scanf函数会报错,加上下面这句就不会了哦:#pragma warning(disable:4996)

还有就是要注意的是如果非要使用scanf_s函数一定要在后面加参数哦,如scanf_s(“%s”.ws,10)有人说区别新手老手区别就是看会不会使用指针,所以指针确实是一个难点,所以要去看一本《深入理解c指针》。

 

 

猜你喜欢

转载自blog.csdn.net/qq_39706019/article/details/81478922
今日推荐