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);
}
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ùnggiatri
. 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:
giatri
đầu tiên (theo mình đang là cách làm đúng).data
cho mỗi lần chèn vào vị trí tìm thấygiatri
.@@ 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