首页 > 试题广场 >

已知集合A和B的元素分别用不含头结点的单链表存储,函数dif

[填空题]
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference( )用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

链表结点的结构类型定义如下:
struct node  
{  
int elem;  
node* next;  
};  
 
void difference(node** LA , node* LB)  
{  
node *pa , *pb , *pre , *q;  
pre = NULL;  
1//1   
while(pa)  {  
pb = LB;  
   while2                 //2   
   pb = pb->next;  
   if3                   //3   
   {  
    if(!pre)  
        *LA = 4     ;     //4   
     else  
           5 = pa->next;     //5
     q = pa;  
     pa = pa->next;  
     free(q);  
   }  
    else  {  
           6 ;             //6   
           pa = pa->next;  
    }  
}  
}  
#include<stdio.h>

struct node{
	int elem;
	struct node* next;
};

/*
	本题的解法思路较简单:
	因为要求集合A和集合B的差集(A-B),结果保存在集合A中.
	所以我们取出集合A中每一个元素,然后在集合B中寻找(代码22行所实现) 找到即删除此节点 否则保留 
	此时while循环跳出只有两种情况,pb为NULL或者 pa->elem==pb->elem
	当pb不为null时,即找出集合A和集合B的公有元素,此时要删除这个元素 
		pre(实现删除节点之后的链接) 
		当pre为NULL时,说明是首次找到A和B的公有元素,此时 *LA指向pa->next 所以*LA仍然是头结点
		当pre不为NULL时, pre指向pa->next,顺利实现删除节点的链接 
*/


void difference(node** LA,node* LB){
	node*pa,*pb,*pre,*q;
	pre=NULL;
	pa=*LA;/*LA是指向指针的指针,pa指向集合的元素*/
	while(pa){
		pb=LB;/*pb指向集合B的元素*/
		while(pb && pa->elem!=pb->elem) /*在链表LB中寻找与pa所指元素相等的节点*/
			pb=pb->next;
		if(pb){ /*pa所指元素与pb所指元素相等*/
			if(!pre){
				*LA=pa->next;
			}else{
				pre->next=pa->next;
			}
			q=pa;/*求差集 所以要删除pa节点*/
			pa=pa->next;
			free(q);
		}else{
			pre=pa;
			pa=pa->next;
		}
	}
}

编辑于 2016-05-28 14:56:20 回复(7)
这也算错。。
发表于 2015-11-08 00:31:15 回复(6)
typedef struct node
{
    int elem;
    struct node*next;

}*Lnode;

void Different_Set(Lnode &La,Lnode Lb)//需要在La上进行更改,所以使用引用
{
    Lnode  pLa,pLb,pre,tmp;
    pre=NULL;
    pLa=La;
    while(pLa)//当La链表没到头的时候
    {
        pLb=Lb;
        while(pLb && pLa->elem != pLb->elem)//LB中没有和LA中相等的元素就继续寻找
        {
            pLb=pLb->next;
        }
        if(pLb)
        {
            if(!pre)//如果LB中和LA中的第一个元素相等了
            {
                La=pLa->next;//换掉LA中第一个节点
            }
            else//否则删除当前LA中与LB中相等的元素节点
            {
                pre->next=pLa->next;
            }
            tmp=pLa;
            pLa=pLa->next;
            delete tmp;
        }
        else
        {
            pre=pLa;
            pLa=pLa->next;
        }
    }

}
发表于 2015-11-15 14:51:34 回复(0)
pre指向当前非公有元素。当查找到A和B的公有元素时,若pre为空,说明前面的元素都是公有元素,需要修改*LA的表头;若pre不为空,则pre->next=pa->next跳过pa指向的当前公有元素,实现删除。
发表于 2016-12-23 11:09:23 回复(0)
  1. LA为二维指针,pa为一维指针,将pa指向链表A时,需要LA执行一次解引用操作,即pa=*LA;
  2. A在外层循环,B内层循环。每次取出A中一个值x后,在B中从头到尾找值为x的节点,即执行如下代码
    while(pb && pa->elem != pb->elem)
         pb=pb->next;
    其中pre始终指向pa的上一个节点。
    2.1找到x
    (1)若pre==NULL
    则说明此时在B中找到了A链表的首节点相同的元素,应该将此节点删除。所以执行*LA=pa->next,后面的
          q = pa;
          pa = pa->next;
          free(q);
    是将此时A中pa指向的节点删除,pa移到下一个元素,而*LA保持为A链表首节点;
    (2)若pre非NULL
    因为pa节点要删除,所以pre的下一个节点应该指向pa->next,即执行
          pre->next=pa->next;
    总地来说,就是保证pre是要操作的节点pa的上一个节点;
    2.2未找到x,也就是pb为NULL
    此时pa节点不会删除,pa会往后移,而在它后移之前,我们需要保证pre是移到后pa的上一个节点,所以执行
          pre=pa;
          pa=pa->next;
编辑于 2017-07-05 19:05:33 回复(0)
*LA==pa->next;表示如果头结点为相同元素的话,那么该元素要删除,且*LA指向pa的下一个结点。
发表于 2017-03-13 10:48:28 回复(2)
这道题关键是理解pre这个指针代表的含义,pre为null,表示第一次两个集合的共有元素。找到新的*LA的头结点。
发表于 2016-08-08 20:30:28 回复(0)
代码中的指针pa用于指向集合A的元素;pb指向集合B的元素;临时指针q指向需要被删除的元素;pre用于实现删除时结点的链接,与pa保持所指结点的前后继关系。
发表于 2014-10-25 00:26:05 回复(0)
看别人的代码真痛苦!!!!
发表于 2017-07-09 08:43:30 回复(0)
请哪位牛客帮忙解释一下,LA为什么要定义成指针的指针?定义成LB一样的类型不行吗?
发表于 2017-05-26 10:05:05 回复(1)
每个符号之间要有空格!!!
发表于 2017-05-18 09:25:12 回复(0)
大声告诉我,pre指针一开始就是空,最后怎么有next?
发表于 2016-10-04 15:52:36 回复(2)
pre 指针的用途是先判断是否找到第一个元素。后面用于构建删除元素之后的LA链表。
发表于 2016-09-23 23:39:26 回复(0)
2里面没有括号行?
发表于 2016-08-17 00:01:44 回复(0)
我就想问一下,如果a的第一个元素和b的第一个元素相同,那么就不会进入while(pb && pa->elem!=pb->elem)的这个循环里,也就不会删除节点,所以这个程序的思路有bug呀。!!!!
求反驳。求指教。没有的话 这个网站。。。有点水
发表于 2016-07-06 20:34:39 回复(2)
判题太死板了。判题系统0智力集成,开发者不愿动一点脑筋,直接比较字符串。
第二空,while循环连括号都没有,我加了个括号算我错了
发表于 2016-06-22 08:24:31 回复(0)
原来free可以这么用,没有malloc也能直接free掉吗
发表于 2016-01-09 14:48:40 回复(2)
啥头像
强烈建议后台修改批改程序。不要硬匹配,可以填入跑程序嘛。

每次都是因为一个空格、等式左右两遍互换了下导致错误。
发表于 2015-12-14 12:30:30 回复(0)
这题目是不是问题啊,若第pb为空了,说明LB中的的节点和pa指向节点没有相同的,pre应该指向下一个节点才是pa吧
发表于 2015-11-16 19:32:52 回复(0)
手机代码看不到
发表于 2015-09-06 10:41:52 回复(0)