Nhảy tới nội dung

Các phép toán trên danh sách liên kết các số nguyên

Các phép toán cơ bản​

deleteList​

Yêu cầu

Xóa phần tử có Position P.

void deleteList(Position P, List *pL)
{
Position Temp;
if (P->Next != NULL)
{
Temp = P->Next;
P->Next = Temp->Next;
free(Temp);
}
}

emptyList​

Yêu cầu

Kiểm tra danh sách rỗng.

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

endList​

Yêu cầu

Trả về vị trí sau vị trí cuối cùng của danh sách L.

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

first​

Yêu cầu

Trả về vị trí đầu tiên của danh sách L.

Position first(List L)
{
return L;
}

insertList​

Yêu cầu

Chèn thêm phần tử vào vị trí P.

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

locate​

Yêu cầu

Trả về vị trí đầu tiên của x trong danh sách L.

Position locate(ElementType x, List L)
{
Position P = L;
while (P->Next != NULL)
{
if (P->Next->Element == x)
return P;
P = P->Next;
}
return P;
}

makenullList​

Yêu cầu

Khởi tạo danh sách rỗng.

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

myLocate​

Yêu cầu

Trả về vị trí thứ i của phần tử x trong danh sách L.

Position myLocate(ElementType x, int i, List L)
{
Position P = L;
int count = 0;
while (P->Next != NULL)
{
if (P->Next->Element == x)
count++;
if (count == i)
return P->Next;
P = P->Next;
}
return P->Next;
}

next​

Yêu cầu

Trả về vị trí tiếp theo của P.

Position next(Position P, List L)
{
return P->Next;
}

previous​

Yêu cầu

Trả về vị trí trước P.

Position previous(Position P, List L)
{
Position Q = L;
while (Q->Next->Next != NULL)
{
if (Q->Next->Next == P)
Q = Q->Next;
}
return Q->Next;
}

retrieve​

Yêu cầu

Trả về giá trị của phần tử có vị trí P.

ElementType retrieve(Position P, List L)
{
if (P->Next != NULL)
return P->Next->Element;
}

Các phép toán khác​

addFirst​

Yêu cầu

Thêm phần tử vào đầu danh sách.

void addFirst(ElementType x, List *pL)
{
Position P;
P = (Position)malloc(sizeof(struct Node));
P->Element = x;
P->Next = (*pL)->Next;
(*pL)->Next = P;
}

append​

Yêu cầu

Thêm phần tử vào cuối danh sách

void append(ElementType x, List *pL)
{
Position P = endList(*pL);
Position T = (Position)malloc(sizeof(struct Node));
T->Element = x;
T->Next = NULL;
P->Next = T;
}

copyEvenNumbers​

Yêu cầu

Sao chép số chẵn trong danh sách.

void copyEvenNumbers(List L, List *pL)
{
makenullList(pL);
Position P = L;
while (P->Next != NULL)
{
if (P->Next->Element % 2 == 0)
append(P->Next->Element, pL);
P = P->Next;
}
}

deleteX​

Yêu cầu

Xóa phần tử x.

void deleteX(ElementType x, List *pL)
{
Position P = first(*pL);
while (P != endList(*pL))
{
if (retrieve(P, *pL) == x)
deleteList(P, pL);
else
P = next(P, *pL);
}
}

difference​

Yêu cầu

Tìm tập hiệu.

List difference(List L1, List L2)
{
List L;
makenullList(&L);
Position P = L1;
while (P->Next != NULL)
{
if (!member(P->Next->Element, L) && !member(P->Next->Element, L2))
append(P->Next->Element, &L);
P = P->Next;
}
return L;
}

erase​

Yêu cầu

Xóa phần tử x đầu tiên.

void erase(ElementType x, List *pL)
{
if (locate(x, *pL)->Next != NULL)
deleteList(locate(x, *pL), pL);
}

getAvg​

Yêu cầu

Tính trung bình cộng của danh sách.

float getAvg(List L)
{
float sum = 0;
int length = 0;
Position P = L;
if (P->Next == NULL)
return -10000;
while (P->Next != NULL)
{
sum += P->Next->Element;
length++;
P = P->Next;
}
return sum / length;
}

intersection​

Yêu cầu

Tìm tập giao của hai tập.

List intersection(List L1, List L2)
{
List L;
makenullList(&L);
Position P = L2;
while (P->Next != NULL)
{
if (!member(P->Next->Element, L) && member(P->Next->Element, L1))
append(P->Next->Element, &L);
P = P->Next;
}
return L;
}

member​

Yêu cầu

Kiểm tra một giá trị có trong danh sách không.

int member(ElementType x, List L)
{
Position P = L;
while (P->Next != NULL)
{
if (P->Next->Element == x)
return 1;
P = P->Next;
}
return 0;
}

normalize​

Yêu cầu

Xóa các phần tử trùng giá trị.

void normalize(List *pL)
{
Position P = *pL, Q;
while (P->Next != NULL)
{
Q = P->Next;
while (Q->Next != NULL)
{
if (Q->Next->Element == P->Next->Element)
deleteList(Q, pL);
Q = Q->Next;
}
P = P->Next;
}
}

printList​

Yêu cầu

In danh sách.

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

printOddNumbers​

Yêu cầu

In các số lẻ trong danh sách.

void printOddNumbers(List L)
{
Position P = L;
while (P->Next != NULL)
{
if (P->Next->Element % 2 != 0)
printf("%d ", P->Next->Element);
P = P->Next;
}
printf("\n");
}

readSet​

Yêu cầu

Nhập tập hợp.

List readSet()
{
List L;
makenullList(&L);
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
if (!member(x, L))
addFirst(x, &L);
}
return L;
}

removeAll​

Yêu cầu

Xóa tất cả các phần tử có giá trị x.

void removeAll(ElementType x, List *pL)
{
while (locate(x, *pL)->Next != NULL)
deleteList(locate(x, *pL), pL);
}

readList​

Yêu cầu

Nhập danh sách.

void readList(List *pL)
{
makenullList(pL);
int n;
Position P = *pL,
N;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
N = (Position)malloc(sizeof(struct Node));
scanf("%d", &N->Element);
P->Next = N;
P = P->Next;
}
}

sort​

Yêu cầu

Sắp xếp danh sách.

void sort(List *pL)
{
Position P = *pL,
N;
while (P->Next != NULL)
{
N = P->Next;
while (N->Next != NULL)
{
:::info Yêu cầu
if (P->Next->Element N->Next->Element)
:::
{
ElementType Temp = P->Next->Element;
P->Next->Element = N->Next->Element;
N->Next->Element = Temp;
}
N = N->Next;
}
P = P->Next;
}
}

unionSet​

Yêu cầu

Gộp 2 tập hợp.

List unionSet(List L1, List L2)
{
List L;
makenullList(&L);
Position P = L1;
while (P->Next != NULL)
{
if (!member(P->Next->Element, L))
append(P->Next->Element, &L);
P = P->Next;
}
P = L2;
while (P->Next != NULL)
{
if (!member(P->Next->Element, L))
append(P->Next->Element, &L);
P = P->Next;
}
return L;
}