30/09/2018, 18:45

Lỗi: Node trong danh sách liên kết đơn bị đứt sau khi add node?

Yêu cầu:
chèn 1 node (giá trị nhập vào tùy ý) vào sau node có giá trị = x (x nhập vào tùy ý ) trong danh sách liên kết đơn

các anh(chị, bạn) xem giúp e lỗi ở đâu ạ, e xem đi xem lại, vẽ ra giấy và test thủ công bằng tay từng trương hợp rồi mà k thấy lỗi, sau khi add node xong thì danh sách bị đứt chỗ nào ạ,
với bộ test danh sách 1 1 1
nhập x =1 . node chèn vào có giá trị =0 hoặc bất kì thì lỗi danh sách chỉ in ra 1 0 (mất 2 con 1 phía sau )
đáng ra phải là 1 0 1 0 1 0
với bộ test danh sách 1 2 1 cũng tương tự
nhập x =1 , node cần chèn có giá trị 0 hoặc bất kì thì cũng lỗi danh sách chỉ in ra 1 0
chỉ bị lỗi 2 trường hợp trên
e cảm ơn
code

void insertNodeGT(linked &list ){   
	int check =0;
	if (list.pHead == NULL){
		cout<<"Danh sach rong"<<endl;
		return;
	}
	int data, giatri;
	cout<<"Nhap data cho node can chen ";
	cin>>data;
	node *tempnode= createNode(data);
	cout<<"Nhap gia tri node (chen sau node nay) ";
	cin>>giatri;

	for (node *p = list.pHead; p;){
	if ( p->songuyen == giatri){
		check =1;
		tempnode->pnext = p->pnext;
		p->pnext = tempnode;
		p=tempnode->pnext;
		if ( p == list.pTail ) list.pTail = tempnode;
	}
	else p = p->pnext;
	}
	if (check == 0) cout<<"Gia tri "<<giatri<<" khong nam trong day"<<endl;
	else displayList(list);
}

chương trình đầy đủ

#include <iostream>
using namespace std;
//-----------------------------------------------------
typedef struct tagnode{ 
	int songuyen;
	tagnode *pnext;  
}node;  

typedef struct taglinked{
	node *pHead, *pTail;
}linked;
//-----------------------------------------------------
void createList(linked &); 
node *createNode(int);    
void insertTail(linked &, node *);    
void insertNodeGT(linked &);

void displayList(linked);    
void deleteList(linked &);     
//-----------------------------------------------------
main(){
	int songuyen, soNode;
	node *tempNode;
	linked list;
	createList(list);

	cout<<"Nhap so node cua danh sach lien ket  ";
	cin>>soNode;

	for (int i=1 ; i<= soNode; i++){
		cout<<"Nhap so nguyen "<<endl;
		cin>>songuyen;
		tempNode = createNode(songuyen);
		insertTail(list,tempNode);
	}
	cout<<"Day so vua nhap"<<endl;
	displayList(list);

	cout<<"Chen node theo gia tri"<<endl;
	insertNodeGT(list);
	
	deleteList(list);
	system("pause");
	return 0;
}
//-----------------------------------------------------
void createList(linked &list){
	list.pTail = list.pHead =  NULL;
}
//-----------------------------------------------------
node *createNode(int songuyen){
	node *pnode;
	if ( (pnode=new(node))== NULL){
		cout<<"Khong du bo nho"<<endl;
		return 0;
	}
	else{
		pnode->songuyen=songuyen;
		pnode->pnext=NULL;
		return pnode;
	}
}
//-----------------------------------------------------
void insertTail(linked &list, node *tempnode){
	if (list.pHead == NULL){
		list.pHead = list.pTail = tempnode;
	}
	else {
		list.pTail->pnext = tempnode;
		list.pTail = tempnode;
	}
}
//-----------------------------------------------------
void displayList(linked list){
	if (list.pHead == NULL){
		cout<<"Danh sach rong"<<endl;
		return;
	}
	for (node *p = list.pHead ; p ; p=p->pnext) cout<<p->songuyen<<'	'; // co the thay p != NULL = p
	cout<<endl;
}
//-----------------------------------------------------
void deleteList(linked & list){
	if (list.pHead == NULL){
		cout<<"Danh sach rong"<<endl;
		return;
	}
	while (list.pHead != NULL ){
	node *p = list.pHead;
	list.pHead = list.pHead->pnext;
	delete p;
	}
}
//-----------------------------------------------------
void insertNodeGT(linked &list ){   
	int check =0;
	if (list.pHead == NULL){
		cout<<"Danh sach rong"<<endl;
		return;
	}
	int data, giatri;
	cout<<"Nhap data cho node can chen ";
	cin>>data;
	node *tempnode= createNode(data);
	cout<<"Nhap gia tri node (chen sau node nay) ";
	cin>>giatri;

	for (node *p = list.pHead; p;){
	if ( p->songuyen == giatri){
		check =1;
		tempnode->pnext = p->pnext;
		p->pnext = tempnode;
		p=tempnode->pnext;
		if ( p == list.pTail ) list.pTail = tempnode;
	}
	else p = p->pnext;
	}
	if (check == 0) cout<<"Gia tri "<<giatri<<" khong nam trong day"<<endl;
	else displayList(list);
}
Pham Van Hai viết 20:52 ngày 30/09/2018

Cái sai của bạn là bạn chỉ có tạo 1 node chứa data mà lại chèn vào nhiều vị trí có cùng giatri. Nó giống như bạn có 1 cái kẹo, mà cho chia cho 2 người vậy, bạn chỉ có thể cho một người thôi.
Trong trường hợp của bạn có 2 giải pháp:

  • Chỉ chèn vào vị trí tìm thấy giatri đầu tiên (theo mình đang là cách làm đúng).
  • Tạo ra nhiều node chứa data cho mỗi lần chèn vào vị trí tìm thấy giatri.
abcxyz viết 20:59 ngày 30/09/2018

@@ nghĩa là node mà đã dùng để chèn xong thì nó mất luôn hả bạn ??? mình tưởng nó chỉ lấy bản sao đi chèn, vào , ra là thế , mình hiểu rồi, cảm ơn bạn nhiều, cái này mình đọc trong tài liệu k có nói, mình có chú ý đến tham biến, tham chiếu, tham trị, giờ mới chú ý thấy node là con trỏ, tks bạn

Bài liên quan
0