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");
}