Code ghép 2 danh sách liên kết thành 1 danh sách và cũng được sắp xếp tăng dần bị sai

Em có danh sách liên kết đơn lẻ , chẳn đã được sắp xếp tăng dần , em muốn ghép 2 dslk này thành 1 và cũng đc sắp xếp tăng dần , em viết code không biết sai chổ nào mà nó không chạy , mong mọi người giúp đỡ ạ. Em cảm ơn!

#include <iostream>
using namespace std ;
struct Node{
	int data ;
	Node *pNext ;
};
struct LinkedList{
	Node* pHead ;
};
void Initialize(LinkedList &list){
	list.pHead=NULL; 
}
Node* CreateNode(int d){
	Node *pNode = new Node ;
	if(pNode!=NULL){
		pNode->data=d ;
		pNode->pNext=NULL ;
	}
	else{
		cout<<"\nCap phat vung nho that bai\n";
	}
	return pNode ;
}
void InsertLast(LinkedList &list, int d){
	Node *pNode=CreateNode(d) ;
	if(list.pHead==NULL){
		list.pHead=pNode ;
	}
	else{
		Node *ptemp = list.pHead ;
		while(ptemp->pNext!=NULL){
			ptemp=ptemp->pNext ;
		}
		ptemp->pNext=pNode ;
	}
	delete pNode ;
	pNode=NULL ;
}
void Traverse(LinkedList &list){
	Node *pTmp = list.pHead ;
	if(pTmp==NULL){
		cout<<"Danh sach lien ket rong\n";
		return ;
	}
	while(pTmp!=NULL){
		cout<<pTmp->data<<"\t";
		pTmp=pTmp->pNext ;
	}
}
LinkedList Ghep_List(LinkedList &list1 , LinkedList &list2){
	LinkedList list3 ;
        Initialize(list3) ;
	Node* p1 = list1.pHead ;
	Node* p2 = list2.pHead ;
	Node* p3 = list3.pHead ;
	while(p1 != NULL||p2 != NULL){
		if(p1->data<p2->data){
			p3->pNext = p1 ;
			p3=p1 ;
			p1=p1->pNext ;
		}
		else{
			p3->pNext=p2 ;
			p3=p2 ;
			p2=p2->pNext;
		}
	}
	if(p1==NULL){
		p3->pNext=p2;
	}
	else{
		p3->pNext=p1 ;
	} 
        delete p1,p2,p3 ;
	return list3 ;
}
int main(){
	LinkedList list1,list2,list3 ;
	Initialize(list1) ;
        Initialize(list2) ;
	for(int i=1 ; i<=9 ; i=i+2){
		InsertLast(list1,i) ;
	}
	for(int i=2 ; i<=10 ; i=i+2){
		InsertLast(list2,i) ;
	}
	list3= Ghep_List(list1,list2) ;
	Traverse(list3) ;
	
} 

Hàm InsertLast: bạn cho ptemp->pNext=pNode rồi ở dưới bạn lại đi delete pNode làm chi thế. Bạn xóa dòng đó đi và cho pNode = nullptr là đủ rồi nha.

4 Likes

Mình kiểm tra rồi , chổ đó không sai , xoá nó rồi cho nó =NULL thôi mà

Sao lại không sai, ptemp->pNextpNode đang cùng trỏ tới 1 vùng nhớ, bạn detele pNode thì chả khác nào delete ptemp->pNext, vậy thì hàm này còn ý nghĩa gì nữa

5 Likes

Oh mình hiểu rồi , hình như mình còn có lỗi ở hàm Ghep_List vì mình xoá dòng đó thì chương trình vẫn chạy bình thường , bạn xem giúp mình với

Lỗi y hệt trên delete p1, p2, p3

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?