Bài tập DSLK kép
Câu Hỏi :\
Cho danh sách liên kết kép có cấu trúc:
struct hs
{
char ht [30];
float ns ;
hs* next;
hs* prev;
}
Gọi p là con trỏ trỏ tới nút đầu danh sách
a)Bổ sung một phần tử vào cuối danh sách.
b)Tìm và in ra họ tên các học sinh có năm sinh từ năm 1980 trở về đây.
c)Xóa một phần tử ở đầu danh sách.BÀI THAM KHẢO:
#include <iostream.h>
#include <stdio.h>
struct hs
{
char ht [30] ;
int ns ;
};
typedef struct node
{
hs info ;
node *next ;
node *prev;
};
struct List
{
node *head ;
node *tail ;
};
// Khởi tạo DS rỗng
void CreatList(List & L)
{
L.head = NULL ;
L.tail = NULL ;
}
node * new_ele = NULL;
// Nhập thông tin cho 1 phần tử
node* _input ()
{
node * q = new node ;
cout<< "\nHo ten : " ;
fflush (stdin) ;
gets ( q -> info.ht ) ;
cout<< "Nhap nam sinh : " ;
cin>> q -> info.ns ;
q -> next = q -> prev = NULL ;
return q ;
}
// Bổ sung 1 phần tử vào cuối danh sách
void AddTail (List & L )
{
new_ele = _input () ; // Nhập thông tin 1 ptu mới
if ( L.head == NULL ) // Kiểm tra DS rỗng
{
//Nếu rỗng thì
//head = new_ele;
//tail = head;
L.head = L.tail = new_ele ;
}
else
{
//Ngược lại
//tail = new_ele->prev;
//tail->next = new_ele;
//tail = new_ele;
new_ele -> prev = L.tail ;
L.tail -> next = new_ele;
L.tail = new_ele;
}
}
// In ra danh sách học sinh có nam sinh từ 1980 trở về dây
void Process ( List L )
{
node * p = L.head ; // con trỏ trỏ tới ptu đầu tiên của danh sách
if ( L.head == NULL ) //Kiểm tra DS rỗng
cout<< "\nDanh sach rong !!! " ;
cout<<"\n\n============================================\n";
cout<< "\nDanh sach nhung nguoi sinh sau nam 1980 : \n " ;
while ( p -> next != NULL )
{
if ( p -> info.ns > 1980 )
//Trong khi (p!=NULL)& ( p -> info.ns > 1980 )
//Th?c hi?n:
//Xu?t ra thông tin p
//p = p->next;
{
cout<<"\nHo ten : "<<p ->info.ht ;
cout<<"\nNam sinh :"<<p->info.ns;
cout<<"\n";
}
p = p->next;
}
}
//Xóa thông tin học sinh cuối danh sách
void DelTail ( List & L )
{
node * p ;
if ( L.tail != NULL ) // Nếu danh sách khác rỗng
{
L.tail = p ; //p là phần tử cần hủy
//Tách p ra khỏi xâu
L.tail = L.tail -> prev ;
L.tail -> next = NULL ;
delete p ; //Hủy biến do p trỏ đến
if ( L.head == NULL )
//Nếu nút dầu là rỗng thì nút cuối rỗng
L.tail = NULL ;
else
//nguợc lại head->prev = NULL;
L.head -> prev = NULL ;
}
}
void main ()
{
List L ;
CreatList(L) ;
int t = 1 ;
cout<<"\nThem 1 phan tu vao cuoi danh sach ";
while ( t ==1 )
{
AddTail ( L) ;
cout<< "Tiep tuc nhap ? ( 1 / 0 ) : " ;
cin>> t ;
}
Process( L ) ;
}