Danh sách liên kết?

Em đang học danh sách liên kết, nhưng lại không tìm được tài liệu hay video nào hướng dẫn rõ ràng, ai có thì cho em cái tài liệu về nó. Bài giảng của anh Đạt em xem mấy lần nhưng càng xem càng mơ hồ ko biết gì luôn …
Nếu anh chị nào rảnh code giúp em 1 bài gì đó, rồi giải thích rõ từng dòng trên đó thì cám ơn nhiều. Không thì em có 1 code này, nhưng lại không hiểu, anh chị giải thích giúp em từ đầu đến cuối luôn nhé.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct sv
{
	char ten[20];
	char MSSV[10];
	int dtb;
};
struct NODE		
{
	sv info;		
	struct NODE* next;		
};
struct LIST		
{
	NODE *head;		
	NODE *tail;	
};

NODE* CreateNode (sv x)			
{
	NODE *p;	
	p=new NODE;	
	if(p==NULL)  exit(1);
	p->info=x;
	p->next=NULL;
	return p;
}
void CreateList (LIST &L)
{
	L.head=L.tail=NULL;
}
void input (sv &x)
{
	printf("\nNhap MSSV: ");  fflush(stdin); gets(x.MSSV);
	printf("\nNhap ten: ");  fflush(stdin); gets(x.ten);   
	printf("\nNhap dtb: "); scanf("%d", &x.dtb);
}
void AddLast (LIST &L, NODE *p)
{
	if(L.head==NULL)  L.head=L.tail=p;
	else
	{
		L.tail->next=p;
		L.tail=p;
	}
}
void nhap (LIST &L)
{
	sv x;
	char kt;   
	printf("\nNhan phim bat ki de tiep tuc nhap.");
	printf("\nNhan 0 de dung nhap.");
	do
	{
		kt=getch();
		if(kt=='0')  break;
		input(x);
		NODE *p=CreateNode(x);
		AddLast(L,p);
	} while (1);
}
void output (sv x)
{
	printf("\n%s    %s      %d",x.MSSV,x.ten,x.dtb);
}
void xuat (LIST L)
{
	NODE *p;
	p=L.head;
	while(p!=NULL)
	{
		output(p->info);
		p=p->next;
	}
}
void maxdtb (LIST L)
{
	NODE *p,*max;
	int dem;
	p=L.head;
	max=p;
	while (p!=NULL)
	{
		if(p->info.dtb>max->info.dtb)  { max=p; dem=0; }
		if(p->info.dtb==max->info.dtb) { max=p; dem++; }
		p=p->next;
	}
	printf("\nSV co dtb cao nhat la: \n");
	if(dem==0)  output(max->info);
	else
	{
		NODE *q=L.head;
		while (q!=NULL)
		{
			if(q->info.dtb==max->info.dtb) output(q->info);
			q=q->next;
		}
	}
}
void thongkedtb (LIST L)
{
	NODE *p;
	int dem=0;
	p=L.head;
	while (p!=NULL)
	{       
		if(p->info.dtb>=5)  dem++;
		p=p->next;
	}
	if(dem==0)  printf("\nKo co sv co dtb>=5.");
	else printf("\nCo %d sv co dtb >=5.",dem);
}
void tim (LIST L)
{
	NODE *p;
	int dem=0;
	char k[20];
	printf("\nNhap ten sv can tim: ");
	fflush(stdin);
	gets(k);
	p=L.head;
	while (p!=NULL)
	{
		if(strcmp(k,p->info.ten)==0)      dem++;
		p=p->next;
	}
	if(dem!=0)
	{
		printf("\nTim thay sv: "); output(p->info);
	}
	else printf("\nKo tim thay.");
}
void xoa (LIST &L)
{
	NODE *p, *q;
	char a[10];
	p=L.head;
	q=NULL;
	printf("\nNhap MSSV can xoa: ");
	fflush(stdin);
	gets(a);
	while (p!=NULL)
	{
		if(strcmp(a, p->info.MSSV)==0)    break;
		else printf("\nKo co sv can xoa.");
		q=p;
		p=p->next;
	}
	if(q!=NULL)
	{
		if(p!=NULL)
		{
			q->next=p->next;
			delete (p);
			if(p==L.tail)  L.tail=q;
			delete(p);
		}
	}
	else
	{
		L.head=p->next;
		delete(p);
		if(L.head==NULL)  L.tail=NULL;
	}
}
void selectionsort (LIST &L)
{
	NODE *p,*q,*min;
	p=L.head;
	sv temp;
	while (p!=L.tail)
	{
		min=p;
		q=p->next;
		while (q!=NULL)
		{
			if(q->info.dtb<min->info.dtb)  min=q;
			q=q->next;
		}
		temp=p->info;
		p->info=min->info;
		min->info=temp;
		p=p->next;
	}
}
void menu()
{
	LIST L;
	NODE *p,*q,*moi;
	sv x;
	char chon;
	CreateList(L);
	do
	{
		printf("\n\t\t\tMENU");
		printf("\n\t1. Nhap ds");
		printf("\n\t2. In ds");
		printf("\n\t3. Ds sv co dtb cao nhat");
		printf("\n\t4. Ds sv co dtb >=5");
		printf("\n\t5. Tim sv");
		printf("\n\t6. Xoa sv");
		printf("\n\t7. Sap xep ds");
		printf("\n\t8. Chen sv");
		printf("\n\tNhap 0 de thoat");
		chon=getch();
		switch(chon)
		{
		case '1': { nhap(L); break;}
		case '2': { xuat(L); break;}
		case '3': { maxdtb(L); break;}
		case '4': { thongkedtb(L); break;}
		case '5': { tim(L); break;}
		case '6': { xoa(L); printf("\nDs sau khi xoa: "); xuat(L); break;}
		case '7': { selectionsort(L);printf("\nDs sau khi sap xep: "); xuat(L); break;}
		case '8':
			{
				sv them;
				printf("\nNhap thong tin sv can them: ");
				input(them);
				NODE *t= CreateNode(them);
				AddLast(L,t);
				selectionsort(L);
				printf("\nDs sau khi them :");
				xuat(L);
				break;
			}
		case '0': exit(1);
		default: printf("\nNhap lai.");
		}
	} while (chon!='0');
}
int main()
{
	while(1)
	{
		menu();
		getch();
	}
}

Nếu e chịu khó search trên diễn đàn ở đây thì tối thiểu cũng có video của a @ltd về danh sách liên kết đó e.
Đây là danh sách các video của a @ltd . Danh sách liên kết đơn bài 44,liên kết đôi bài 53…Tuy là C++ nhưng a ngĩ sẽ giúp e hình dung dc phần nào về danh sách liên kết

Và đây nữa :smile:

À em xem video của anh Đạt rồi, xem mấy lần rồi nhưng cũng không hiểu gì hết ấy, rất khó hiểu.

Code này của ai?

Em không hiểu chỗ nào? Em cần phải xác định mình cần hiểu cái gì, hiện giờ ko hiểu cái gì thì anh mới giúp được.

Không thể :frowning:

Code này của ai thì em pó tay, tại em search google thấy nên muốn xem thử ntn.
Em không hiểu ở chỗ, anh viết code rất nhiều, mà không có post cái code lên, em chẳng bik trong đó nó có cái gì, sao lại dùng tới nó, rồi sao lại có cái đó, … rất nhiều.
Nói giải thích từ đầu đến cuối thật ra không phải, giải thích chỗ nào liên quan tới danh sách liên kết thôi mà anh.
Cái bài code này em ko hiểu là không hiểu mấy cái tham số truyền vào, tham số truyền vào viết toàn 1 ký tự và nó là cái gì và có rất nhiều chỗ nữa …

Em hiểu cách nó liên kết như thế nào, nhưng lại không hiểu sao code lại như thế.

Anh không thể giải thích cái code mà thậm chí em còn không biết của ai viết được.

Anh viết nhiều nhưng em có thể pause lại và chép mà. Mục tiêu là em phải tự code chứ không phải copy + paste.

Em đã hiểu bản chất danh sách liên kết là gì chưa?

Khó hiểu chỗ nào, hỏi chỗ nấy.

Copy đoạn code em không hiểu, hỏi ngay đoạn đấy.


Em tưởng tượng

  • Một người đưa cho em đoạn code và nói chả hiểu gì, nhờ em giải thích. (1)
  • Một người khác đưa em một đoạn code và nói rõ, code này làm gì, người ta không hiểu tại sao ở dòng X lại code như vậy, nhờ em giải thích. (2)

Em thấy nên hỏi như thế nào, cách 1 hay cách 2?

Em tự code mà anh, nhưng có nhiều cái anh đóng lại, em ko biết trong đó nó như thế nào là vậy đó anh.

Em sẽ tìm hiểu lại kỹ hơn rồi sẽ hỏi, vì thật sự em xem rất nhiều video về danh sách liên kết rồi, nhưng chỉ hiểu cái bản chất liên kết của nó, nhưng khi code thì rất lúng túng ko hiểu nó như thế nào. Em cũng ko biết hỏi kiểu ntn nữa.

1 Like

Em gửi đoạn code em lúng túng lên anh sẽ giải thích.

Bìn tĩn phế bỏ võ công và tìm hiểu lại DSLK nào. Về cơ bản thì nó đâu có khó tới mức như những cmt trên, chắc do cát hạ bị khớp ngay từ ban đầu. Bìn tĩn lại sẽ dễ dàng tiếp cận vấn đề mới :wink:

3 Likes

bạn đó hiểu nhưng ko biết cách làm, em cũng thế, anh có thể làm lại video ko, làm từ cái cơ bản chỉ có kiểu node rùi từ từ mới tới cái sinhvien

1 Like

Bạn có thể làm lại video về liên kết dữ liệu, thao tác chậm hơn được không và giải thích thêm những ký hiệu như -> hoặc ~.


Tham khảo thêm link này bạn

Chào mọi người, em gặp vấn đề sau khi tạo danh sách liên kết đơn:
Đây là phần code của em:

#include<stdio.h>
#include<string.h>

// Cau truc mot phan tu trong danh sanh
struct phantu{
	char name[15];
	float height;
	float weight;
}; 
typedef struct phantu ptu;

// Cau truc node
struct node {
	ptu data;
	node *pnext;	
};
typedef struct node NODE;

// Cau truc danh sach
struct linkedlist {
	NODE *phead;
	NODE *ptail;
};
typedef struct linkedlist LIST;

//Khoi tao danh sach
void create (LIST &F){
	F.phead=F.ptail=NULL;
}

//Khoi tao node
NODE *createnode(ptu x){
	NODE *p=new NODE;
	
		p->data=x;
		p->pnext=NULL;
		return p;
	
}

// Them vao dau
void addFirst(LIST &F, NODE *p){
	if (F.phead=NULL) F.phead=F.ptail=p;
	else {
		p->pnext=F.phead;
		F.phead=p;
	}
}

// Xuat du lieu 1 node
void displayEle(ptu x) {
		printf("\n%20s\t%.2f\t%.2f",x.name,x.height,x.weight);
	}

// Xuat danh sach		
void displayList(LIST F){

	for (NODE *k=F.phead; k!=NULL ; k = k->pnext)
	displayEle(k->data);
}

int main () {
	LIST F;
	create(F);
	
	for (;;){
			ptu x;
			printf("\nNhap ho ten: ");
			fflush(stdin);
			gets(x.name);
			if (strlen(x.name)<1) break;
			printf("\nNhap chieu cao: ");
			fflush(stdin);
			scanf("%f",&x.height);
			x.weight=x.height*100-105;
			NODE *k= new NODE;
			k=createnode(x);
			addFirst(F,k);
			}
	displayList(F);
	return 0;
}

Mong muốn của em đó là in ra được danh sách dữ liệu các node đã nhập nhưng khi chạy chương trình thì nó chỉ in ra F.phead (dữ liệu node cuối nhập vào).

Code của em bị sai phần nào ạ?
Em cám ơn!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?