user-0 提问: 关于数据结构的问题，老是内存泄漏？？求大神指导

回复:
user: user-0
content: 引用 4 楼 qq423399099 的回复:感觉你的add1函数逻辑上有问题(非常多的问题) add1函数里合并起来的h3肯定内存泄漏啊，即没有带出h3头结点的地址，也没有在函数里free (主函数中的两个链表用完也要free)  #include <stdio.h> #include <stdlib.h> typedef struct Node { 	int x1; 	int x2; 	struct Node *next; }List; void Create(List *l,int n) { 	List *h=l,*prev = NULL; 	h->next=NULL; 	while (n) { 		List *temp=(List *)malloc(sizeof(List)); 		temp->next=NULL; 		scanf("%d %d",&temp->x1,&temp->x2); 		if (h->next==NULL) { 			h->next=temp; 		} 		else 			prev->next=temp; 		prev=temp; 		n=n-1; 	} } void DisPlay(List *l) { 	List *h=l; 	while (h!=NULL) { 		printf("%d,%d\n",h->x1,h->x2); 		h=h->next; 	} }  void add1(List *l1,List *l2,List &l3) { 	List *h1=l1->next; 	List *h2=l2->next; 	List *h3 = NULL,*prev = NULL; 	while (h1!=NULL||h2!=NULL) { 		int a,b; 		if (h1 != NULL && h2 == NULL) 		{ 			a=h1->x1; 			b=h1->x2; 			h1=h1->next; 		} 		else if (h2 != NULL && h1 == NULL) 		{ 			a=h2->x1; 			b=h2->x2; 			h2=h2->next; 		} 		else if (h1->x2==h2->x2) { 			a=h1->x1+h2->x1; 			b=h1->x2; 			h1=h1->next; 			h2=h2->next; 		} 		else if (h1->x2<h2->x2) 		{ 			a=h1->x1; 			b=h1->x2; 			h1=h1->next; 		} 		else if (h2->x2<h1->x2) 		{ 			a=h2->x1; 			b=h2->x2; 			h2=h2->next; 		} 		List *temp=(List *)malloc(sizeof(List)); 		temp->next=NULL; 		temp->x1=a; 		temp->x2=b; 		if (h3==NULL) { 			h3=temp; 		} 		else 			prev->next=temp; 		prev=temp; 	} 	l3 = *h3;//通过引用带出 	/* 	while (h1!=NULL) { 	int a,b; 	a=h1->x1; 	b=h1->x2; 	h1=h1->next; 	List *temp=(List *)malloc(sizeof(List)); 	temp->next=NULL; 	temp->x1=a; 	temp->x2=b; 	if (h3->next==NULL) { 	h3->next=temp; 	} 	else 	prev->next=temp; 	prev=temp;  	} 	while (h2!=NULL) { 	int a,b; 	a=h2->x1; 	b=h2->x2; 	h2=h2->next; 	List *temp=(List *)malloc(sizeof(List)); 	temp->next=NULL; 	temp->x1=a; 	temp->x2=b; 	if (h3->next==NULL) { 	h3->next=temp; 	} 	else 	prev->next=temp; 	prev=temp; 	} 	DisPlay(h3);*/ 	 } int main(int argc, const char * argv[]) { 	// insert code here... 	List l,l1,l2; 	printf("第一个链表:\n"); 	Create(&l, 2); 	printf("第二个链表:\n"); 	Create(&l1, 3); 	add1(&l, &l1,l2); 	printf("------------------------------------------------\n"); 	DisPlay(&l2); 	printf("Hello, World!\n"); 	return 0; }  如果让h3变成带头结点的链表呢？

user: user-0
content: 谢谢各位大神了

user: user-1
content: 感觉你的add1函数逻辑上有问题(非常多的问题) add1函数里合并起来的h3肯定内存泄漏啊，即没有带出h3头结点的地址，也没有在函数里free (主函数中的两个链表用完也要free)  #include <stdio.h> #include <stdlib.h> typedef struct Node { 	int x1; 	int x2; 	struct Node *next; }List; void Create(List *l,int n) { 	List *h=l,*prev = NULL; 	h->next=NULL; 	while (n) { 		List *temp=(List *)malloc(sizeof(List)); 		temp->next=NULL; 		scanf("%d %d",&temp->x1,&temp->x2); 		if (h->next==NULL) { 			h->next=temp; 		} 		else 			prev->next=temp; 		prev=temp; 		n=n-1; 	} } void DisPlay(List *l) { 	List *h=l; 	while (h!=NULL) { 		printf("%d,%d\n",h->x1,h->x2); 		h=h->next; 	} }  void add1(List *l1,List *l2,List &l3) { 	List *h1=l1->next; 	List *h2=l2->next; 	List *h3 = NULL,*prev = NULL; 	while (h1!=NULL||h2!=NULL) { 		int a,b; 		if (h1 != NULL && h2 == NULL) 		{ 			a=h1->x1; 			b=h1->x2; 			h1=h1->next; 		} 		else if (h2 != NULL && h1 == NULL) 		{ 			a=h2->x1; 			b=h2->x2; 			h2=h2->next; 		} 		else if (h1->x2==h2->x2) { 			a=h1->x1+h2->x1; 			b=h1->x2; 			h1=h1->next; 			h2=h2->next; 		} 		else if (h1->x2<h2->x2) 		{ 			a=h1->x1; 			b=h1->x2; 			h1=h1->next; 		} 		else if (h2->x2<h1->x2) 		{ 			a=h2->x1; 			b=h2->x2; 			h2=h2->next; 		} 		List *temp=(List *)malloc(sizeof(List)); 		temp->next=NULL; 		temp->x1=a; 		temp->x2=b; 		if (h3==NULL) { 			h3=temp; 		} 		else 			prev->next=temp; 		prev=temp; 	} 	l3 = *h3;//通过引用带出 	/* 	while (h1!=NULL) { 	int a,b; 	a=h1->x1; 	b=h1->x2; 	h1=h1->next; 	List *temp=(List *)malloc(sizeof(List)); 	temp->next=NULL; 	temp->x1=a; 	temp->x2=b; 	if (h3->next==NULL) { 	h3->next=temp; 	} 	else 	prev->next=temp; 	prev=temp;  	} 	while (h2!=NULL) { 	int a,b; 	a=h2->x1; 	b=h2->x2; 	h2=h2->next; 	List *temp=(List *)malloc(sizeof(List)); 	temp->next=NULL; 	temp->x1=a; 	temp->x2=b; 	if (h3->next==NULL) { 	h3->next=temp; 	} 	else 	prev->next=temp; 	prev=temp; 	} 	DisPlay(h3);*/ 	 } int main(int argc, const char * argv[]) { 	// insert code here... 	List l,l1,l2; 	printf("第一个链表:\n"); 	Create(&l, 2); 	printf("第二个链表:\n"); 	Create(&l1, 3); 	add1(&l, &l1,l2); 	printf("------------------------------------------------\n"); 	DisPlay(&l2); 	printf("Hello, World!\n"); 	return 0; }

user: user-2
content: 再加一个Destroy函数，来free掉链表的各个节点，在程序结束前调用这个Destroy函数

user: user-3
content: 你malloc完了不free能不泄露吗。。。 在退出程序之前遍历一下链表进行free啊

user: user-0
content: 求解答啊！！！