01/10/2018, 12:21

Hỏi về cách chèn phần tử trong danh sách liên kết

Chào mọi người trên diễn đàn!
Nay mới học đến phần này táy máy làm thử thì hơi bị ngờ ngợ chỗ này
Chả là bài tập thì kêu là sắp xếp 1 danh sách liên kết đơn gồm có tên,mssv và đtb của sinh viên!
Mình làm được hết cả rồi Theo struct ấy mấy bác chứ ko phải class nha
Nhưng khi đến khúc gay go là yêu cầu chèn thêm 1 sv với tên, mssv , dtb vào danh sách liên kết đã sắp xếp theo điểm trung bình thì hơi bị tắt ở đấy. Cái chính là sau khi chèn thì danh sách ấy vẫn là 1 danh sách đã sắp xếp theo chiều tăng dần rồi ấy??
Mọi người có cách nào giúp đả thông vụ này với ạ!!
À C++ nha mấy bác

HK boy viết 14:26 ngày 01/10/2018

Vì bạn không đưa ngôn ngữ bạn sử dụng là gì nên mình chỉ cho bạn mã giả thôi:

void add(item):
    for i = 0 -> n-1:
        if sv[i] < item && item < sv[i+1]: // bạn không đưa ra điều kiện so sánh,
                                           // tạm đặt toán tử '<' để biểu diễn
                                           // quan hệ nhỏ hơn -> nhỏ hơn xếp trước
            insert(item, i+1) // chèn item vào vị trí i+1
Uchiha Sasuke viết 14:38 ngày 01/10/2018

Cái chính ở đây là phải biết được nó được sắp xếp theo dữ liệu nào ?

thdung6198 viết 14:37 ngày 01/10/2018

Mình dùng ngôn ngữ c++ và cái danh sách liên kết thì sắp xếp theo điểm trung bình ấy

Uchiha Sasuke viết 14:27 ngày 01/10/2018

bạn có thể duyệt 1 danh sách liên kết rồi in ra số phần tử, số dtb của từng p/tử (node) không ?

thdung6198 viết 14:33 ngày 01/10/2018

Được á bạn? mấy đó mình làm đc hết cả rồi

Uchiha Sasuke viết 14:36 ngày 01/10/2018

danh sách liên kết của bạn được cài đặt bằng mảng hay là con trỏ vậy

thdung6198 viết 14:31 ngày 01/10/2018

Con trỏ bác ơi Chĩ cần giúp mình đã thông làm sao để chèn vô là mình làm đc òi ko cần code lắm đâu

Uchiha Sasuke viết 14:37 ngày 01/10/2018

danh sách liên kết đơn hay kép vậy ? thường là khi chèn 1 phần tử phải chia ra 3 trường hợp, là chèn vào đầu, chèn vào cuối hay chèn vào vị trí giữa

Uchiha Sasuke viết 14:33 ngày 01/10/2018

chèn vào giữa: duyệt tới node x mình cần chèn vào sau, tạo ra 1 node mới có dữ liệu cần chèn cho nó trỏ tới node mà x trỏ tới, rồi cho x trỏ tới cái node vừa tạo, danh sách liên kết đơn nhé

thdung6198 viết 14:23 ngày 01/10/2018

DS Đơn bác ơi trường hợp này mình nói rõ mà ko biết nên chèn vào đâu và chèn ntn ấy mới hỏi nè
Tại vì cái cần chèn thì nhập vô. Mà cái danh sách thì đã sort rồi. Có thể nó sẽ nhỏ hơn số đầu => chèn đầu
Có thể nó sẽ nhỏ hơn số cuối => chèn cuối
Hoặc có thể chèn bất kì

Khang Việt viết 14:37 ngày 01/10/2018

nếu vậy mỗi lần chèn , thì cứ cho nó chèn cuối , rồi sắp xếp lại à @@!

thdung6198 viết 14:27 ngày 01/10/2018

Nếu vậy thì nó đơn giản rồi ông ơi Cái chính là chèn vào luôn vẫn ko làm mất thứ tự ấy. Ko đc sắp xếp lại lần nữa mà

Nguyen Ca viết 14:29 ngày 01/10/2018

tạo 2 hàm add đầu, với add sau là được
khi nhập phân từ mới kiêm tra điêu kiện để quyết định chèn vào đâu.

void addfirst(list &l,node *newnode)
{
	if(l.phead==NULL)
	{
		l.phead=newnode;
		l.ptail=l.phead;
	}
	else
	{
		newnode->pnext=l.phead;
		l.phead=newnode;
	}
}
void addfter(list &l,node *q,node*newnode)
{
	if(q!=NULL)
	{
		newnode->pnext=q->pnext;
		q->pnext=newnode;
		if(q==l.ptail)
			l.ptail=newnode;
		
	}
	else
	{
		addfirst(l,newnode);
	}
}
void them_sv(list &l)
{
	node*newnode;
	node*p,*truoc_p=NULL;
	p=l.phead;
	sinhvien sv;
	//sap_xep(l);
	
	printf(" \nnhap ma so :\t");
	scanf("%d",&sv.masv);
	fflush(stdin);
	printf(" nhap ho ten:\t");
	gets(sv.hoten);

	newnode=getnode(sv); 
	if(newnode->info.masv< l.phead->info.masv)
		addfirst(l,newnode);
	else
		while(p!=NULL && (p->info.masv< newnode->info.masv))
		{
			truoc_p=p;
			p=p->pnext;
		}
		addfter(l,truoc_p,newnode);
}

all truct

template<class KDL>
void hoanvi(KDL &a,KDL &b)
{
	KDL tam;
	tam=a;
	a=b;
	b=tam;
}

typedef struct sinhvien
{
	int masv;
	char hoten[35];
};
typedef struct node
{
	sinhvien info;
	node*pnext;
};
typedef struct list
{
	node *phead;
	node*ptail;
};
Bài liên quan
0