Không có 2 mã trùng nhau trong danh sách liên kết đơn

Em đang làm bài tập nhóm về danh sách liên kết đơn và đang bị bí ở đoạn không có 2 mã trùng nhau này. Ý tưởng em nghĩ là dùng 1 hàm kiểm tra điều kiện khi nhập vào nhưng nó lại bị lỗi nên em xin phép được tham khảo cách tạo hàm kiểm tra của mọi người ạ

struct HoDan
{
    int ma;
    string ten;
    int thvien;
    float thunhap;
};
typedef struct HoDan hodan;
struct Node
{
    hodan *data;
    struct  Node* pNext;
};
typedef struct Node node;
struct List {
	node* pHead;
	node* pTail;
};
typedef struct List list;
void CreateList(list &li) {
	li.pHead=li.pTail=NULL;
}
void Set(hodan *ho) 
{
	cout<<"\nNhap ma ho: ";
	cin>>ho->ma;
	cin.ignore();
	cout<<"\nNhap ten chu ho: ";
	getline(cin, ho->ten);
	cout<<"\nNhap so thanh vien: ";
	cin>>ho->thvien;
	cout<<"\nNhap muc thu nhap: ";
	cin>>ho->thunhap;
}
node *CreateNode() 
{
	hodan* ho = new hodan;
	Set(ho);
	node* p = new node;
	if (p == NULL) {
		cout << "\nDay bo nho!";
		return 0;
	}
	p->data = ho;
	p->pNext = NULL;
	return p;
}
void AddFirst(List &li, node *p) 
{
	if (li.pHead == NULL) {
		li.pHead = li.pTail= p;//=>node cuoi = node dau
	}
	else {
		p->pNext = li.pHead;
		li.pHead = p;
	}
}
void AddLast(List &li, node *p) 
{
	if (li.pHead == NULL) {
		li.pHead = li.pTail= p;
	}
	else {
		for(node *k=li.pHead;;k=k->pNext){
			if(k->pNext==NULL){//ktra xem node co lien ket voi null khong
				k->pNext=p;//=>k la node cuoi
				break;
			}
		}
	}
}

//ham xuat thong tin 1 ho dan
void ShowNode(node *k) 
{
	cout<<"\nMa ho: "<<k->data->ma;
	cout<<"\nTen chu ho: "<<k->data->ten;
	cout<<"\nSo thanh vien: "<<k->data->thvien;
	cout<<"\nMuc thu nhap: "<<k->data->thunhap;
	cout<<endl;
}

hàm đó đâu? và lỗi như thế nào?

3 Likes

Em tính xét duyệt dữ liệu trong từng node sẵn có như này

void kiemtra(List li, node *p){
 for (node* k = li.pHead; k != NULL; k = k->pNext) {
	if(k->data->ma != ma) {
		AddFirst(li, p);

Nhưng nó bị lỗi nếu danh sách đang rỗng thì chương trình chạy bị đứng luôn em không biết làm cách nào để tránh ạ

bạn đã biết vấn đề, vậy thì xử nó thôi

nếu rỗng thì lỗi => sửa lại, danh sách rỗng thì không cần chạy mà báo kết quả false luôn

bool isExist(....) {
    if (điều kiện danh sách rỗng) return false; // danh sách rỗng thì chắc chắn là không trùng rồi

    // qua được câu if ở trên thì chắc chắn là không rỗng
    loop ... { // lần lượt lặp từng phần tử
         if (trùng) return true;
    }

    // kiểm tra hết rồi mà chưa thấy trùng thì kết quả là false (trùng thì đã return và không chạy tới đây) 
    return false;
}

bạn có thể đặt tên hàm tiếng Việt nhưng nên tạo thói quen dùng tên cho rõ nghĩ, ghi kiểm tra thì người ta không biết là kiểm tra gì, và cũng không biết là true/false có ý nghĩa là gì
ví dụ trên isExist = true thì dễ dàng hiểu là kết quả kiểm tra: phần tử có tồn tại trong danh sách

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