30/09/2018, 21:14

Danh sách liên kết trong c++?

mình lên xem video của anh ltd nhưng khổ nổi bí ngay bài danh sách liên kết.Lên mạng tham khảo cũng không dc do bài của ltd khác bài của các anh lập trình kia khá nhiều.Ai chỉ cho mình danh sách liên kết viết như thế nào và cách khởi tạo, kết thúc, … ae biết j chỉ hết đi.

Lê Qúi Nhất viết 23:18 ngày 30/09/2018

Bạn đã học và DSLK chưa? nếu rồi chắc bạn đã biết cách khởi tạo Link List, thêm, sửa, xóa node rồi nhỉ?
Nếu bạn học qua rồi mà không biết làm thì tham khảo video sau: https://www.youtube.com/watch?v=Q4Q7WNb8nW8

Tien Tran viết 23:15 ngày 30/09/2018

thank bạn

Tien Tran viết 23:31 ngày 30/09/2018

cũng dc nhưng anh này vừa giảng vừa cua gái, nghe ớn ớn

Vũ Thủy viết 23:24 ngày 30/09/2018

cái này có vẻ đầy đủ

#include <iostream>
#include <windows.h>
using namespace std;
  struct Node {
     int data;
     Node *pNext;
  };
   typedef struct Node NODE;
   struct List {
    NODE *pHead;
    NODE *pTail;
   };
   typedef struct List LIST;
   void Init(LIST &l)
   {
    l.pHead = l.pTail = NULL;
   }
   NODE *getNode(int x)
   {
    NODE *p = new NODE ;
      if (p==NULL)
      {
       return NULL;
      }
      else {
        p ->data = x;
        p ->pNext = NULL;
        return p;
      }
   }
   void themdau(LIST &l,NODE *p)
   {
      if (l.pHead == NULL)
      {
       l.pHead = l.pTail = p;
      }
      else {
       p->pNext = l.pHead;
       l.pHead = p;
      }
   }
   void themcuoi(LIST &l,NODE *p)
   {
     if (l.pHead == NULL)
     {
    l.pHead = l.pTail = p;
     }
     else {
       l.pTail->pNext = p;
       l.pTail = p;
     }
   }
   void nhap(LIST &l)
   {
     int n;
    
     cout << "\nNhap so NODE :";
     cin >> n;
     Init(l);
       for (int i = 0 ; i<n; i++)
       {
          int x;
          cout << "\nNhap Node:";
          cin >> x;
  NODE *p = getNode(x);
   themcuoi(l,p);    
       }
   }
   void xuat(LIST l)
  {
    for (NODE *p = l.pHead ; p!=NULL ; p=p->pNext)
    {
      cout << p->data << "   ";
     
    }
  }
  void daolist(LIST &l)
{
	Node *parent = l.pHead ;
	Node *current = l.pHead->pNext;
	l.pHead = current->pNext;
	parent->pNext = NULL;
	current->pNext = parent;
	while(l.pHead->pNext){
		parent = current;
		current = l.pHead;
		l.pHead = l.pHead->pNext;
		current->pNext = parent;
	}
	l.pHead->pNext = current;
}
  void XoaNodeDau(LIST &l)
  {
    NODE *s = l.pHead;
     l.pHead = l.pHead ->pNext;
     delete s;
  }
  void XoaNodeCuoi (LIST &l)
   {
  
    NODE *p;
   for (NODE *k = l.pHead; k!=NULL; k=k->pNext){
    
  
     if (k==l.pTail)
     {
       l.pTail = p;
       l.pTail->pNext = NULL;
       delete k;
       return ;
     }
  
     p = k;
}
}
 void themvitri(LIST &l)
 {
    int them;
    int vitri;
    cout << "\nNhap so can them :" ;
     cin >> them;
     cout << "\nNhap vi tri can them :";
     cin >> vitri;
   NODE *k=  getNode(them) ;
   NODE *s;
   NODE *ptr;
   s = l.pHead;
     int dem = 0;
       while(s!=NULL)
       {
       s= s->pNext;
      dem++;
   }
    if (vitri == 1)
    {
        if (l.pHead == NULL)
        {
         l.pHead = k;
         l.pHead -> pNext = NULL;
        }
        else {
          ptr = l.pHead;
    l.pHead = k;
    l.pHead->pNext = ptr;    
         
        } 
    }
    else if(vitri>1  && vitri<=dem)
    {
     s = l.pHead;
     for (int i = 1; i<vitri ;i++)
     {
      ptr = s;
       s=s->pNext;
     }
     ptr -> pNext = k;
     k->pNext = s;
    }
    else cout << "\nKHONG THOA MAN:";
   
    
 }
 void botnode(LIST &l)
 {
    int vitri;
    cout << "\nNhap vi tri can bot:";
    cin >> vitri;
    int dem = 0;

      NODE *s ;
      NODE *ptr;
      s = l.pHead;
         while(s!=NULL)
         {
          s = s->pNext;
          dem++;
         }
      
    if(vitri == 1)   
            {
              s = l.pHead;
              l.pHead = l.pHead ->pNext;
             delete(s);
    }
           
       else {
            if (vitri > 0 && vitri <= dem)
            {
          s = l.pHead;
               for (int i = 1 ; i< vitri ; i++)
                 {
                  ptr = s;
                  s = s->pNext;
                 }
                 ptr -> pNext  = s ->pNext;
        delete (s);
   }
      else cout << "\nVi tri nhap khong thoa man.";
  }
  

}
   void sapxeptang(LIST &l)
   {
   	
     NODE *g ;
         for (NODE *p  = l.pHead ;p!=l.pTail ; p = p->pNext)
         {
            for (NODE *q = p->pNext ; q!=NULL ; q = q->pNext)
            {
                 if (p->data>q->data)
                  {
                       swap(p->data,q->data); 
                  }
       }
 }
      xuat(l);
   }
  void sapxepgiam(LIST &l)
  {
  	  NODE *g ;
  	  for(NODE *p = l.pHead; p!=l.pTail; p=p->pNext)  {
  	  	for(NODE *q = p->pNext ; q!=NULL ; q= q ->pNext) 
  	  	  {
  	  	  	  if(p->data<q->data)  {
  	  	  	  	swap(p->data,q->data);
  	  	  	  }
  	  	  }
  	  }
  	  xuat(l);
  }
    void doinode(LIST  &l)
    {
      NODE *s;
       int giatri;
       int vitri;
         cout << "\nNhap gia tri thay the:";
         cin >> giatri;
         cout << "\nNhap vi tri can thay the :";
         cin >> vitri;
           s = l.pHead;
     
                if (vitri == 1)
                {
                   l.pHead -> data = giatri;
                }
                else {
               for (int i = 0; i++;)                             
                            {
                             
         if (i==vitri)
                             {
                               if (s==NULL ) {
                                cout << "\nKhong hop le.";
                               }
                             s= s->pNext;
                              }
                         }
                              s->data = giatri;
   
         
   
  
                      }
   xuat(l);
  }
    void timkiemnode(LIST &l)
    {
      bool kiemtra = true;
       int dem = 0;
       int n;
       cout << "\nNhap node can tim kiem:";
       cin >> n;
        for (NODE *p = l.pHead ;p!=NULL ; p=p->pNext)
        {
            dem++;
              if(p->data ==n)
              {
                kiemtra = true;
               cout << "\ntim duoc node o vi tri" << dem;
              }
            
        }
        if(!kiemtra)
        {
         cout << "\nKhong tim duoc.";
        }
         
       
    }
  int main ()
  {
  	
   LIST l;
    nhap(l);
    cout << "\nDanh sach ban dau:";
    xuat(l);
	 int check ;
       
		
			  do {
			  	  cout << "\nNhap lua chon.";
        cout << "\n1:Khoi tao danh sach lien ket don.";
        cout << "\n2:Them node vao ben trai danh sach lien ket don.";
        cout << "\n3:Them node vao ben phai danh sach lien ket don.";
        cout << "\n4:Them node vao vi tri pos danh sach lien ket don.";
        cout << "\n5:Loai node dau ben trai danh sach lien ket don.";
        cout << "\n6:Loai node dau ben phai danh sach lien ket don.";
        cout << "\n7:Loai node o vi tri pos danh sach lien ket don.";
		cout << "\n8:Tim node co gia tri x trong danh sach lien ket don.";
		cout << "\n9:Sap xep cac node trong danh sach lien ket don.";
		cout << "\n10:Dao nguoc cac node trong danh sach lien ket don.";
		cout << "\n11:Duyet danh sach";
		cout << "\n12:Thoat.";
			cout << "\nChon.";
			  	   	cin >> check;
			  	   	switch(check){
			  	   	
			  	   		case 1:{
			  	   			Init(l);
			  	   			break;
			  	   		}
			  	   		case 2:{
			  	   		//	cout << "\nThem node dau ben trai.";
							 int x;	 
						   cout << "\nNhap x:";
						   cin >> x;
						   Node *p = getNode(x);
						   themdau(l,p);
							//xuat(l);
			  	   			break;
			  	   		}
			  	   		case 3:{
			  	   			//cout << "\nThem node dau ben phai.";
			  	   			//Init(l);
			  	   			int x;
			  	   			cout << "\nNhap x:";
			  	   			cin >> x;
			  	   			Node *p = getNode(x);
			  	   			themcuoi(l,p);
			  	   			
			  	   			break;
			  	   		}
			  	   		case 4:{
			  	   			cout << "\nThem node vao vi tri pos.";
			  	   		//	Init(l);
			  	   		//	nhap(l);
			  	   			themvitri(l);
			  	   		//	xuat(l);
			  	   			break;
			  	   		}
			  	   		 case 5:{
			  	   		 	cout << "\nXoa node dau.";
			  	   		
			  	   		 	XoaNodeDau(l);
			  	   		// 	xuat(l);
			  	   		 	break;
			  	   		 }
			  	   		 case 6:{
			  	   		 	
									XoaNodeCuoi(l);
								
												  	   		 	break;
			  	   		 }
			  	   		 case 7:{
			  	   		 
			  	   		 	botnode(l);
			  	   		
			  	   		 	break;
			  	   		 }
			  	   		 case 8:{
			  	   	
			  	   		 	timkiemnode(l);
			  	   		 	
			  	   		 	break;
			  	   		 }
			  	   		 case 9:{
			  	   		 
			  	   		 	cout << "\nSap xep tang:";
			  	   		 	sapxeptang(l);
			  	   		 	cout << "\nSap xep giam:";
			  	   		 	sapxepgiam(l);
			  	   		 	break;
			  	   		 }
			  	   		 case 10:{
			  	   		 
			  	   		 
			  	   		     daolist(l);
			  	   		 //    xuat(l);
			  	   		 	
			  	   		 	break;
			  	   		 }
			  	   	
			  	    case 11:{
					  xuat(l);
			  	    	break;
			  	    } 
			  	     case 12:{
			  	     	break;
			  	     }
			}
		}while(check!=12);
	}
 //
Tien Tran viết 23:26 ngày 30/09/2018

thank bạn rất rất rất rất rất rấ rất nhiều , tại ko có code nên mình chưa hiểu thui

Tien Tran viết 23:29 ngày 30/09/2018

code này sai tùm lum

Tien Tran viết 23:30 ngày 30/09/2018
#include  <iostream>

using namespace std;

struct Node {
	int data;
	Node* next;
};

// only for the 1st Node
void initNode(struct Node *head, int n){
	head->data = n;
	head->next = NULL;
}

// apending
void addNode(struct Node *head, int n) {
	Node *newNode = new Node;
	newNode->data = n;
	newNode->next = NULL;

	Node *cur = head;
	while (cur) {
		if (cur->next == NULL) {
			cur->next = newNode;
			return;
		}
		cur = cur->next;
	}
}

void insertFront(struct Node **head, int n) {
	Node *newNode = new Node;
	newNode->data = n;
	newNode->next = *head;
	*head = newNode;
}

struct Node *searchNode(struct Node *head, int n) {
	Node *cur = head;
	while (cur) {
		if (cur->data == n) return cur;
		cur = cur->next;
	}
	cout << "No Node " << n << " in list.\n";
}

bool deleteNode(struct Node **head, Node *ptrDel) {
	Node *cur = *head;
	if (ptrDel == *head) {
		*head = cur->next;
		delete ptrDel;
		return true;
	}

	while (cur) {
		if (cur->next == ptrDel) {
			cur->next = ptrDel->next;
			delete ptrDel;
			return true;
		}
		cur = cur->next;
	}
	return false;
}

/* reverse the list */
struct Node* reverse(struct Node** head)
{
	Node *parent = *head;
	Node *me = parent->next;
	Node *child = me->next;

	/* make parent as tail */
	parent->next = NULL;
	while (child) {
		me->next = parent;
		parent = me;
		me = child;
		child = child->next;
	}
	me->next = parent;
	*head = me;
	return *head;
}

/* Creating a copy of a linked list */
void copyLinkedList(struct Node *node, struct Node **pNew)
{
	if (node != NULL) {
		*pNew = new Node;
		(*pNew)->data = node->data;
		(*pNew)->next = NULL;
		copyLinkedList(node->next, &((*pNew)->next));
	}
}

/* Compare two linked list */
/* return value: same(1), different(0) */
int compareLinkedList(struct Node *node1, struct Node *node2)
{
	static int flag;

	/* both lists are NULL */
	if (node1 == NULL && node2 == NULL) {
		flag = 1;
	}
	else {
		if (node1 == NULL || node2 == NULL)
			flag = 0;
		else if (node1->data != node2->data)
			flag = 0;
		else
			compareLinkedList(node1->next, node2->next);
	}

	return flag;
}

void deleteLinkedList(struct Node **node)
{
	struct Node *tmpNode;
	while (*node) {
		tmpNode = *node;
		*node = tmpNode->next;
		delete tmpNode;
	}
}

void display(struct Node *head) {
	Node *list = head;
	while (list) {
		cout << list->data << " ";
		list = list->next;
	}
	cout << endl;
	cout << endl;
}

int main()
{
	struct Node *newHead;
	struct Node *head = new Node;

	initNode(head, 10);
	display(head);

	addNode(head, 20);
	display(head);

	addNode(head, 30);
	display(head);

	addNode(head, 35);
	display(head);

	addNode(head, 40);
	display(head);

	insertFront(&head, 5);
	display(head);

	int numDel = 5;
	Node *ptrDelete = searchNode(head, numDel);
	if (deleteNode(&head, ptrDelete))
		cout << "Node " << numDel << " deleted!\n";
	display(head);

	cout << "The list is reversed\n";
	reverse(&head);
	display(head);

	cout << "The list is copied\n";
	copyLinkedList(head, &newHead);
	display(newHead);

	cout << "Comparing the two lists...\n";
	cout << "Are the two lists same?\n";
	if (compareLinkedList(head, newHead))
		cout << "Yes, they are same!\n";
	else
		cout << "No, they are different!\n";
	cout << endl;

	numDel = 35;
	ptrDelete = searchNode(newHead, numDel);
	if (deleteNode(&newHead, ptrDelete)) {
		cout << "Node " << numDel << " deleted!\n";
		cout << "The new list after the delete is\n";
		display(newHead);
	}
	cout << "Comparing the two lists again...\n";
	cout << "Are the two lists same?\n";
	if (compareLinkedList(head, newHead))
		cout << "Yes, they are same!\n";
	else
		cout << "No, they are different!\n";

	cout << endl;
	cout << "Deleting the copied list\n";
	system("pause");
	deleteLinkedList(&newHead);
	display(newHead);
	return 0;
	
}
Phạm Ngọc Hiếu viết 23:20 ngày 30/09/2018

Thôi nào các ông,lại tung code ra khoe r

viết 23:21 ngày 30/09/2018

code C++ mà đi đâu cũng thấy thừa chữ “struct” trong struct Node * Với lại C++ có hàm tạo sao ko xài, lại đi viết hàm initNode() rồi chỉ xài có … 1 lần Chưa kể tới C++ có thể truyền tham chiếu ở đây ko thấy xài. Viết C trong C++ làm cái gì? Đọc code cứ tưởng như chăn bò trong thành phố…

hàm reverse tự cho rằng headhead->next phải khác NULL, tức là dslk phải có 2 phần tử trở lên thì mới reverse được, còn dslk rỗng hoặc chỉ có 1 phần tử thì runtime error ngay.

Tien Tran viết 23:27 ngày 30/09/2018

code em lên mấy trang nước ngoài kiếm

Tien Tran viết 23:30 ngày 30/09/2018

em đang chuyển code này sang c++ nhưng khổ ngay cái reverse, em đang làm vd để hiểu về link list nhưng đang bó tay hay anh jup chuyển wa c++ lun đi

Tien Tran viết 23:22 ngày 30/09/2018

em lên mạng tham khảo toàn bắt xài struct, trong video anh ltd không nói rõ về phần tạo ra link list, lại ko có code nên h đang ngu

Mu Hoasua viết 23:20 ngày 30/09/2018

Mình cũng có thắc mắc giông bạn

viết 23:27 ngày 30/09/2018

đưa code mà ko hiểu gì thì đưa làm gì…

Nguyễn Đức Anh viết 23:18 ngày 30/09/2018

Mình có cái tài liệu về môn cấu trúc dữ liệu. Bạn xem qua

https://drive.google.com/file/d/0B3Q4lBUmPVORUlM3TnlRZ0xERW8/view?usp=sharing

Nguyễn Đức Anh viết 23:28 ngày 30/09/2018

Code của mình viết cũng khá lâu rồi chưa đụng lại, chắc có lỗi, nhưng bạn cứ xem tham khảo

#include “stdafx.h”
#include “conio.h”
#include “iostream”
#include “stdio.h”

const int MSSV = 9;

struct SinhVien
{
char strMSSV[MSSV];
char strHoTen[30];
char strNamSinh[5];
float fDiemTrungBinh;
};

struct SinhVienNode
{
SinhVien info;
SinhVienNode * pNext;
};

struct List
{
SinhVienNode * pHead;
SinhVienNode * pTail;
};

void init(List & l)
{
l.pHead = l.pTail = NULL;
}

void createList(List & l);
SinhVien setInfo();
SinhVienNode * getNode(SinhVien info);
SinhVienNode * getP(List & l, SinhVienNode * p);
void showList(List l);
SinhVienNode * searchMSSV(List l, char strMSSV[9]);
SinhVienNode * getHead(List & l);
SinhVienNode * getAfter(List & l, SinhVienNode * q);
void removeNode(List & l, SinhVienNode * p);
SinhVienNode * insertHead(List & l, SinhVien info);
SinhVienNode * insertTail(List & l, SinhVien info);
void insertAfter(List & l, SinhVienNode * q, SinhVienNode * p);
SinhVien removeNode(List &l);
SinhVienNode * getNodeMax(List l);

void main()
{
List lop18TH01;

init(lop18TH01);

SinhVienNode * q = lop18TH01.pHead;
int a, b;
char strMSSV[MSSV];

createList(lop18TH01);

_getch();

system("cls");

do
{
	printf("1 \tXuat danh sach sinh vien\n");
	printf("2 \tTim thong tin sinh vien thong qua MSSV\n");		
	printf("3 \tThem sinh vien vao dau danh sach\n");
	printf("4 \tThem sinh vien vao giua danh sach\n");
	printf("5 \tThem sinh vien vao cuoi danh sach\n");
	printf("6 \tXoa thong tin sinh vien dau danh sach\n");
	printf("7 \tXoa thong tin sinh vien giua danh sach\n");
	printf("8 \tXoa thong tin sinh vien theo MSSV\n");
	printf("9 \tTim sinh vien co diem trung binh cao nhat\n");
	printf("0 \tThoat\n");
	printf("Chon: ");

	scanf_s("%d", &a);

	system("cls");

	q = lop18TH01.pHead;

	switch (a)
	{
	case 1:
		showList(lop18TH01);
		_getch();
		break;
	case 2:
		fflush(stdin);
		printf("Nhap vao MSSV can tim: ");
		std::cin.getline(strMSSV, sizeof(strMSSV));

		q = searchMSSV(lop18TH01, strMSSV);

		if (q == NULL)
		{
			printf("Khong tim thay!");
		}
		else
		{
			printf("%s - %s - %s - %.1f\n", q->info.strMSSV, q->info.strHoTen, q->info.strNamSinh, q->info.fDiemTrungBinh);
		}
		_getch();
		break;
	case 3:
		insertHead(lop18TH01, setInfo());
		_getch();
		break;
	case 4:
		printf("Nhap vao vi tri muon them: ");
		scanf_s("%d", &b);
		b--;

		for (int i = 1; i < b; i++)
		{
			q = q->pNext;
		}

		insertAfter(lop18TH01, q, getNode(setInfo()));
		_getch();
		break;
	case 5:	
		insertTail(lop18TH01, setInfo());
		_getch();
		break;
	case 6:
		removeNode(lop18TH01, getHead(lop18TH01));
		printf("Da xoa thanh cong");
		_getch();
		break;
	case 7:
		printf("Nhap vao vi tri muon xoa: ");
		scanf_s("%d", &b);
		b--;

		for (int i = 1; i < b; i++)
		{
			q = q->pNext;
		}

		removeNode(lop18TH01, getAfter(lop18TH01, q));
		printf("Da xoa thanh cong");
		_getch();
		break;
	case 8:
		fflush(stdin);
		printf("Nhap vao MSSV can xoa: ");
		std::cin.getline(strMSSV, sizeof(strMSSV));

		removeNode(lop18TH01, getP(lop18TH01, searchMSSV(lop18TH01, strMSSV)));
		printf("Da xoa thanh cong");

		_getch();
		break;
	case 9:
		q = getNodeMax(lop18TH01);

		printf("%s - %s - %s - %.1f\n", q->info.strMSSV, q->info.strHoTen, q->info.strNamSinh, q->info.fDiemTrungBinh);

		_getch();
		break;
	};

	system("cls");

}
while (a != 0);

}

SinhVien setInfo()
{
SinhVien Info;

fflush(stdin);
printf("Nhap vao MSSV: ");
std::cin.getline(Info.strMSSV, sizeof(Info.strMSSV));

fflush(stdin);
printf("Nhap vao ho va ten: ");
std::cin.getline(Info.strHoTen, sizeof(Info.strHoTen));

fflush(stdin);
printf("Nhap vao nam sinh: ");
std::cin.getline(Info.strNamSinh, sizeof(Info.strNamSinh));

fflush(stdin);
printf("Nhap vao diem trung binh: ");
scanf_s("%f", &Info.fDiemTrungBinh);

return Info;

}

SinhVienNode * getNode(SinhVien info)
{
SinhVienNode * p = new SinhVienNode;

if (p == NULL)
{
	printf("Khong du bo nho");
	return NULL;
}

p->info = info;
p->pNext = NULL;

return p;

}

void createList(List & l)
{
int a;

do
{
	printf("Nhap so luong sinh vien muon them: ");
	scanf_s("%d", &a);
}
while (a < 1);

printf("\n");

for (int i=1; i<=a; i++)
{
	printf("\n\n* Sinh vien thu %d:\n\n", i);

	insertTail(l, setInfo());
}

}

void showList(List l)
{
if (l.pHead == NULL)
{
printf(“Danh sach trong”);
return;
}

SinhVienNode * p = l.pHead;

do
{
	printf("%s - %s - %s - %.1f\n", p->info.strMSSV, p->info.strHoTen, p->info.strNamSinh, p->info.fDiemTrungBinh);
	p = p->pNext;
}
while (p != NULL);

}

SinhVienNode * searchMSSV(List l, char strMSSV[MSSV])
{
SinhVienNode * p = l.pHead;
int iSum;

while (p != NULL)
{
	iSum = 0;

	for (int i = 0; i < MSSV; i++)
	{
		if (p->info.strMSSV[i] == strMSSV[i])
		{
			iSum++;
		}
	}

	if (iSum == MSSV)
	{
		return p;
	}

	p = p->pNext;
}

return NULL;

}

SinhVienNode * getP(List & l, SinhVienNode * p)
{
if (p == l.pHead)
{
l.pHead = l.pHead -> pNext;
return p;
}

SinhVienNode * q = l.pHead;

while (q->pNext != p)
{
	q = q->pNext;
}

q->pNext = p->pNext;

if (l.pHead == NULL)
	l.pTail = NULL;

return p;

}

void addHead(List & l, SinhVienNode * p)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
p->pNext = l.pHead;
l.pHead = p;
}
}

void addTail(List & l, SinhVienNode * p)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
l.pTail->pNext = p;
l.pTail = p;
}
}

SinhVienNode * insertHead(List & l, SinhVien info)
{
SinhVienNode * p = getNode(info);

if (p != NULL)
{
	addHead(l, p);
	return p;
}

return NULL;

}

SinhVienNode * insertTail(List & l, SinhVien info)
{
SinhVienNode * p = getNode(info);

if (p != NULL)
{
	addTail(l, p);
	return p;
}

return NULL;

}

void insertAfter(List & l, SinhVienNode * q, SinhVienNode * p)
{
if (q != NULL)
{
p->pNext = q->pNext;
p->pNext = p;
if (q == l.pTail)
l.pTail = p;
}
else
{
addTail(l, p);
}
}

SinhVienNode * getHead(List & l)
{
SinhVienNode * p = NULL;

if (l.pHead != NULL)
{
	p = l.pHead;
	l.pHead = l.pHead -> pNext;
	p->pNext = NULL;

	if (l.pHead == NULL)
		l.pTail = NULL;
}

return p;

}

SinhVienNode * getAfter(List & l, SinhVienNode * q)
{
SinhVienNode * p;

if (q != NULL)
{	
	p = q ->pNext;

	if (p != NULL)
	{
		q->pNext = p->pNext;
		p->pNext = NULL;

		if (p == l.pTail)
		{
			l.pTail = q;
		}
	}		
}
else 
{
	p = getHead(l);
}

return p;

}

void removeNode(List &l, SinhVienNode * p)
{
if (p == NULL)
return;

delete p;

}

float findMax(List l)
{
SinhVienNode * p = l.pHead;
float fMax = 0;

if (l.pHead != NULL)
{
	fMax = l.pHead->info.fDiemTrungBinh;
}

while (p != NULL)
{
	if (fMax < p->info.fDiemTrungBinh)
	{
		fMax = p->info.fDiemTrungBinh;
	}
	p = p->pNext;
}

return fMax;

}

SinhVienNode * getNodeMax(List l)
{
SinhVienNode * p = l.pHead;
float fMax = findMax(l);

while ((p != NULL) && (p->info.fDiemTrungBinh != fMax))
{
	p = p->pNext;
}

return p;

}

void viết 23:26 ngày 30/09/2018
#include <iostream>
using namespace std;

struct Node {
  int data;
  struct Node* next;
};

class LinkedList {
 public:
  LinkedList() {
    _head = nullptr;
    _size = 0;
  }

  virtual ~LinkedList() {
    while (_head) {
      struct Node* temp = _head->next;
      delete _head;
      _head = temp;
    }
  }

  void pushHead(int data) {
    if (!_head) {
      _head = new Node();
      _head->data = data;
      _head->next = nullptr;
    } else {
      struct Node* temp;
      temp = new Node();
      temp->data = data;
      temp->next = _head;
      _head = temp;
    }
    _size += 1;
  }

  unsigned int size() const { return _size; }

 private:
  struct Node* _head;
  unsigned int _size;
};

int main() {
  LinkedList l1;
  l1.pushHead(2);
  l1.pushHead(3);
  cout << l1.size() << '\n';
  return 0;
}

Tien Tran viết 23:25 ngày 30/09/2018

hiểu nhưng ko biết cách giải nên có code phân tích từ từ ra rùi chạy => xong, hiểu và làm dc

Bài liên quan
0