链表是一个个节点组成的,节点是由节点的内容和下一个节点的地址组成,而且每一个节点都持有这下一个节点的内存地址,
所以在在程序的执行过程中,只需要重新创建一个新节点,然后将当前链表的尾节点持有新生成的节点的地址,这个时候链表的长度就新增一了。所以链表在程序执行期间长度是可变的。
与链表对应的是数组,它们是数据的两种存储方式,数组的大小是在编译器就确定了所需内存大小。
而链表所需的内存地址不是连续的,且可以动态增减长度。
1:Linklist * inserSort(Linklist *L) /*函数参数是一个链表的指针L,返回的也是这个指针,是排序好了的链表。*/2:{
3: Linklist *p=L->next/*p指向链表第一个节点。*/
4: Linklist *r
5: Linklist *q
6: int i
7: int j
8: int x
9: int n=lengList(L)/*获取链表的节点总个数,存入n。*/
10: for(i=1i<ni++)/*这个for循环配合23行,让p依次指向链表的第1个节点到倒数第2个节点。
这显而易见啊:循环了n-1次,每次都执行23行“p=p->next”。*/
11: {
12: q=p->next/*让q指向p的下一个节点*/
13: for(j=i+1j<=nj++)/*12行、这行的for循环和21行,让q依次指向p之后的节点一直到链表末尾。*/
14: {
15:if(p->data>q->data) /*看p中的数据是否比q中的大*/
16:{
17:x=p->data /*这17,18,19三行是交换pq两节点的数据*/
18:p->data=q->data /**/
19:q->data=x /**/
20:}
21:q=q->next
22: }
23: p=p->next
24: }
25: return L
26:}
以下是上面解释的动态例子:括号中是链表节点的数据,共4个节点,用1234标明。
1(5)->2(8)->3(2)->4(7)
i=1时:p->1(5)
j=2时:
p->1(5),q->2(8),if不成立,q->3(2)
j=3时:
p->1(5),q->3(2),if成立,交换,链表为1(2)->2(8)->3(5)->4(7),q->4(7)
j=4时:
p->1(2),q->4(7),if不成立q->5(null)
i=2时: p->2(8)
j=3时:
p->2(8),q->3(5),if成立,交换,链表为1(2)->2(5)->3(8)->4(7),q->4(7)
j=4时:
p->2(5),q->4(7),if不成立,q->5(null)
i=3时:p->3(8)
j=4时:
p->3(8),q->4(7),if成立,交换,链表为1(2)->2(5)->3(7)->4(8),q->5(null)
至此,排序流程走完,链表从5827排成了2578。
很不好意思,笔者由于重重原因现在仅能完成第一部分,希望能帮上你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)