Bài 2. Danh sách liên kết
Mô hình
💡 MẸO
Bạn có thể tham khảo và thực hành theo mô hình Linked List
tại đây
Lý thuyết
Source Code
linkedList.h
CẤU TRÚC
struct NODE{
int data;
struct NODE* Next;
};
typedef struct NODE Node;
typedef struct{
Node *Head;
Node *Tail;
int Size;
}List;
KHỞI TẠO RỖNG
void makeNullList(List *L){
L->Head = NULL;
L->Tail = NULL;
L->Size = 0;
}
HIỂN THỊ DANH SÁCH
void displayList(List L){
Node *temp = L.Head;
while(temp != NULL){
printf("%d ",temp->data);
temp = temp->Next;
}
printf("\n");
printf("Size = %d",L.Size);
printf("\n");
}
TẠO MỘT NODE VỚI PHẦN TỬ
Node *createNode(int x){
Node *newnode = (Node *)malloc(sizeof(Node));
newnode->data = x;
newnode->Next = NULL;
return newnode;
}
THÊM NODE VÀO ĐẦU HOẶC CUỐI DANH SÁCH
void insertList_Frist(Node *newNode,List *L){
if(L->Head == NULL){
L->Head = newNode;
L->Tail = newNode;
}
else{
newNode->Next = L->Head;
L->Head = newNode;
}
L->Size++;
}
void insertList_End(Node *newNode,List *L){
if(L->Head == NULL){
L->Head = newNode;
L->Tail = newNode;
}
else{
L->Tail->Next = newNode;
L->Tail=newNode;
newNode->Next = NULL;
}
L->Size++;
}
THÊM NODE VÀO VỊ TRÍ P TRONG DANH SÁCH
void insertList_byPos(int p,Node *newNode,List *L){
if(p < 1 || L->Head == NULL){
insertList_Frist(newNode,L);
}
else if(p >= L->Size){
insertList_End(newNode,L);
}
else{
Node *temp = L->Head;
int i = 0;
while(temp != NULL){
if(p - 1 == i){
newNode->Next = temp->Next;
temp->Next = newNode;
L->Size++;
return;
}
i++;
temp = temp->Next;
}
}
}
THÊM N NODE VÀO DANH SÁCH
void inputList(int n,List *L){
int x;
Node *temp;
for (int i = 0; i < n; i++){
scanf("%d",&x);
temp = createNode(x);
insertList_byPos(i,temp,L);
}
}
KIỂM TRA X TRONG DANH SÁCH
int memberList(int x,List L){
Node *temp = L.Head;
while (temp != NULL){
if(temp->data == x){
return 1;
}
temp = temp->Next;
}
return 0;
}
TÌM VỊ TRÍ NODE CHỨA X
int locateList(int x,List L){
Node *temp = L.Head;
int i = 0;
while (temp != NULL){
if(temp->data = x){
free(temp);
return i;
}
else{
i++;
}
temp = temp->Next;
}
free(temp);
return -1;
}
XOÁ NODE CÓ VỊ TRÍ P TRONG DANH SÁCH
void deleteList_byPos(int p,List *L){
Node *temp = L->Head;
Node *prev = NULL;
int i = 0;
while (temp != NULL) {
if(p == i){
if (prev==NULL) {
L->Head=temp->Next;
}
else{
prev->Next=temp->Next;
}
L->Size--;
return;
}
else{
i++;
}
prev = temp;
temp = temp->Next;
}
}
XOÁ NODE TRONG DANH SÁCH
void deleteList_byNode(Node* newNode,List *L){
int i = 0;
Node *temp = L->Head;
while (temp != NULL){
if(newNode == temp){
deleteList_byPos(i,L);
}
else{
i++;
}
temp = temp->Next;
}
}
XOÁ NODE CÓ PHẦN TỬ X TRONG DANH SÁCH
void deleteList_byValue(int x,List *L){
Node *temp = L->Head;
int i = 0;
while (temp != NULL){
if(temp->data == x){
deleteList_byPos(i,L);
}
else{
i++;
}
temp = temp->Next;
}
}
TỐI ƯU DANH SÁCH (`1 2 1` -> `1 2`)
void optimizeList(List *L){
Node *temp1 = L->Head;
Node *temp2 = NULL;
while (temp1->Next != NULL){
temp2 = temp1->Next;
while (temp2 != NULL){
if(temp1->data == temp2->data){
deleteList_byNode(temp2,L);
}
temp2 = temp2->Next;
}
temp1 = temp1->Next;
}
}
TÌM NODE CÓ PHẦN TỬ LỚN NHẤT HOẶC NHỎ NHẤT
int Find_Max(List L){
Node *temp=L.Head;
int max=temp->data;
while (temp!=NULL) {
if(max<temp->data){
max=temp->data;
}
temp=temp->Next;
}
free(temp);
return max;
}
int Find_Min(List L){
Node *temp=L.Head;
int min=temp->data;
while (temp!=NULL) {
if(min>temp->data){
min=temp->data;
}
temp=temp->Next;
}
free(temp);
return min;
}
CHUYỂN SANG DANH SÁCH KHÁC
void changeList(List L1,List *L){
Node *temp = L1.Head;
int i = L->Size;
while (temp != NULL){
insertList_byPos(i,createNode(temp->data),L);
i++;
temp = temp->Next;
}
}
GỘP 2 DANH SÁCH THÀNH 1 DANH SÁCH
void mergeList(List L1,List L2,List *L){
changeList(L1,L);
changeList(L2,L);
}
LỌC SỐ CHẴN HOẶC LẺ QUA DANH SÁCH KHÁC
void filter_evenNumber(List L1, List *L){
Node *temp = L1.Head;
int i = L->Size;
while (temp != NULL){
if(temp->data % 2 == 0){
insertList_byPos(i,createNode(temp->data),L);
}
i++;
temp = temp->Next;
}
}
void filter_oddNumber(List L1, List *L){
Node *temp = L1.Head;
int i = L->Size;
while (temp != NULL){
if(temp->data % 2 != 0){
insertList_byPos(i,createNode(temp->data),L);
}
i++;
temp = temp->Next;
}
}
TÍNH TỔNG TRUNG BÌNH PHẦN TỬ TRONG DANH SÁCH
double averageList(List L){
Node *temp = L.Head;
double result = 0;
while (temp != NULL){
result += temp->data;
temp = temp->Next;
}
return result/L.Size;
}
sentenceList.h
CẤU TRÚC
struct NODE{
char Word;
struct NODE *Next;
};
typedef struct NODE Node;
typedef struct{
Node *Head;
Node *Tail;
int Size;
}Sentence;
TẠO RỖNG CÂU
void makeNullSentence(Sentence *S){
S->Head = NULL;
S->Tail = NULL;
S->Size = 0;
}
HIỂN THỊ CÂU
void displaySentence(Sentence S){
Node *temp = S.Head;
while(temp != NULL){
printf("%c",temp->Word);
temp = temp->Next;
}
printf("Size = %d",S.Size);
printf("\n");
}
TẠO MỘT NODE X LÀ TỪ
Node *createNode(char c){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->Word = c;
newNode->Next = NULL;
return newNode;
}
CHÈN MỘT TỪ VÀO ĐẦU HOẶC CUỐI CÂU
void insertSentence_Frist(Node *newNode,Sentence *S){
if(S->Head == NULL){
S->Head = newNode;
S->Tail = newNode;
}
else{
newNode->Next = S->Head;
S->Head = newNode;
}
S->Size++;
}
void insertSentence_End(Node *newNode,Sentence *S){
if(S->Head == NULL){
S->Head = newNode;
S->Tail = newNode;
}
else{
S->Tail->Next = newNode;
S->Tail=newNode;
newNode->Next = NULL;
}
S->Size++;
}
CHÈN TỪ VỊ TRÍ P TRONG CÂU
void insertSentence_byPos(int p,Node *newNode,Sentence *S){
if(p < 1 || S->Head == NULL){
insertSentence_Frist(newNode,S);
}
else if(p >= S->Size){
insertSentence_End(newNode,S);
}
else{
Node *temp = S->Head;
int i = 0;
while(temp != NULL){
if(p - 1 == i){
newNode->Next = temp->Next;
temp->Next = newNode;
S->Size++;
return;
}
i++;
temp = temp->Next;
}
}
}
NHẬP CÂU
void inputSentence(Sentence *S){
char c[100];
fgets(c,100,stdin);
int len = strlen(c);
Node *temp;
for(int i = 0 ; i < strlen(c) ; i++){
temp = createNode(c[i]);
insertSentence_byPos(i,temp,S);
}
}
KIỂM TRA TỪ X CÓ TRONG CÂU
int memberSentence(char x,Sentence S){
Node *temp = S.Head;
while (temp != NULL){
if(temp->Word == x){
return 1;
}
temp = temp->Next;
}
return 0;
}
TÌM VỊ TRÍ TỪ X TRONG CÂU
int locateSentence(char x,Sentence S){
Node *temp = S.Head;
int i = 0;
while (temp != NULL){
if(temp->Word == x){
return i;
}
else{
i++;
}
temp = temp->Next;
}
return -1;
}
XOÁ TỪ VỊ TRÍ P TRONG CÂU
void deleteSentence_byPos(int p,Sentence *S){
Node *temp = S->Head;
Node *prev = NULL;
int i = 0;
while (temp != NULL) {
if(p == i){
if (prev==NULL) {
S->Head=temp->Next;
}
else{
prev->Next=temp->Next;
}
S->Size--;
return;
}
else{
i++;
}
prev = temp;
temp = temp->Next;
}
}
XOÁ TỪ X TRONG CÂU
void deleteSentence_byValue(char x,Sentence *S){
Node *temp = S->Head;
int i = 0;
while (temp != NULL){
if(temp->Word == x){
deleteSentence_byPos(i,S);
}
else{
i++;
}
temp = temp->Next;
}
}
XOÁ MỘT NODE TRONG CÂU
void deleteSentence_byNode(Node *newNode,Sentence *S){
int i = 0;
Node *temp = S->Head;
while (temp != NULL){
if(newNode == temp){
deleteSentence_byPos(i,S);
}
else{
i++;
}
temp = temp->Next;
}
}
XOÁ KHOẢNG TRẮNG DƯ THỪA
void deleteWhiteSpace(Sentence *S){
Node *temp = S->Head;
while(isspace(temp->Word)){
deleteSentence_byNode(temp,S);
temp = temp->Next;
}
while(temp != NULL){
if(isspace(temp->Word) && temp->Next != NULL){
if(isspace(temp->Next->Word)){
deleteSentence_byNode(temp,S);
}
}
temp = temp->Next;
}
}
CHUẨN HOÁ CÂU
void normalizeSentence(Sentence *S){
deleteWhiteSpace(S);
Node *temp = S->Head;
if(islower(temp->Word)){
temp->Word -= 32;
}
temp = temp->Next;
while (temp != NULL){
while(!isspace(temp->Word)){
if(isupper(temp->Word)){
temp->Word += 32;
}
temp = temp->Next;
}
if(isspace(temp->Word) && temp->Next != NULL){
temp = temp->Next;
if(islower(temp->Word)){
temp->Word -= 32;
}
}
temp = temp->Next;
}
}