Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 19

1.

Khởi tạo danh sách trống

Yêu cầu : tạo một danh sách rỗng

Thao tác

Khởi tạo node.

Khởi tạo danh sách trống bằng cách gán Null cho node đầu và cuối.

Code:

struct SNode

int Info;

SNode* Next;

};

struct SList

SNode* head;

SNode* tail;

};

void initSlist(SList &sl)

sl.head = NULL;

sl.tail = NULL;

2.Thêm phần tử có khóa x vào danh sách

Yêu cầu thêm phần tử x vào danh sách

Thao tác

Kiểm tra danh sách có rỗng hay không

Nếu danh sách không rỗng thì có 2 trường hợp

Th1 chèn vào đầu danh sách

Nếu node đầu tiên có khóa lớn hơn x, node mới sẽ trở thành nốt đầu tiên cập nhât head của danh
sách để con trỏ tới node mới

Th2 chèn sau 1 node

Cập nhật next của node trước node mới để con trỏ đến note mới.
Code

th1

Void addhead(SList & sl, Node*node)

If( sl.head == NULL)

sl.head= node;

sl.tail= node;

Else

node -> next = sl.head ;

sl.head = node ;

};

Th2

void InsertAfterQ(SList& sl, Node* p, Node* q)

if (q != NULL)

p->next = q->next;

q->next = p;

};

3.Xóa toàn bộ danh sách


Yêu cầu xóa toàn bộ node

Thao tác

Kiểu tra lần lượt tất cả các node khác null thì xóa đi

Code

Int xoanodedau(Slist&sl , int &x)

If (sl.head != NULL)

Node* node = sl.head;

x = node->data;

l.head = node->next;

delete node;

if (sl.head == NULL)

sl.tail = NULL;

return 1;

return 0;

}
Void xoadanhsach(Slist&sl)

Int s;

Node * node =sl.head;

While(node != NULL)

Xoanodedau(sl,x);

Node =sl.head;

Sl.tail= NULL;

4.Sắp xếp danh sách

Yêu cầu sắp xếp

Thao tác

So sánh từng node và hoán vị

Code

void sapxep(node** head) {

for (node* i = *head; i != NULL; i = i->next) {


node* minNode = i;

for (node* j = i->next; j != NULL; j = j->next) {

if (minNode->data > j->data) {

minNode = j;

else if ( minNode ->data == j->data) {

if (minNode->data > j->data) {

minNode = j;

int tmp = minNode->data;

minNode->data = i->data;

i->data = tmp;

5. in toàn bộ danh sách


Yêu cầu in toàn bộ danh sách

Thao tác

Tạo danh sách liên kết duyệt từ phần tử đầu tới cuối vào in ra

Code

void duyet(node* head) {

while (head != NULL) {

cout << head->data << ' ' ;

head = head->next;

6. Đếm số phần tử danh sách liên kết

Yêu cầu đếm xem trong danh sách có bao nhiêu phần tử

Thao tác

Tạo 1 vòng lâp for và 1 biến đếm ban đầu đc gán giá trị bằng không mỗi lần chạy for biến đếm cộng
thêm 1

Code

Void dem(Slist sl)

{
Int dem = 0;

For (node*k= sl.head; k!=NULL; k= k-> link)

Cout<<”pt thu %d = %d”<<’i,k->data’endl;

If(k->next != NULL)

i++;

7. Thêm phần tử x vào danh sách vẫn theo thứ tự tăng dần

Thao tác

Lập một danh sách thêm phần tử x và sắp xếp tăng dần

Code

node AddHead(node head, int x ){


node temp = CreateNode(x);

if(head == NULL){
head = temp;
}else{
temp->next = head;

head = temp; }
return head;
}

void sapxep(node** head) {

for (node* i = *head; i != NULL; i = i->next) {

node* minNode = i;

for (node* j = i->next; j != NULL; j = j->next) {

if (minNode->data > j->data) {

minNode = j;

else if ( minNode ->data == j->data) {

if (minNode->data > j->data) {

minNode = j;

int tmp = minNode->data;

minNode->data = i->data;
i->data = tmp;

8. Trộn 2 danh sách có thứ tự tăng dần thành 1

Thao tác

Trộn 2 danh sách thành danh sách thứ 3 và sắp xếp danh sách thứ 3

Code

void sapxep(node** head) {

for (node* i = *head; i != NULL; i = i->next) {

node* minNode = i;

for (node* j = i->next; j != NULL; j = j->next) {

if (minNode->data > j->data) {

minNode = j;

else if ( minNode ->data == j->data) {

if (minNode->data > j->data) {

minNode = j;

}
}

int tmp = minNode->data;

minNode->data = i->data;

i->data = tmp;

Void tron(SList &s1, Slist&s2, Slist&s3)

s3.head=s1.head;

s1.tail->next=s2.head;

s3.tail=s2.tail;

sapxep(Slist&s3);

9.kiểm tra danh sách rỗng

Yêu cầu kiểm tra từng phần tử nếu có thì danh sách ko rỗng và ngược lại

Thao tác
Kiểm tra nếu con trỏ đầu danh sách là null thì danh sách rỗng

Code

void isEmpty(Slist s1)

If(sl.head == NULL)

Cout<<’’Danh sach rong ‘’<< endl;

Else

Cout<<’’Danh sach khong rong’’ << endl;

Return 0 ;

10.Xóa phần tử có khóa x khỏi danh sách

Yêu cầu

xóa phần tử x ra khỏi danh sách

Thao tác

Tìm kiếm phần tử x

Xóa và cập nhật danh sách

Code
Position Locate(ElementType X, SList sL)

Position P; int Found = 0; P = sL;

while ((P->Next != NULL) && (Found == 0))

if (P->Next->Element == X)

Found = 1;

else

P = P->Next; return P;

Delete_List(Position P, SList *sL)

{ Position Temp;

if (P->Next!=NULL)

Temp=P->Next;

P->Next=Temp->Next;

free(Temp);

11.Tìm vị trí có khóa x trong danh sách


Yêu cầu tìm phần khóa ít trong danh sách

Thao tác

So sánh phần tử với x cho tới khi tìm ra nếu không thì x không tồn tại trong x

Code

Position Locate(ElementType X, SList sL)

Position P; int Found = 0; P = sL;

while ((P->Next != NULL) && (Found == 0))

if (P->Next->Element == X)

Found = 1;

else

P = P->Next; return P;

12.Duyệt danh sách

Thao tác

Ta duyệt danh sách từ đầu đén cuối và in ra

Code

Void processList(sList &sI)


{

Node*p;

P=sl.head;

While(p!= NULL)

Cout<<’’p->info’’<<endl;

P=p->next;

13. Tìm phần tử lớn nhất trong danh sách

Yêu cầu

Tìm gán trị max trong danh sách

Thao tác

Gán giá trị đầu là max

Lần lượt so sánh nếu lớn hơn max gán thành max nhỏ hơn tiếp tục so sánh

Code

Int findmax(Node*head)

Int max=head->data ;
Node*current=head->next;

While(current!=NULL)

If(current->data>max)

Max= current->data;

Current=curent->next;

Return max;

14.Xuất các phần tử ở vị trí lẻ

Thao tác

duyệt qua danh sách bằng 1 biến đếm

Kiểm tra biến chẵn lẻ

In ra các phần tử vị trí lẻ

Code
Int isEven(int position)

Return position % 2 == 0;

Void printfevenodd(Node*head)

Int position = 1;

Node*current= head;

While(current != NULL)

If(isEven(position))

PrintNode(current);

Position++;

Current=current->next;

}
15. Xóa các phân tử trùng nhau trong danh sách

Thao tác

Duyệt qua danh sách đơn

Cho mỗi phần tử kiểm tra có đc lưu chưa nếu chưa thì lưu nếu có rồi thì bỏ qua

Code

Typedef struct Node

In data;

Struct Node*next;

}Node;

Node*createNode(int data)

Node*newNode=(Node*)mailloc(sizeof(Node));

NewNode->data = data;

NewNode->next = NUll;

Return newNote;

Void printList(Node*head)
{

Node*temp = head;

While(temp != NULL)

Cout<<”%d”<<’ temp->data’ endl;

Temp= temp->next;

Cout<<” “<<endl;

You might also like