Quản lý sinh viên bằng danh sách liên kết đơn
Danh sách liên kết đơn(Single linked list) là ví dụ tốt nhất có thể và dễ dàng và đơn giản nhất về kết cấu dữ liệu động thực hiện con trỏ để tải đặt. Bởi vì đó, kiến thức và kỹ năng con trỏ là rất là quan trọng nhằm hiểu bí quyết danh sách liên kết hoạt động, vị vậy giả dụ bạn chưa có kiến thức về bé trỏ thì bạn nên học về con trỏ trước. Bạn cũng cần được hiểu một ít về cấp phát bộ lưu trữ động. Để dễ dàng và đơn giản và dễ dàng hiểu, phần nội dung setup danh sách link của nội dung bài viết này vẫn chỉ trình bày về danh sách liên kết đơn.
Bạn đang xem: Quản lý sinh viên bằng danh sách liên kết đơn
Danh Mục bài Viết
VI. Thiết lập Đặt Danh Sách links Đơn C++VII. Code Danh Sách link Đơn sv C++VIII. Xóa thành phần Trong Danh Sách links Đơn C++IX. Bài Tập Danh Sách liên kết Đơn C++I. Danh Sách link Đơn C++
Danh sách links đơn (Single Linked List) là một cấu trúc dữ liệu động, nó là 1 danh sách mà lại mỗi thành phần đều links với phần tử đúng sau nó trong danh sách. Mỗi phần tử (được gọi là một trong những node tốt nút) vào danh sách liên kết đơn là một kết cấu có nhị thành phần:
Thành phần dữ liệu: lưu thông tin về phiên bản thân thành phần đó.Thành phần liên kết: lưu địa chỉ phần tử đứng sau trong danh sách, trả dụ bộ phận đó là thành phần cuối thuộc thì yếu tắc này bằng NULL.Đặc điểm của danh sách link đơn
Do danh sách link đơn là 1 cấu trúc dữ liệu động, được làm cho nhờ việc cấp phát động cho nên nó có một số điểm lưu ý sau đây:
Được cung cấp phát bộ nhớ khi chạy chương trìnhCó thể đổi thay kích thước qua bài toán thêm, xóa phần tửKích thước về tối đa dựa vào vào bộ nhớ khả dụng của RAMCác phần tử được tàng trữ ngẫu nhiên (không liên tiếp) trong RAMVà vị tính links của bộ phận đầu và phần tử đứng sau nó vào danh sách liên kết đơn, nó mang những đặc điểm sau:
Chỉ yêu cầu nắm được thành phần đầu và cuối là gồm thể cai quản được danh sáchTruy cập tới thành phần ngẫu nhiên nên duyệt từ đầu đến địa chỉ đóChỉ có thể tìm kiếm tuyến đường tính 1 phần tử
II. Nối 2 Danh Sách links Đơn C++
Bài tập C: Nối hai danh sách links đơn
Bài tập C này giúp đỡ bạn làm quen dần dần với cách tạo danh sách links đơn và cách nối nhì danh sách links đơn trong C. Để giải bài tập này, mình sử dụng cấu tạo struct trong C.
Chương trình C
Dưới đó là chương trình C nhằm giải bài xích tập nối nhị danh sách link đơn trong C:
#include #include struct node int data; struct node *next;;struct node *even = NULL;struct node *odd = NULL;struct node *list = NULL;//tao danh sach lien ketvoid insert(int data) // cap phat bo nho cho node moi; struct node *link = (struct node*) malloc(sizeof(struct node)); struct node *current; link->data = data; link->next = NULL; if(data%2 == 0) if(even == NULL) even = link; return; else current = even; while(current->next != NULL) current = current->next; // chen links vao phan cuoi cua các mục current->next = link; else if(odd == NULL) odd = link; return; else current = odd; while(current->next!=NULL) current = current->next; // chen link vao phan cuoi cua menu current->next = link; void display(struct node *head) struct node *ptr = head; printf("
=>"); while(ptr != NULL) printf(" %d =>",ptr->data); ptr = ptr->next; printf("
III. Đảo Ngược Danh Sách link Đơn C++
Đảo ngược list liên kết
Với hoạt động này, bạn phải cẩn thận. Chúng ta cần tạo nên nút đầu (head) trỏ tới nút sau cuối và hòn đảo ngược cục bộ danh sách liên kết.

Đầu tiên, họ duyệt tới phần cuối của danh sách. Nút này đã trỏ tới NULL. Hiện thời điều nên làm là khiến cho nút cuối này trỏ tới nút phía đằng trước của nó.

Chúng ta phải đảm bảo rằng nút sau cùng này sẽ không trở nên thất lạc, vì đó họ sẽ sử dụng một số nút lâm thời (temp node – giống như các biến tạm trung gian để giữ lại giá trị). Tiếp theo, bọn họ sẽ tạo nên từng nút phía bên trái sẽ trỏ tới nút trái của chúng.

Sau đó, nút đầu tiên sau nút head vẫn trỏ cho tới NULL.

Chúng ta sẽ khiến cho nút head trỏ tới nút đầu tiên mới vày sử dụng các nút tạm.

Bây giờ list liên kết đã biết thành đảo ngược.
Chương trình minh họa Danh sách liên kết (Linked List) vào C
#include #include #include #include struct node int data; int key; struct node *next;;struct node *head = NULL;struct node *current = NULL;//hien thi danh sachvoid printList() struct node *ptr = head; printf(" < "); //bat dau tu phan dau danh sach while(ptr != NULL) printf("(%d,%d) ",ptr->key,ptr->data); ptr = ptr->next; printf(" >");//chen liên kết tai vi tri dau tienvoid insertFirst(int key, int data) //tao mot links struct node *link = (struct node*) malloc(sizeof(struct node)); link->key = key; link->data = data; //tro links nay toi first node cu link->next = head; //tro first toi first node moi head = link;//xoa phan tu dau tienstruct node* deleteFirst() //luu tham chieu toi first link struct node *tempLink = head; //danh dau next toi first liên kết la first head = head->next; //tra ve liên kết bi xoa return tempLink;//kiem tra list co trong giỏi khongbool isEmpty() return head == NULL;int length() int length = 0; struct node *current; for(current = head; current != NULL; current = current->next) length++; return length;//tim mot liên kết voi key da chostruct node* find(int key) //bat dau tim tu first liên kết struct node* current = head; //neu list la trong if(head == NULL) return NULL; //duyet qua menu while(current->key != key) //neu day la last node if(current->next == NULL) return NULL; else //di chuyen toi next links current = current->next; //neu tim ráng du lieu, tra ve links hien tai return current;//xoa mot links voi key da chostruct node* deleteKey(int key) //bat dau tu first liên kết struct node* current = head; struct node* previous = NULL; //neu menu la trong if(head == NULL) return NULL; //duyet qua danh mục while(current->key != key) //neu day la last node if(current->next == NULL) return NULL; else //luu tham chieu toi links hien tai previous = current; //di chuyen toi next liên kết current = current->next; //cap nhat links if(current == head) //thay doi first de tro toi next link head = head->next; else //bo qua liên kết hien tai previous->next = current->next; return current;// ham sap xepvoid sort() int i, j, k, tempKey, tempData ; struct node *current; struct node *next; int size = length(); k = form size ; for ( i = 0 ; i next ; for ( j = 1 ; j data > next->data ) tempData = current->data ; current->data = next->data; next->data = tempData ; tempKey = current->key; current->key = next->key; next->key = tempKey; current = current->next; next = next->next; }// đam mê dao nguoc listvoid reverse(struct node** head_ref) struct node* prev = NULL; struct node* current = *head_ref; struct node* next; while (current != NULL) next = current->next; current->next = prev; prev = current; current = next; *head_ref = prev;main() insertFirst(1,10); insertFirst(2,20); insertFirst(3,30); insertFirst(4,1); insertFirst(5,40); insertFirst(6,56); printf("Danh sach ban dau: "); //in danh sach printList(); while(!isEmpty()) struct node *temp = deleteFirst(); printf(" Gia tri bi xoa:"); printf("(%d,%d) ",temp->key,temp->data); printf(" Danh sach sau khi da xoa gia tri: "); printList(); insertFirst(1,10); insertFirst(2,20); insertFirst(3,30); insertFirst(4,1); insertFirst(5,40); insertFirst(6,56); printf(" Phuc hoi danh sach: "); printList(); printf(" "); struct node *foundLink = find(4); if(foundLink != NULL) printf("Tim vậy phan tu: "); printf("(%d,%d) ",foundLink->key,foundLink->data); printf(" "); else printf("Khong tim vắt phan tu."); deleteKey(4); printf("Danh sach, sau khi xoa mot phan tu: "); printList(); printf(" "); foundLink = find(4); if(foundLink != NULL) printf("Tim cụ phan tu: "); printf("(%d,%d) ",foundLink->key,foundLink->data); printf(" "); else printf("Khong tim thay phan tu."); printf(" "); sort(); printf("Danh sach sau khoản thời gian duoc sap xep: "); printList(); reverse(&head); printf(" Danh sach sau khi bi dao nguoc: "); printList();Kết quả
Biên dịch với chạy chương trình C trên sẽ mang đến kết quả:

IV. Nhập Xuất Danh Sách link Đơn C++
Tùy theo kiểu danh sách bạn là gì mà phương pháp nhập xuất khác nhau. Bài viết này bản thân nhập xuất số nguyên nên có phần đơn giản hơn
Mình đã nhập vào phần tử cho danh sách link đơn bằng con trỏ. Nếu nhập vào bởi 0 thì đã dừng nhập. Thêm thành phần vào list mình thực hiện hàm chèn cuối Insert_Last
// Hàm nhập danh sách số nguyên từ keyboard void Input(List &L) Init(L); tác phẩm x; int i=1; do cout>x; if (x!=0) Insert_Last(L,x); i++; while (x!=0); // nếu nhập x = 0 thì dừng nhập //Ban co the dung cach khac
V. Thu xếp Danh Sách links Đơn C++
Ở phần chuẩn bị xếp thành phần trong danh sách links đơn, bản thân sẽ thực hiện sắp xếp bằng cách so sánh và đổi thay giá trị data chứ không đổi khác Node. Tức là chỉ so sánh các giá trị data rồi sắp đến xếp, các Node vẫn không thay đổi không dịch chuyển.

Thao tác sắp xếp trong list về căn bản tương tự giống như những thuật toán thu xếp khác, đơn giản chỉ là chăm chú từng phần tử rồi so sánh với nhau, sau ấy hoán đổi vị trí của chúng.
Đầu tiên ta tất cả một vòng lặp For áp dụng biến pTmp để lặp từng bộ phận trong danh sách, vòng lặp For đồ vật hai thực hiện biến pTmp2 nhằm lặp từng bộ phận trong danh sách.
Nếu pTmp > pTmp2 thì hoán đổi địa điểm giữa chúng, nếu pTmp pNext) //for loop lắp thêm hai for(Node *pTmp2=pTmp->pNext;pTmp2!=NULL;pTmp2=pTmp2->pNext) if(pTmp->data>pTmp2->data) // nếu quý hiếm trước > quý giá sau thì hoán đổi hai địa điểm int tmp=pTmp->data; pTmp->data=pTmp2->data; pTmp2->data=tmp;
VI. Cài Đặt Danh Sách links Đơn C++
Trước thời gian đi vào setup danh sách link đơn, hãy chắc chắn là rằng chúng ta đã nắm rõ phần nhỏ trỏ và cấp phép động vào C++. Bởi danh sách liên kết đơn là một cấu trúc dữ liệu động, nếu bạn không nắm vững con trỏ và cấp phép động sẽ rất khó để các bạn hiểu được nội dung bài viết này. Nếu như bạn cảm thấy không tự tin, hãy dành riêng ít thời gian để xem bài viết này của mình. Còn bây chừ thì bước đầu thôi!
Tạo node
Danh sách link đơn được chế tạo ra thành từ nhiều node, bởi vì đó, bọn họ sẽ thuộc đi trường đoản cú node trước. Một node bao gồm hai yếu tố là thành phần dữ liệu và nguyên tố liên kết. Nguyên tố dữ liệu rất có thể là kiểu dữ liệu có sẵn hoặc chúng ta tự có mang (struct xuất xắc class…), trong bài viết này để đơn giản mình sẽ sử dụng kiểu int dồn phần dữ liệu. Thành phần links là địa chỉ đương nhiên đã là con trỏ, nhỏ trỏ này trỏ đến node tiếp theo, bởi vì đó, con trỏ này là bé trỏ trỏ vào 1 node.
struct Node int data; Node* next;;Để tạo nên một node mới, ta tiến hành cấp phát động cho node mới, khởi tạo thành giá trị ban đầu và trả về địa chỉ cửa hàng của node mới được cấp cho phát.
Tạo danh sách links đơn
Ta đã chiếm lĩnh được thành phần tạo cho danh sách liên kết đơn là node, tiếp theo chúng ta cần quản lý chúng bằng phương thức biết được bộ phận đầu với cuối. Vị mỗi phần tử đều liên kết với bộ phận kế vậy yêu cầu tả chỉ việc biết phần tử đầu với cuối là có thể cai quản được list này. Vậy đơn giản ta nên tạo 1 kết cấu lưu trữ showroom phần tử đầu (head) và thành phần cuối (hay thành phần đuôi tail).
struct LinkedList Node* head; Node* tail;;Khi bắt đầu tạo danh sách, danh sách sẽ không có thành phần nào, do đó head với tail ko trỏ vào đâu cả, ta đang gán chúng bằng NULL. Ta xuất bản hàm tạo list như sau:
void CreateList(LinkedList& l) l.head = NULL; l.tail = NULL;Bây tiếng để tạo thành một danh sách, ta làm cho như sau:
LinkedList list;CreateList(list); // Gán head cùng tail bằng NULL
Thêm bộ phận vào danh sách
Thêm vào đầuĐể thêm node vào đầu danh sách, trước hết ta buộc phải kiếm tra xem danh sách đó có rỗng giỏi không, nếu list rỗng, ta chỉ cần gán head và tail của danh sách bằng node đó. Ngược lại nếu danh sách không rỗng, ta triển khai trỏ thành phần liên kết vào head, tiếp đến gán lại head bởi node mới.

Như trong hình trên, chúng ta thêm node có data bằng 0 vào danh sách. Ta thực hiện trỏ next của node kia vào head của list (chính là node đầu tiên của danh sách có data bởi 1), kế tiếp ta trỏ head vào node bao gồm data 0 vừa mới được thêm. Vậy là thành phần đó đã nằm ở đầu danh sách rồi.
Thêm vào cuối
Tương tự, nhằm thêm node vào thời điểm cuối danh sách, đầu tiên ta reviews xem list rỗng tốt không, rỗng thì gán head với tail đều bằng node mới. Còn nếu không rỗng, ta tiến hành trỏ tail->next vào node mới, sau đó gán lại tail bằng node new (vì hiện nay node bắt đầu thêm đó là tail).

Trong hình trên, chúng ta thực hiện tại thêm node bao gồm data bằng 6 vào danh sách. Tail lúc này là node bao gồm data 5, thực hiện gán tail->next bằng node new để nối thêm nó vào đuôi danh sách, hôm nay node mới trở thành thành phần cuối danh sách nên ta gán tail lại bởi node mới.
Thêm vào sau node bất kỳ
Để thêm một node p vào sau node q bất kỳ, đầu tiên ta bắt buộc kiếm tra xem node q bao gồm NULL hay không, giả dụ node q là NULL có nghĩa là danh sách rỗng, vậy thì ta sẽ tiếp tế đầu danh sách. Trường hợp node q không NULL, có nghĩa là tồn tại trong danh sách, ta thực hiện trỏ p->next = q->next, tiếp đến q->next = p. Tiếp theo bọn họ kiểm tra coi node q trước đó có phải là node cuối hay không, ví như node q là node cuối thì thêm p. Vào, p. Sẽ thành node cuối đề xuất ta gán lại tail = p.

Trong hình trên, ta thêm node tất cả data bởi 4 (node p) vào sau cùng node có data bởi 3 (node q). Ta trỏ next của node phường vào next của node q tức là node gồm data bởi 5, kế tiếp trỏ next của node q vào node p. Vậy là node p. đã được cấp dưỡng danh sách.
Xóa thành phần khỏi danh sách
Xóa ở đầu
Để xóa phần tử ở đầu danh sách, ta khám nghiệm xem list đó tất cả rỗng xuất xắc không, nếu như rỗng, ta không buộc phải xóa, trả về công dụng là 0. Nếu danh sách không rỗng, ta triển khai lưu node head lại, tiếp đến gán head bởi next của node head, sau đó xóa node head đi. Tiếp theo ta yêu cầu kiểm tra xem danh sách vừa bị xóa đi node head tất cả rỗng tốt không, trường hợp rỗng ta gán lại tail bởi NULL luôn tiếp nối trả về công dụng 1.
Lưu ý trước khi xóa node head đi, ta dùng trở thành tham chiếu x để lưu trữ lại quý hiếm của node bị hủy nhằm sử dụng.

Trong hình trên, mình tiến hành xóa node trước tiên có data bởi 0. Bản thân trỏ head mang lại next của node 0 (hiện sẽ là head), thì head hôm nay sẽ là node 1, tiếp nối mình diệt đi node 0 là được.
Xóa ở sau node bất kỳ
Để xóa một node p. Sau node q bất kỳ, ta kiểm soát xem node q tất cả NULL tốt không, nếu node q NULL thì ko tồn trên trong danh sách, vì vậy trả về 0, ko xóa. Nếu như node q không giống NULL nhưng mà next của q là NULL, có nghĩa là p bởi NULL thì ko xóa, trả về 0 (do sau q không tồn tại node như thế nào cả, q là tail). Nếu như node p. Tồn tại, ta tiến hành kiểm tra xem node p. Có phải là tail xuất xắc không, nếu node p là tail thì gán lại tail là q, tức là node trước đó để xóa node phường đi.
Trong hình trên, ta triển khai xóa node có data 3 (node p) sau node bao gồm data 2 (node q). Ta trỏ next của node q vào next của node p tức là node tất cả data 4, sau đó xóa node p đi là xong.
Duyệt list và in
Sau khi tất cả các làm việc thêm, xóa, chúng ta cũng có thể in ra danh sách để khám nghiệm xem có vận động đúng hay không. Để in danh sách, ta duyệt từ trên đầu đến cuối danh sách và in ra trong lúc duyệt. Ta gán một node bởi head, tiếp đến kiểm tra coi node đó tất cả NULL giỏi không, không thì in ra data của node đó, kế tiếp gán tiếp node đó bởi next của chính nó tức node đó bây chừ là node tiếp theo, cứ như vậy cho đến hết.
Lấy quý hiếm node bất kỳ
Để lấy giá trị bộ phận trong danh sách, ta triển khai duyệt tương tự như khi in ấn phần tử. Ta sẽ tạo nên một trở thành đếm để hiểu vị trí hiện tại, chăm bẵm qua những node cho tới khi node bởi NULL hoặc biến đếm bởi với vị trí node yêu cầu lấy. Kiểm soát xem nếu node khác NULL và biến đếm bởi vị trí phải lấy, ta đã trả về địa chỉ cửa hàng của node đó, trái lại trả về NULL (danh sách rỗng hoặc là vị trí đề xuất lấy nằm ko kể phạm vi của danh sách).
Tìm kiếm bộ phận trong danh sách
Ý tưởng kiếm tìm kiếm thành phần cũng là chăm sóc danh sách, ví như như chưa tìm thấy thì tiếp tục duyệt. Sau khi kết thúc duyệt, ta chỉ cần kiểm tra coi node phê chuẩn có bởi NULL tuyệt không, ví như không tức là đã kiếm tìm thấy, ta vẫn trả về add của node đó.
Đếm số thành phần của danh sách
Đếm số phần tử thì cũng tương tự, ta vận dụng duyệt từ trên đầu đếm cuối và đếm số node.
Xóa danh sách
Để xóa danh sách, ta cần hủy tất cả các node có nghĩa là duyệt cùng hủy từng node. Ở trên đây mình sẽ dùng lại hàm RemoveHead. Đầu tiên, ta gán một node bởi head, bình chọn nếu node đó khác NULL thì hotline RemoveHead với gán lại node bởi head tiếp, cứ lặp như vậy cho đến khi node kia NULL thì thôi. Sau khi xóa không còn tất cả thành phần thì gán lại tail bởi NULL.
VII. Code Danh Sách liên kết Đơn sinh viên C++
Đề bài: sản xuất chương trình làm chủ sinh viên bằng DSLK đơn
Cho 1 sinh viên có cấu trúc: mã (int), thương hiệu (char *). Sử dụng danh sách links đơn với bé trỏ phead để thao tác:
Khởi tạo menu dạng bé trỏThêm node vào cuối danh sáchSắp xếp theo mãXóa nodeChương trình làm chủ sinh viên thực hiện DSLK đơn
Chúng ta đã lần lượt tạo kết cấu sinh viên, cấu trúc danh sách link đơn cùng các thao tác liên quan.
Đầu tiên chúng ta buộc phải khởi tạo một kết cấu sinh viên với mã số sv ma và tên sv ten.
Xem thêm: 5 Cách Xông Hơi Bằng Nước Muối Sinh Lý Trong Làm Đẹp, Tác Dụng Của Nước Muối Sinh Lý Trong Làm Đẹp
//tao cau truc sinh vienstruct SinhVien int ma; char ten<150>;;Tiếp mang đến tạo cấu tạo dữ liệu của danh sách link đơn với mức giá trị data và nhỏ trỏ pNext. Khởi tạo nên giá trị mang đến pHead với pTail bởi NULL.
//tao cau truc danh sach lien ket donstruct Node SinhVien *data; Node *pNext;;struct SingleList Node *pHead;;//khoi tao danh sach lien ket donvoid Initialize(SingleList *&list) list=new SingleList; list->pHead=NULL;Tạo 1 hàm NhapSinhVien() dùng cấu trúc SinhVien để nhập những tin tức của sv như: MSSV cùng tên sinh viên
SinhVien *NhapSinhVien() SinhVien *sv=new SinhVien; cout>sv->ma; cin.ignore(); coutten); return sv;Bây giờ chúng ta bắt đầu tạo Node với những thông tin của cấu trúc SinhVien, tiếp đến thêm Node vào cuối danh sách.
//tao node sinh vienNode *CreateNode(SinhVien *sv) Node *pNode=new Node; if(pNode!=NULL) pNode->data=sv; pNode->pNext=NULL; else coutpHead==NULL) list->pHead=pNode; else Node *pTmp=list->pHead; while(pTmp->pNext!=NULL) pTmp=pTmp->pNext; pTmp->pNext=pNode; Sau thời điểm thêm Node vào danh sách ta tiến hành những thao tác theo ý kiến đề nghị của đề bài. Đầu tiên là việc sắp xếp các sinh viên theo MSSV.
Ở bài bác tìm tìm và thu xếp trong danh sách liên kết đơn mình đã giới thiệu chúng ta thao tác sắp tới xếp. Dựa vào đó ta chỉ cần chuyển đổi một chút sẽ có ngay hàm sắp xếp SortList() theo MSSV.
void SortList(SingleList *&list) for(Node *pTmp=list->pHead;pTmp!=NULL;pTmp=pTmp->pNext) for(Node *pTmp2=pTmp->pNext;pTmp2!=NULL;pTmp2=pTmp2->pNext) SinhVien *svTmp=pTmp->data; SinhVien *svTmp2=pTmp2->data; if(svTmp2->mama) int ma=svTmp->ma; char ten<150>; strcpy(ten,svTmp->ten); svTmp->ma=svTmp2->ma; strcpy(svTmp->ten,svTmp2->ten); svTmp2->ma=ma; strcpy(svTmp2->ten,ten); Tương trường đoản cú như hàm sắp tới xếp, để xóa một sinh viên phụ thuộc tên ta triển khai vòng lặp while lặp từng bộ phận trong danh sách. Nếu bộ phận đó trùng với bộ phận được nhập vào từ bàn phím ta tiến hành delete thành phần đó ra khỏi danh sách.
void RemoveNode(SingleList *&list,int ma) Node *pDel=list->pHead; if(pDel==NULL) coutdata; if(sv->ma==ma) break; pPre=pDel; pDel=pDel->pNext; if(pDel==NULL) coutpHead) list->pHead=list->pHead->pNext; pDel->pNext=NULL; delete pDel; pDel=NULL; else pPre->pNext=pDel->pNext; pDel->pNext=NULL; delete pDel; pDel=NULL; Sau khi thực hiện tạo các thao tác, ta chỉ cần tạo hàm main() và điện thoại tư vấn các thao tác làm việc đó ra để sử dụng.
int main(int argc, char** argv) SingleList *list; Initialize(list); SinhVien *teo=NhapSinhVien(); InsertLast(list,teo); SinhVien *ty=NhapSinhVien(); InsertLast(list,ty); SinhVien *bin=NhapSinhVien(); InsertLast(list,bin); PrintList(list); SortList(list); cout>ma; RemoveNode(list,ma); coutFull code:
#include #include #include using namespace std;//tao cau truc sinh vienstruct SinhVien int ma; char ten<150>;;//tao cau truc danh sach lien ket donstruct Node SinhVien *data; Node *pNext;;struct SingleList Node *pHead;;//khoi tao danh sach lien ket donvoid Initialize(SingleList *&list) list=new SingleList; list->pHead=NULL;//nhap thong tin sinh vienSinhVien *NhapSinhVien() SinhVien *sv=new SinhVien; cout>sv->ma; cin.ignore(); coutten); return sv;//tao node sinh vienNode *CreateNode(SinhVien *sv) Node *pNode=new Node; if(pNode!=NULL) pNode->data=sv; pNode->pNext=NULL; else coutpHead==NULL) list->pHead=pNode; else Node *pTmp=list->pHead; while(pTmp->pNext!=NULL) pTmp=pTmp->pNext; pTmp->pNext=pNode; //hien thi danh sachvoid PrintList(SingleList *list) Node *pTmp=list->pHead; if(pTmp==NULL) coutdata; coutmatenpNext; //sap xepvoid SortList(SingleList *&list) for(Node *pTmp=list->pHead;pTmp!=NULL;pTmp=pTmp->pNext) for(Node *pTmp2=pTmp->pNext;pTmp2!=NULL;pTmp2=pTmp2->pNext) SinhVien *svTmp=pTmp->data; SinhVien *svTmp2=pTmp2->data; if(svTmp2->mama) int ma=svTmp->ma; char ten<150>; strcpy(ten,svTmp->ten); svTmp->ma=svTmp2->ma; strcpy(svTmp->ten,svTmp2->ten); svTmp2->ma=ma; strcpy(svTmp2->ten,ten); //xoavoid RemoveNode(SingleList *&list,int ma) Node *pDel=list->pHead; if(pDel==NULL) coutdata; if(sv->ma==ma) break; pPre=pDel; pDel=pDel->pNext; if(pDel==NULL) coutpHead) list->pHead=list->pHead->pNext; pDel->pNext=NULL; delete pDel; pDel=NULL; else pPre->pNext=pDel->pNext; pDel->pNext=NULL; delete pDel; pDel=NULL; int main(int argc, char** argv) SingleList *list; Initialize(list); SinhVien *teo=NhapSinhVien(); InsertLast(list,teo); SinhVien *ty=NhapSinhVien(); InsertLast(list,ty); SinhVien *bin=NhapSinhVien(); InsertLast(list,bin); PrintList(list); SortList(list); cout>ma; RemoveNode(list,ma); coutKết quả:

VIII. Xóa bộ phận Trong Danh Sách links Đơn C++
Trong hướng dẫn này mình sẽ reviews tới các bạn cách xóa Node vào danh sách links đơn.
Chúng ta sẽ cùng nhau mày mò 3 ví dụ thời gian xóa 1 Node ngoài danh sách links đơn:
Xóa Node sinh hoạt đầu danh sách link đơn.Xóa Node sinh sống cuối danh sách link đơn.Xóa Node trọng điểm danh sách links đơn.+ Xóa Node sinh hoạt đầu danh sách link đơn
Trong ngôi trường hợp họ muốn xóa một Node, nhưng Node đó lại nằm sống đầu danh sách. Đây là một trường hợp đặc biệt, các bạn hãy xem quá trình thực hiện sau đây:
Giả sử họ có một Node pDel là Node cần xóa với một danh sách link đơn.

Bước 1: do Node phải xóa ngơi nghỉ đầu danh sách, tức là ngay node pHead. Vày vậy chúng ta cần di chuyển pHead từ pDel thanh lịch Node kế tiếp: list.pHead = list.pHead -> pNext

Bước 2: Sau khi dịch chuyển pHead thanh lịch Node kế tiếp, chúng ta sẽ ngắt mối link giữa pDel với Node vùng phía đằng sau nó: pDel -> pNext = Null.

Bước 3: hiện giờ pDel không hề liên kết với bất kì Node làm sao trong list nữa, chúng ta đã hoàn toàn có thể xóa Node này. Delete pDel

// nếu pDel == list.pHead, có nghĩa là số bắt buộc xóa ngơi nghỉ đầu list if(pDel == list.pHead) list.pHead = list.pHead -> pNext; pDel -> pNext = NULL; delete pDel; pDel = NULL;
+ Xóa Node sinh hoạt cuối danh sách link đơn.
Trong trường vừa lòng Node ước ao xóa lại nằm ở vị trí cuối danh sách, giống như như việc xóa sống đầu danh sách. Ta chỉ cần di đưa pTail về Node trước đó (pPre) và đổi khác pNext = NULL.
Sau khi dịch rời pTail về Node trước đó và ngắt mối links giữa pPre cùng với pDel, ta triển khai xóa Node pDel: delete pDel
//Nếu pDel == list.pTail, tức là số bắt buộc xóa làm việc cuối danh sách if(pDel -> pNext == NULL) list.pTail = pPre; pPre -> pNext = NULL; delete pDel; pDel = NULL;
+ Xóa Node chính giữa danh sách links đơn.
Và trường vừa lòng cuối cùng, khi xóa Node mà Node kia không nằm đầu cũng ko nằm cuối danh sách, ta thực hiện công việc như sau:Khi ta ao ước xóa một Node trọng điểm danh sách, thứ nhất ta cần xác định Node bắt buộc xóa pDel với Node đứng trước nó pPre.

Sau khi xác định được pDel với pPre, ta biến hóa mối link giữa pPre mang đến pTail (pPre -> pNext = pDel -> pNext) và mang đến pDel -> pNext == NULL. Các chúng ta cũng có thể xem hướng mũi tên để hiểu được quá trình thực hiện tại của nó.

Ta hoàn toàn có thể xóa Node pDel khi đang ngắt mối liên kết giữa nó với các Node khác: delete pDel
// và trường hợp ở đầu cuối số ước ao xóa nằm tại vị trí giữa danh sách else pPre -> pNext = pDel -> pNext; pDel -> pNext = NULL; delete pDel; pDel = NULL;
+ lấy ví dụ như xóa Node vào danh sách liên kết đơn
Chúng ta đã sử dụng tài liệu ở lấy một ví dụ trước để tiến hành xóa mang lại ví dụ này, vừa hoàn toàn có thể ôn lại kiến thức cũ vừa áp dụng kỹ năng và kiến thức mới.#include using namespace std;/* Khai báo giá trị data và con trỏ pNext trỏ tới phần tử kế tiếp */struct Node int data;// cực hiếm data của node Node *pNext;// bé trỏ pNext; /* Khai báo Node đầu pHead cùng Node cuối pTail*/struct SingleList Node *pHead; //Node đầu pHead Node *pTail; // Node cuối pTail; /* khởi sản xuất giá trị mang lại Node đầu và Node cuối */void Initialize(SingleList &list) list.pHead=list.pTail=NULL;// khởi chế tạo giá trị đến Node đầu với Node cuối là Null /* Đếm số bộ phận trong danh sách */ int SizeOfList(SingleList list) Node *pTmp=list.pHead; int nSize=0; while(pTmp!=NULL) pTmp=pTmp->pNext; nSize++; return nSize; /* tạo nên Node trong danh sách link đơn */Node *CreateNode(int d) Node *pNode=new Node; //sử dụng pNode để sản xuất một Node mới if(pNode!=NULL) // nếu như pNode != Null, có nghĩa là pNode có mức giá trị thì pNode->data=d; // gán quý hiếm data đến d pNode->pNext=NULL;// với cho bé trỏ pNext trỏ tới cực hiếm Null else // nếu như pNode == Null, tức là pNode không có giá trị thì xuất thông tin coutpNext=list.pHead; list.pHead=pNode; /* chèn node vào thời điểm cuối danh sách */void InsertLast(SingleList &list,int d) Node *pNode=CreateNode(d); if(list.pTail==NULL) list.pHead=list.pTail=pNode; else list.pTail->pNext=pNode; list.pTail=pNode; /* chèn node vào giữa list */void InsertMid(SingleList &list, int pos, int d) // nếu pos = SizeOfList(list)) coutpNext; i++; //sau khi kiếm được thì biến đổi con trỏ pNext pPre ->pNext=pNode; pNode->pNext=pIns; /* xóa node ngoài danh sách link */void RemoveNode(SingleList &list, int d) Node *pDel = list.pHead; // tạo thành một node pDel để xóa //Nếu pDel == Null thì list rỗng if(pDel == NULL) cout data == d) break; pPre = pDel; pDel = pDel -> pNext; //Nếu pDel == null có nghĩa là không search thấy số nên xóa if(pDel == NULL) cout pNext; pDel -> pNext = NULL; delete pDel; pDel = NULL; //Nếu pDel == list.pTail, tức là số đề nghị xóa làm việc cuối danh sách else if(pDel -> pNext == NULL) list.pTail = pPre; pPre -> pNext = NULL; delete pDel; pDel = NULL; // và trường hợp sau cùng số hy vọng xóa nằm tại vị trí giữa list else pPre -> pNext = pDel -> pNext; pDel -> pNext = NULL; delete pDel; pDel = NULL; } /* hàm xuất dữ liệu */void PrintList(SingleList list) Node *pTmp=list.pHead; if(pTmp==NULL) coutdatapNext; int main() { SingleList list; Initialize(list); //Thêm node đầu danh sách InsertFirst(list, 5); InsertFirst(list, 7); InsertFirst(list, 3); coutKết quả:

IX. Bài xích Tập Danh Sách links Đơn C++
Bài tập danh sách links đơn dưới đấy là 1 dạng bài tập tổng vừa lòng giúp những bạn ôn luyện lại kỹ năng về danh sách links đơn tương tự như các kỹ năng và kiến thức khác về lập trình sẵn C. Sau bài học này, kề bên kiến thức về danh sách links đơn, bạn cũng trở thành nắm được:
Đọc ghi tệp trong ngôn ngữ CCách xử lý tài liệu văn phiên bản trong C: bóc tách chuỗi, đưa chuỗi về số, …Làm vấn đề với kiểu tài liệu tự quan niệm (structure)Và các kiến thức căn bản khác của lập trình sẵn CĐề bài tập danh sách links đơn
Viết chương trình trong ngữ điệu C thực hiện các đề xuất sau:
Khai báo cấu trúc dữ liệu để tổ chức triển khai danh sách liên kết đơn thống trị các tỉnh/thành phố của Việt Nam. Tin tức của từng tỉnh/thành phố bao gồm: Mã tỉnh, thương hiệu tỉnh, diện tích, dân số.Cài đặt các làm việc cơ bạn dạng (thêm ở vị trí bất kỳ; sửa, xóa theo mã (code), chăm chú danh sách).Tính tổng diện tích s của tất cả các tỉnh thành.Tìm địa chỉ của node của tỉnh giấc có diện tích s lớn nhất.Tìm tỉnh/thành phố có dân số lớn nhất.Sắp xếp list theo mã tỉnh/thành phố.Sắp xếp danh sách tăng ngày một nhiều theo diện tích.Yêu cầu:
Viết chương trình ví dụ hóa những chức năng trên, tín đồ sử dụng có thể tương tác qua menu được cho phép lựa chọn công dụng mà bọn họ muốn.Ban đầu, danh sách tỉnh/thành phố được nhập tự động hóa từ 1 tập tin (Text file .txt) mang đến trước bao gồm nội dungLời giải bài xích tập danh sách liên kết đơn
+ Xây dựng các kiểu dữ liệu cần thiết
Chúng ta nên định nghĩa kiểu tài liệu City theo yêu cầu của đề bài, bao gồm có các trường mã (code), thương hiệu (name), diện tích s (area) và số lượng dân sinh (population).Chúng ta cũng cần định nghĩa hình dạng dữ liệu cho một Node của danh sách liên kết, từng Node sẽ gồm tài liệu và bé trỏ next.Trong bài này, mình mang sử code (mã tỉnh,thành phố) là ko trùng lặp bắt buộc sẽ bỏ lỡ bước kiểm tra.// Khai báo kiểu kết cấu Citystruct đô thị int code; char name<100>; float area; int population;;// Định nghĩa đến kiểu "struct City" 1 tên bắt đầu ngắn gọn gàng hơn, thay do khai báo hình trạng "struct City" thì ta chỉ cần dùng "City"typedef struct city City; // Khai báo kiểu cấu trúc LinkedListstruct LinkedList city city; struct LinkedList *next; ; // Định nghĩa cho kiểu "struct LinkedList" 1 tên mới ngắn gọn gàng hơn, thay vày khai báo hình dáng "struct LinkedList" thì ta chỉ cần dùng "Node" typedef struct LinkedList *Node;+ Xây dựng các hàm khởi tạo
Với danh sách liên kết, bọn họ cũng buộc phải khởi sinh sản Node trước tiên cho nó, câu hỏi khởi tạo rất dễ dàng chỉ bằng cách gán Node đó bằng NULL, tức là chưa xuất hiện dữ liệu (chưa tất cả Node làm sao cả)// Hàm khởi tạo ra Node đầu tiên của LinkedListNode initHead() Node head; head = NULL; return head;Chúng ta cũng trở nên cần hàm khởi chế tác 1 Node khi vẫn có tài liệu của Node đó. Sau khi khởi tạo nên thì chúng ta cũng có thể thêm nó vào danh sách. // Hàm tạo bắt đầu 1 Node vào LinkedList Node createNode(City city) Node temp; // Khai báo 1 Node temp = (Node)malloc(sizeof(struct LinkedList)); // cấp phát vùng nhớ mang đến Node temp->next = NULL;// đến next trỏ tới NULL temp->city = city; // Gán giá chỉ trị cho Node return temp;Lưu ý: Ta cần cho bé trỏ next của Node được khởi tạo bởi NULL, tức là chưa trỏ tới đâu. Tránh sự cố nó trỏ ltinh tinh trong cỗ nhớ.
Chúng ta cần có 1 hàm khởi sinh sản giá trị cho kiểu đô thị đã khái niệm ở bên trên qua stdin (nhập từ console). Lý do là vị chương trình của chúng ta có tính năng thêm, sửa dữ liệu của một Node. Khi đó, ta sẽ hotline tới hàm này để sản xuất dữ liệu thông qua stdin.City createCity() đô thị newCity; printf("Nhap code: "); scanf("%d", &newCity.code); printf("Nhap ten: "); getchar(); // bỏ qua mất " " trong bộ đệm fgets(newCity.name, 100, stdin); // Xóa ngơi nghỉ cuối chuỗi vừa nhập nếu có if ((p=strchr(newCity.name, " ")) != NULL) *p = " "; printf("Nhap dien tich: "); scanf("%f", &newCity.area); printf("Nhap dan so: "); scanf("%d", &newCity.population); return newCity;Lưu ý:
Chúng ta phải hàm getchar() nhằm xóa cỗ đệm, ví dụ là xóa sổ ký từ bỏ ‘ ’ còn sót sinh sống lần nhập mã tỉnh/thành phố trước đó. Nếu không xóa, hàm nhập chuỗi sẽ nhận thấy ‘ ’ trong bộ đệm là hành động xong nhập chuỗi.Hàm fgets() gọi cả newline, đề xuất ta buộc phải xóa đi nếu như không muốn trường name (tên) bao gồm ký trường đoản cú này.+ những hàm làm việc với danh sách liên kết
Trong câu hỏi này, họ có các hành động thêm, sửa, xóa Node. Vì đó, họ cần xây dựng những hàm sau:
Hàm addHead: Thêm Node vào đầu DSLKHàm addTail: Thêm Node vào cuối DSLKHàm addAt: Thêm Node vào chỉ số bất kỳ, thừa kế sử dụng hàm addHead cùng addTailHàm traverser: phê duyệt danh sáchHàm delHead: Xóa Node thứ nhất của DSLKHàm delTail: Xóa Node cuối của DSLKHàm delAt: Xóa Node tại chỉ số bất kỳ, cũng trở nên kế vượt hàm delHead và delTail sinh sống trênHàm findIndexByCode: tra cứu chỉ số của Node trong list theo mã code (mã tỉnh/thành)Các hàm này số đông là hàm cơ bản của DSLK đã có mình trình bày cụ thể tại bài bác danh sách links đơn. Bởi vì vậy, các bạn nào không biết thì hoàn toàn có thể quay lại đọc bài bác đó trước nha.
Các thao tác với danh sách, mình thích để trong vòng lặp để bạn dùng rất có thể lặp lại thao tác đó giả dụ cần. Người tiêu dùng sẽ gồm quyền chọn bao gồm thực hiện thao tác làm việc đó tiếp hay không ngay sau khi xong thao tác.char option;while (TRUE) // thao tác ở phía trên scanf("%c", &option); if (option == "N" # Hàm để mắt danh sách
void traverser(Node head) printf("Danh sach hien tai: "); printf("------------------------------------------------------------------------------------------------------------ "); printf("%10s%50s%20s%20s ", "Ma Tinh/TP", "Tinh thanh", "Dien tich", "Dan so"); for(Node p = head; p. != NULL; p. = p->next) printf("%10d%50s%20f%20d ", p->city.code, p->city.name, p->city.area, p->city.population); printf("------------------------------------------------------------------------------------------------------------ ");Ở đây, ta đơn giản và dễ dàng là ban đầu từ Node trước tiên (head) cho tới khi cần thiết nhảy lịch sự Node tiếp theo.Chúng ta in ra dạng bảng bằng phương pháp sử dụng format trong hàm printf().# các hàm giao hàng thêm Node
// sản xuất cuốiNode addTail(Node head, đô thị value) Node temp,p;// Khai báo 2 Node tạm bợ temp và p temp = createNode(value);//Gọi hàm createNode để khởi tạo Node temp tất cả next trỏ cho tới NULL và quý giá là value if(head == NULL) head = temp; //Nếu linked các mục đang trống thì Node temp là head luôn else p = head;// Khởi tạo p. Trỏ cho tới head while(p->next != NULL) phường = p->next;//Duyệt danh sách link đến cuối. Node cuối là Node gồm next = NULL p->next = temp;//Gán next của thằng cuối = temp. Lúc ấy temp vẫn là thằng cuối(temp->next = NULL mà) return head; // thêm vào đầuNode addHead(Node head, thành phố value) Node temp = createNode(value); // Khởi chế tác Node temp với data = value if(head == NULL) head = temp; // //Nếu linked các mục đang trống thì Node temp là head luôn luôn else temp->next = head; // Trỏ next của temp = head lúc này head = temp; // Đổi head bây giờ = temp(Vì temp bây chừ là head new mà) return head; // Thêm vào ở "chỉ số" (bắt đầu tự 0) bất kỳ, nếu còn muốn thêm theo "vị trí" (bắt đầu tự 1) thì bớt position đi 1 đối chọi vịNode addAt(Node head, đô thị value, int position)Kết phù hợp với hàm khởi chế tạo City (createCity) phía trên, bạn cũng có thể hoàn chỉnh làm việc thêm Node vào list với hàm dưới đây:
Node delHead(Node head) if(head == NULL) printf(" Cha teo gi de xoa het!"); else head = head->next; return head; Node delTail(Node head) if (head == NULL // Xóa Node sinh hoạt "chỉ số" (bắt đầu tự 0) bất kỳNode delAt(Node head, int position) head == NULL Ở trên, họ đã tất cả hàm xóa sinh sống chỉ số bất kỳ, vậy nhằm xóa Node theo mã (code) cung cấp. Ta đề xuất viết thêm một hàm search chỉ số của Node tất cả dữ liệu tp mà mã code trùng với mức giá trị được cung cấp:
// Hàm tra cứu chỉ số của Node bao gồm dữ liệu thành phố mà mã code của chính nó trùng với giá trị buộc phải tìmint findIndexByCode(Node head, int code) int index = -1; for(Node phường = head; p != NULL; p. = p->next) index++; if (p->city.code == code) return index; return -1; // không tìm kiếm thấyNhư vậy, để hoàn hảo thao tác xóa Node theo mã tỉnh/thành phố. Ta sẽ thêm một hàm sau:
Node removeNode(Node head){ int code; char option; while (TRUE) { printf("========== Chon Node muon xoa =============== "); printf("Nhap ma tinh/thanh pho can xoa: "); scanf("%d", &code); int position = findIndexByCode(head, code); if (position Các chức năng thêm, xóa Node của danh sách đều phải sở hữu thể biến hóa Node head (Ex: xóa Node head). Vì đó, những hàm này đều buộc phải trả về quý hiếm là Node head new sau khi đổi khác (có thể vẫn duy trì nguyên).
# Hàm sửa giá trị Node trong DSLK
Hàm này chắc hẳn rằng không thể biến hóa Node head, vị đó chúng ta sẽ cần sử dụng kiểu voidĐơn giản là ta chăm sóc qua danh sách, nếu tìm thấy mã code tương ứng, sẽ cho những người dùng nhập dữ liệu mới cho Node đó.void editNode(Node head) int code; char option; thành phố newCity; while (TRUE) option == "n") break; # Hàm bố trí danh sách
void swapCityData(City *a, city *b) city tmp = *a; *a = *b; *b = tmp; // Hàm bố trí // nếu như sort theo code, thì byCode = 1, byArea = 0// ví như sort theo area, thì byCode = 0, byArea = 1// Nếu bố trí tăng dần dần thì desc = 0, bớt dần thì desc = 1void sortCities(Node head, int byCode, int byArea, int desc) for(Node phường = head; phường != NULL; p. = p->next) for(Node q = p->next; q != NULL; q = q->next) if (desc) if (byCode && p->city.code city.code) swapCityData(&p->city, &q->city); else if (byArea && p->city.area city.area) swapCityData(&p->city, &q->city); else if (byCode && p->city.code > q->city.code) swapCityData(&p->city, &q->city); else if (byArea && p->city.area > q->city.area) swapCityData(&p->city, &q->city); Hàm swap bọn họ cần dùng bé trỏ nhằm hàm thực hiện trực tiếp cực hiếm được truyền vào. Ta chỉ việc đổi cực hiếm của chúng mang lại nhau, chứ không yêu cầu đổi 2 Node (rắc rối lắm).Mình vậy ý rút gọn code bằng phương pháp cho những option thu xếp vào vào hàm sortCities. Tuy nhiên không tường minh lắm nhưng bóc ra thì nhiều năm quá.Hàm sắp xếp không thay đổi Node head, đề nghị hàm cũng không đề xuất trả về quý giá như những hàm thêm giỏi xóa Node.# những hàm công dụng khác
Ngoài những hàm thêm, sửa, xóa trên, đề bài bác còn yêu thương cầu một vài hàm tính tổng diện tích, tìm kiếm tỉnh/thành phố tất cả diện tích/dân số béo nhất, cùng cả sắp xếp danh sách.
Về cơ bản, những hàm này chỉ việc dựa trên thao tác duyệt list (traveser) là bao gồm thể hoàn thành rồi.
// Hàm tính tổng diện tích những thành phố trong DSLKfloat sumArea(Node head) float sum = 0; for(Node p. = head; phường != NULL; p. = p->next) sum += p->city.area; return sum; // Hàm tìm chỉ số của Node có diện tích lớn nhất (giả sử chỉ có 1)// trường hợp dữ liệu có không ít hơn 1, bọn họ tìm max rồi coi xét lại 1 đợt tiếp nhữa để kiếm tìm ra các Node có mức giá trị = max đóint indexOfMaxArea(Node head) int maxIndex = 0, index = 0; int maxArea = head->city.area; for(Node p = head; p != NULL; phường = p->next) if (p->city.area > maxArea) maxArea = p->city.area; maxIndex = index; index++; return maxIndex; // Hàm tìm kiếm Node có số lượng dân sinh lớn nhấtCity maxByPopulation(Node head) city city = head->city; for(Node p. = head; p. != NULL; p = p->next) if (p->city.population > city.population) city = p->city; return city;Thao tác đọc dữ liệu từ tệp
Đề bài xích yêu cầu họ cần khởi sản xuất danh sách ban sơ bằng biện pháp đọc tài liệu từ tệp. Do đó, bọn họ cần thêm 1 số hàm con nữa.
– Do dữ liệu tên tỉnh/thành phố có dấu cách nên mình chỉ biết phương pháp đọc từng chiếc vào xử lý. Do vậy, mình cần:
Hàm handleLineData: bóc dòng ra những thành phần con, rõ ràng là cho một dòng dữ liệu, đề xuất trả về cho khách hàng 1 City. Mình cần sử dụng hàm strtok để gia công việc bóc chuỗi.Hàm readData: Đọc tài liệu từ file, mỗi cái đọc được sẽ gọi tới hàm handleLineData phía trên. Sau khi có City, ta thêm nó vào danh sách bằng cách gọi tới addTail hoặc addHead hoặc addAt// Hàm tách các thành phần của 1 dòng trong fileCity handleLineData(char *line) thành phố city; city.code = INVALID_CITY_CODE; // Khởi sinh sản giá trị không phù hợp lệ. Sau đây ta có thể kiểm tra. Const char delimiter<> = " "; char *tmp; tmp = strtok(line, delimiter); if (tmp == NULL) printf("Du lieu khong dung dinh dang: %s", line); exit(EXIT_FAILURE); city.code = atoi(tmp); int index = 0; for (;;index++) tmp = strtok(NULL, delimiter); if (tmp == NULL) break; if (index == 0) strcpy(city.name, tmp); else if (index == 1) city.area = (float)atof(tmp); else if (index == 2) city.population = atoi(tmp); else printf("Du lieu khong dung dinh dang: %s", line); exit(EXIT_FAILURE); return city; // Hàm đọc dữ liệu từ tập tinNode readData(Node head, const char* fileName) FILE* tệp tin = fopen(fileName, "r"); if(!file) printf("Co loi lúc mo file : %s ", fileName); exit(EXIT_FAILURE); char line<500>; while (fgets(line, sizeof(line), file)) thành phố city = handleLineData(line); if (city.code != INVALID_CITY_CODE) head = addTail(head, city); fclose(file); return head;Như vậy là trả thiện, việc còn sót lại chỉ là đưa chúng nó vào hàm main theo 1 trơ trẽn tự do họ quy định.

X. Danh Sách links Đơn thống trị Sinh Viên C++
Hôm nay bản thân định viết về phần tiếp theo của opencv xử lý hình ảnh nhưng còn bài tập môn cấu tạo dữ liệu chưa kết thúc , sẵn tiện tôi vừa làm vừa ra bài bác này luôn .
Đề bài
Code
#include"iostream"#include"string"#include"stdlib.h"using namespace std;struct SinhVien int mssv; string name; string diachi; string ngaysinh; string lop;;typedef struct SinhVien sinhvien;struct node sinhvien *data; struct node* link;;typedef struct node Node;struct các mục Node* pHead; Node* pTail;;typedef struct danh sách List;void KhoiTaoList(List &l) l.pHead = l.pTail = NULL;void Input_ThongTin(sinhvien *sv) cin.ignore(); cout name); cout > sv->mssv; cin.ignore(); cout diachi); fflush(stdin); cout ngaysinh); fflush(stdin); cout lop);Node *KhoiTaoNode() { sinhvien* sv = new sinhvien; Input_ThongTin(sv); Node* p = new Node; if (p == NULL) cout data = sv; p->link = NULL; return p;void ThemVaoDauMotSinhVien(List &l, Node *p) if (l.pHead == NULL) l.pHead = l.pTail= p; else p->link = l.pHead; l.pHead = p; void Show(List l) { for (Node* k = l.pHead; k != NULL; k = k->link) cout data->mssvdata->name data->diachi data->ngaysinh data->lop data->mssv data->name data->diachi data->ngaysinh data->lop data->name) == 0 && l.pHead->link ==NULL) l.pHead = NULL; else for (Node* k = l.pHead; k != NULL; k = k->link) if (del.compare(k->data->name) == 0) g->link = k->link; k = g; g = k; void search(List l ) int mssv; cout > mssv; for (Node* k = l.pHead; k != NULL; k = k->link) if (k->data->mssv == mssv) showNode(k); void upgrade(List& l) int mssv; cout > mssv; for (Node* k = l.pHead; k != NULL; k = k->link) if (k->data->mssv == mssv) cout data); void DanhSachSinhVienChuaXepLop(List l) { for (Node* k = l.pHead; k != NULL; k = k->link) { if (k->data->lop == "") { cout Nhap 1 sinh vien moi . "; cout In danh sach sinh vien . "; cout Tim kiem sinh vien theo ma so . "; cout Sua thong tin sinh vien "; cout Xoa sinh vien khoi danh sach "; cout Lay danh sach sinh vien chua xep lop "; cout Thoat chuong trinh "; while (1){ cout > n; if (n == 1) { cout
