实战数据结构(2)_两个单链表间的删除操作

/************************************************************************/
/* 功能:删除链表A中在B中出现的节点  就是求解(A-B)
exp: 
A中元素10个:2,3,6,7,9,14,56,45,65,67
B中元素8个: 3,4,7,11,34,54,45,67 
则 A-B后,A中的元素为6个
2 6 9 14 56 65                                 */
/************************************************************************/
/************************************************************************/
/* 出现的问题:
1.数组名的问题 int a[4];
	sizeof(a)表示整个数组的大小=sizeof(int)*4,sizeof(a[0])表示一个元素的字节数为sizeof(int)
	但是我在传递到一个函数中,将该数组名(也就是指针)传递给到另一个函数中,
	func(a);
	void func(int *dataa)
	{	
		int x=sizeof(dataa);
		printf("%d",x); //结果为 x=4,并不是40.
	}
2.逻辑的问题
	见代码错误处
3.判别的问题
	while(cur_b!=NULL && cur_a->data!=cur_b->data )
	第一个检测时否是 满足cur_b!=NULL,如果不满足,后面就不检测了,如果
	while( cur_a->data!=cur_b->data && cur_b!=NULL )就出现问题,内存泄露
	因为一轮查找完b后,cur_b=NULL了。此时cur_b->data是没有的,只读错误。
                                                                    */
/************************************************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}listnode;


void CreateList(listnode *head,int nodenum,int *data);
void printflist(listnode *head);
void DeleElement(listnode *lista,listnode *listb,int *leave,int dataa);

void main()
{
	int dataa[]={2,3,6,7,9,14,56,45,65,67};
	int datab[]={3,4,7,11,34,54,45,67,2};
	listnode *head1=(listnode *)malloc(sizeof(listnode));
	listnode *head2=(listnode *)malloc(sizeof(listnode));
	if(head1==NULL|| NULL==head2)
	{
		printf("头结点malloc分配失败\n");
		exit(-1);
	}
	CreateList(head1,sizeof(dataa)/sizeof(dataa[0]),dataa);
	printf("链表A的元素有%d个:\n",sizeof(dataa)/sizeof(dataa[0]));
	printflist(head1);
	CreateList(head2,sizeof(datab)/sizeof(datab[0]),datab);
	printf("链表B的元素有%d个:\n",sizeof(datab)/sizeof(datab[0]));
	printflist(head2);
	int leave;
	DeleElement(head1,head2,&leave,sizeof(dataa)/sizeof(dataa[0]));
	printf("则 A-B后,A中的元素为%d个\n",leave);
	printflist(head1);

}

void CreateList(listnode *head,int nodenum,int *data)
{
	
    listnode *h=head,*pre=h,*newnode;   
    for(int i=0;i<nodenum;i++)  
    {     
        if(NULL==(newnode=(listnode *)malloc(sizeof(listnode))))//开辟一个新节点  
        {  
            printf("malloc申请失败");  
            return ;  
        }  
		newnode->data=data[i];
        pre->next=newnode;  
        pre=newnode;  
    }  
    pre->next=NULL;  
    return ;  

}

void printflist(listnode *head)
{
	listnode *p=head->next;
	while(p!=NULL)
	{	
		printf("%4d",p->data);
		p=p->next;
	}
	printf("\n");
	return ;	
}

void DeleElement(listnode *lista,listnode *listb,int *leave,int dataa)
{
	//链表a删除b在a中出现的元素
	listnode *pre_a=lista,*cur_b=listb->next,*p;
	int count=0;
	while(pre_a->next!=NULL) //控制整个流程
	{
		while(cur_b!=NULL && pre_a->next->data!=cur_b->data )		//将链表b中的元素在a中遍历
				cur_b=cur_b->next;					//目的 找到删除节点pre位置
		if(NULL!=cur_b)		//b遍历完一遍了 找到了
		{	
			p=pre_a->next;
			pre_a->next=p->next;
			free(p);	
			count++;		//用Pre做的话,找到后不要更新pre=pre->next
		}
		else 
			pre_a=pre_a->next;	//a中元素后继一位
		cur_b=listb->next; //重新从第一个元素开始
		
	}
	*leave=dataa-count; //返回剩下a中元素个数
	return ;
}

/************************************************************************/
/* 问题:
这里发生了个细节问题,在C中,求数组的大小,是用单目运算符sizeof()来做,
int a[3]; sizeof(a)=3*sizeof(int).但是在函数传递中,将a传递给其他的函数,这时候
就是指针了,并且a代表的是第一个元素的地址。                                                                  */
/************************************************************************/
void func(int *a)
{
	printf("数组a的大小为:sizeof(a)=%d\nsizeof(a[0])=%d\n",sizeof(a),sizeof(a[0]));

}
void main()
{
	int a[4];
	printf("数组a的大小为:sizeof(a)=%d\nsizeof(a[0])=%d\n传递函数后\n",sizeof(a),sizeof(a[0]));
	func(a);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值