Tìm hợp của 2 tập hợp bằng ngôn ngữ C (danh sách liên kết)

Bài toán này yêu cầu khi nhập 2 danh sách thì in ra 2 danh sách đó, phần tử nào xuất hiện nhiều lần thì chỉ in một lần, sau đó là in tập hợp hợp của 2 danh sách (hình minh họa). Đây là bài toán trên trang học liệu của đại học Cần Thơ. Mình chỉ giải được phần tìm hợp thôi, còn phần mà in phần tử không trùng nhau thì chưa biết làm thế nào?.

Đây là cấu trúc danh sách liên kết mình cài đặt:

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node{
	ElementType Element;
	struct Node* Next;
}Node;

typedef Node* Position;
typedef Position List;

void makenullList(List *Header){
	(*Header) = (Node*)malloc(sizeof(Node));
	(*Header)->Next = NULL;
};

int emptyList(List L){
	return (L->Next==NULL);
}

void insertList(ElementType X, Position P, List *L){
	Position T;
	T = (Node*)malloc(sizeof(Node));
	T->Next = P->Next;
	T->Element = X;
	P->Next = T;
}

void deleteList(Position P, List *L){
	Position T;
	if(P->Next!=NULL){
		T = P->Next;
		P->Next = T->Next;
		free(T);
	}
	else{
		printf("\nLoi! Danh sach rong khong the xoa");
	}
}

Position locate(ElementType X, List L){
	if(L==NULL || L->Next==NULL){
		return NULL;
	}

	Position P = L;
	while(P->Next!=NULL){
		if(P->Next->Element==X){
			return P->Next;
		}
		P = P->Next;
	}
	return NULL;
}

ElementType retrieve(Position P, List L){
	if(P->Next!=NULL){
		return P->Next->Element;
	}
	else{
		printf("\nVi tri khong hop le");
	}
    return -1;
}

int firstList(List L){
	return 1;
}

Position endList(List L){
	if(L==NULL || L->Next==NULL){
		return L;
	}
	Position P;
	P = L;
	while(P->Next!=NULL){
		P = P->Next;
	}
	return P;
}

void readList(List *L){
	ElementType X;
	int n;
	printf("\nNhap so phan tu co trong danh sach: ");
	scanf("%d", &n);
	for(int i = 1; i<=n; i++){
		printf("Nhap phan tu thu %d: ", i);
		scanf("%d", &X);
		insertList(X, endList(*L), L);
	}
}

void printList(List L){
	if(L==NULL || L->Next==NULL){
		printf("\nDanh sach rong");
		return;
	}

	Position P = L->Next;
	while(P!=NULL){
		printf("%d ", P->Element);
		P = P->Next;
	}
	printf("\n");
}

Bạn dùng 2 for lồng *p *q, for trong thì duyệt q->Next->Element.

2 Likes

Cảm ơn bạn, để mình thử xem

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