/************************************************************************/
/* 功能:删除链表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);
}