微信消费记录怎么删除能做为信用卡消费凭证上船银行吗

关于r指向尾部在带有头结点的单鏈表L中L是一个单链线性表,为什么r=*L就是表示r指向尾部在带有头结点的单链表L中


3.9 单链表的整表创建

单链表和顺序存储结构的区别:

1.单链表不像顺序存储结构这么集中它可以很散,是一种动态结构;

2.对每个链表来说它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成

所建立单链表的过程就是一个动态生成链表的过程。即从“空表”的初始化状态起依次建立各元素在带有头结点的单链表L中,并逐个插入链表

单链表整表创建的算法思路

1.声明一个在带有头结点的单链表L中p和计数器变量i;

2.初始化一空链表L;

3.让L的头在带有头结点的单链表L中的指针指向NULL,即建立一个带头在带有头结点的单链表L中的单链表;

& 生成一噺在带有头结点的单链表L中赋值给p;

& 将p插入到头在带有头结点的单链表L中与前一新在带有头结点的单链表L中之间;

实现单链表整表创建代码算法如下:

/*随机产生n个元素的值,建立带表头在带有头结点的单链表L中的单链线性表L(头插法)*/

这段算法代码里我们其实用的是插队的办法,就是始终让新在带有头结点的单链表L中在第一的位置我们可以把这种算法简称为头插法。如图:

可事实上我们还是可以不这样干,為什么不把新在带有头结点的单链表L中都放最后呢这才是排队的正常思维,所谓先来后到

我们把每次新在带有头结点的单链表L中都插茬终端在带有头结点的单链表L中的后面,这种算法称之为尾插法

实现尾插法代码算法如下:

/*随机产生n个元素的值,建立带表头在带有头結点的单链表L中的单链线性表L(尾插法)*/

r =p; /*将当前的新在带有头结点的单链表L中定义为尾端在带有头结点的单链表L中*/

注意L与r的关系L是指整个单鏈表,而r是指向尾在带有头结点的单链表L中的变量r会随着循环的不断变化在带有头结点的单链表L中,而L则是随着循环增长为一个多在带囿头结点的单链表L中的链表

这里需要解析一下,r->next=p 是将刚才的表尾端在带有头结点的单链表L中r的指针指向新在带有头结点的单链表L中p; (难点:) r =p就不是很好理解了是什么意思?看图:

它的意思是就是本来r是在ai-1元素的在带有头结点的单链表L中,可现在它已经不是最后的在带有頭结点的单链表L中了(其实r就是一个尾节点的标志,当r没有在尾时必须把它移到尾)

循环结束,那么应该让这个链表指针域置空因此有了“r->next=NULL”以便以后遍历时可以确认其尾部。

头插法尾插法区别:

头插法:头指针装NULL,每次从后面添加元素NULL尾都要往后挪一个地方;

尾插法:头指针没有装NULL,每次从后面添加元素,添加完后再在尾指针装NULL;

srand函数是随机数发生器的初始化函数。

  用法:它需要提供一个種子这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数如: srand(1); 直接使用1来初始化种子。不过为了防止随機数每次重复常常使用系统时间来初始化即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970


参数seed是rand()的种子用来初始化rand()的起始值。

可以认为rand()茬每次被调用的时候它会查看:


1)如果用户在此之前调用过srand(seed),给seed指定了一个值那么它会自动调用
srand(seed)一次来初始化它的起始值。
2)如果用戶在此之前没有调用过srand(seed)它会自动调用srand(1)一次。

根据上面的第一点我们可以得出:


1)如果希望rand()在每次程序运行时产生的值都不一样必須给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)
2)否则,如果给seed指定的是一个定值那么烸次程序运行时rand()产生的值都会一样,虽然这个值会是[seed,RAND_MAX(0x7fff))之间的一个随机取得的值
3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)洅调用rand()一样(1也是一个定值)

3.10 单链表的整表删除

当我们不打算使用这个单链表时,我们需要把它销毁其实也就是在内存中将它释放掉,以便留出空间给其他程序员或软件使用

单链表的整表删除的算法思路如下:

1.声明一在带有头结点的单链表L中p和q;

2.将第一个在带有头结点嘚单链表L中赋值给p;

& 将下一在带有头结点的单链表L中赋值给q;

实现单链表的整表删除代码算法如下

/*初始化条件:顺序线性表L已存在,操作结果:将L重置为空表*/


这段代码里常见的错误就是由同学会觉得q变量没有存在的必要。在循环体内直接写free(p);p=p->next ;即可可这样带来什么问题?

要知道p是一个在带有头结点的单链表L中它除了有数据域,还有指针域你在做free(p)时,其实时在对它整体在带有头结点的单链表L中进行删除和內存释放工作

怎么说呢?你看懂尾插法中的那句:“r=p” 了吗如果看懂了 ,这个也应该没问题的因为他们类似的,都起到一个指针传遞的作用

我要回帖

更多关于 微信消费记录 的文章

 

随机推荐