首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问严蔚敏版《数据结构》中的一个例子

2012-04-03 
请教严蔚敏版《数据结构》中的一个例子?page31假设头指针为La和Lb的单链表分别为线性表LA和LB的存储结构,现

请教严蔚敏版《数据结构》中的一个例子?
page31

假设头指针为La和Lb的单链表分别为线性表LA和LB的存储结构,现要归并La和Lb得到单链表Lc。

C/C++ code
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc){//  已知单线性表La和Lb的元素按值非递减排列。//  归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。pa = La->next; pb = Lb->next;Lc = pc = La;while(pa && pb)  {    if(pa->data <= pb->data)    {      pc->next = pa; pc = pa; pa = pa->next;    }    else    {      pc->next = pb; pc = pb; pb = pb->next;    }    pc->next = pa ? pa : pb;    free(Lb);  }//  MergeList_L}


我个人觉得她这个算法是合并LA和LB,LC为合并后的LA。
请问free(Lb);释放的是什么内容?只是LB的头结点还是把整个LB都删除掉?如果只是头结点那么剩下的链表有好多是无效的,但没有删除,这就造成了一定的内存泄漏;如果是把整个LB都删除了,它是不是把整个LB的数据域和指针域都删掉了?因为它俩本来就是结点的两部分?这样就会导致LC中指向LB部分的指针找不到数据。

请大家指导一下,谢谢!

[解决办法]
只释放头结点.头结点只是一个普通的结点,是为了操作方便而设计的,与链表中其它结点有区别.
链表中其它结点都已经被归并到LC中,如果删掉就找不到了.而且这样的语句无法删掉其它结点.

链表相对于线性表来说,在操作过程中不需要移动结点的数据,只改变逻辑结构.
对于上例,改变逻辑结构之后,LB中的结点都已经归并到LA中,以LB为头结点的链表是一个空链表,只需要删除头结点即可.

热点排行