Mang đến cho bạn hành trang là Kiến thức và Kinh nghiệm

Lựa chọn chủ đề bạn quan tâm

Cùng nhau thảo luận về các vấn đề

Hãy theo dõi chúng tôi nếu bạn thấy bổ ích

  1. Hỏi đáp IT
  2. Hỏi nhanh

Nhờ mọi người giải thích cho em bài này với ạ!

335 Lượt xem 8 Bình luận 0 Lượt báo xấu
Nhờ mọi người giải thích cho em bài này với ạ!
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

// Khai bao kieu du lieu.
typedef struct NODE
{
	int info; //dữ liệu chứa trong một node
	NODE *next; // Con tro dùng để liên kết giữa các node
};
//===============
// Ham doc danh sach noi don kieu LIFO
void TaoLIFO(NODE *&first)
{
	FILE *file;
	NODE *p;
	errno_t filein;
	filein = fopen_s(&file, "D:/input.txt", "rt");
	if (file == NULL)
	{
		printf("Loi mo file");
		return;
	}

	/*
	tạo 1 node mới , lấy thông tin của file nhập vào node mới , thêm node đó vào đầu danh sách nếu danh sách rỗng.
	*/
	while (feof(file) == 0)
	{
		p = new NODE;// tạo mới một node
		fscanf_s(file, "%3d", &p->info);
		if (first == NULL)
		{
			first = p;
			p->next = NULL;
		}
		else
		{
			p->next = first;
			first = p;
		}
	}
	fclose(file);
}
//================
// Ham xem danh sach sau khi da doc tep
void Display(NODE *&first)
{
	NODE *p;
	p = first;
	while (p != NULL)
	{
		printf("%5d ", p->info);
		p = p->next;
	}
}
// Ham sap xep danh sach
void Swap(NODE *&first)
{
	NODE*P, *Q;
	int TG;
	for (P = first; P->next != NULL; P = P->next)
	for (Q = P->next; Q != NULL; Q = Q->next)
	if (P->info > Q->info)
	{
		TG = P->info;
		P->info = Q->info;
		Q->info = TG;
	}

}
//========
/*
Ham bo sung phan tu sao cho khong lam mat tinh
tăng dần của danh sach.
*/
NODE *addLifo(NODE *first)
{
	NODE *x, *p = first;// tao mot node p để duyệt danh sách first
	x = new(NODE);// cấp phát vùng nhớ cho x
	printf("\nNhap phan tu can them vao : ");
	scanf_s("%d", &x->info);
	while ((p->next != NULL) && (p->next->info < x->info)) // neu trương next trỏ đến mà khác null
		p = p->next; // cho p trỏ đến vị trí tiếp theo
	if (p == first)
	{
		x->next = p;
		return x;
	}
	x->next = p->next;// gán x của node mới bằng địa chỉ cả node sau p
	p->next = x;// cập nhật lại next  của node p trỏ đến trên node mới
	return first;
}

//=================
// Tao mot menu de thuc hien cac chuc nang
void menu(){
	NODE *first = NULL; int k;
	do
	{
		printf("\n1: Doc danh sach tu file.");
		printf("\n2: Xem danh sach.");
		printf("\n3: Sap xep danh sach");
		printf("\n4: Chen phan tu vao danh sach");
		printf("\n5: Thoat.");
		printf("\nBan chon chuc nang [1..5]: ");
		scanf_s("%d", &k);
		switch (k)
		{
		case 1: TaoLIFO(first);
			printf("\nDoc thanh cong!\n\n");
			break;
		case 2:
			printf("\nDanh sach co trong tep la:\n\n");
			Display(first);
			printf("\n\n");
			break;
		case 3:
			Swap(first);
			printf("\nDanh sach sau khi sap xep:\n\n");
			Display(first);
			break;
		case 4:
			addLifo(first);
			printf("\nThem thanh cong !\n\n");
			break;
		case 5:
			printf("\n\nBan da thoat chuong trinh thanh cong!\n\n");
			_getch();
			break;

		}
	} while (k != 5);
}
int main()
{
	menu();
	_getch();
}
 
Câu trả lời

- Bạn đã sẵn sàng thảo luận về chủ đề này. Hãy bấm "Viết bình luận", bạn có thể lựa chọn sử dụng tài khoản Facebook hoặc Google++

- Vì sự phát triển của cộng đồng CNTT/CNPM tại Việt Nam!

Unknown user
No responses yet

Thớt về xem lại tài liệu.
0 Lượt thích

chả là em theo mạng.nhưng kì này thầy có giao cho bà tập này về giải thích mà e chưa giải thích dc hết ạ
0 Lượt thích

Nhờ anh xem em cái hàm NODE *addLifo(NODE *first) là dc ạ!
0 Lượt thích

Thực sự bảo "Giải thích bài này" đối với mọi người ở đây rất khó. Mọi người đều không có nghiệp vụ sư phạm, thầy cô nói bạn đã không hiểu thì ở đây cũng vậy.
Bạn có thể hỏi xem câu lệnh nào nghĩa là gì, thì may ra.
0 Lượt thích

@Đại Quang: "NODE *addLifo(NODE *first)"
NODE *addLifo(NODE *first) // method addLifo which returns a pointer of type NODE and the parameter is a pointer of type NODE, too
{
	NODE *x, *p = first;// tao mot node p để duyệt danh sách first
	x = new(NODE);// cấp phát vùng nhớ cho x
	printf("\nNhap phan tu can them vao : ");
	scanf_s("%d", &x->info); // <---------------------read the info number
	while ((p->next != NULL) && (p->next->info < x->info)) // neu trương next trỏ đến mà khác null
		p = p->next; // cho p trỏ đến vị trí tiếp theo so long as the info of p->next less than the x->info
    if (p == first)  //  p is the first node
    {
       x->next = p; // Then the x pointer of next points to p
       return x;       // and x is the last one, hence LIFO (last In First Out)
    }
    // p is NOT the first.
    x->next = p->next;// gán x của node mới bằng địa chỉ cả node sau p
    p->next = x;// cập nhật lại next  của node p trỏ đến trên node mới
    return first; // first is now the last hence LIFO (last In First Out)
}

0 Lượt thích

while ((p->next != NULL) && (p->next->info < x->info)) thế bạn có thể giải thích cho mình cái điều kiệnđằng sau dc không?
0 Lượt thích

@Đại Quang: (p->next->info < x->info)
Chỉ là so sánh 2 số nguyên thôi mà.
Nếu số vừa nhập đó không NULL và lớn hơn Node đứng sau *p => Add Node vào vị trí đó (Sắp xếp ngay lúc add node)
 
0 Lượt thích

Thôi thớt về ôn lại con trỏ đi vậy.
p/s: scanf_s
0 Lượt thích

Từ khóa tìm kiếm

Câu trả lời mới nhất

Tin tuyển dụng