Một số thao tác trên danh sách liên kết đơn
Trong bài này là một số thao tác cơ bản trên dslk đơn có trường dữ liệu kiểu nguyên
#include<iostream.h>
#include<fstream.h>
//khai báo 1 node
struct node{
int data;
node*next;
};
struct dslk{
node* head;
node* tail;
};
//Thu tuc cho phep tao 1 node khi có gia tri x
//@param x la gia tri cua nut
//@return con tro tro den nut chua gia tri x
node* createNode(int x){
node *p; p=new node;
if(p==NULL)return NULL;
p->data=x;
p->next=NULL;
return p;
}
///Ham khoi tao 1 dslk
//@param l la danh sach can khoi tao
void init( dslk &l){
l.head=NULL;
l.tail=NULL;
}
//ham them 1 nut vao dau dslk
//param p la nut can them
void addFirst(dslk &l,node*p){
if(l.head==NULL)
l.head=l.tail=p;
else{
p->next=l.head;
l.head=p;
}
}
void addLast(dslk &l,node*p){
if(l.head==NULL)
l.head=l.tail=p;
else{
l.tail->next=p;
l.tail=p;
}
}
//chen node n vao sau node p trong danh sach
void addAfter(dslk&l,node *q,node*new_node){
if(l.head==NULL&&q==NULL)
l.head=l.tail=new_node;
if (q!=NULL){
new_node->next = q->next;
q->next = new_node;
if(q == l.tail)
l.tail = new_node;
}
}
void addBefore(dslk&l,node *q,node*new_node){
node*p=NULL;
node*t=l.head;
while(t->data!=q->data&&t!=NULL){
p=t;
t=t->next;
}
addAfter(l,p,new_node);
}
//add phan tu vao sao cho danh sach luon tang dan
void addSort(dslk&l,node*n){
if(l.head==NULL)
l.head=l.tail=n;
else{
if(n->data<=l.head->data)
addFirst(l,n);
else if(n->data>=l.tail->data)
addLast(l,n);
else{
node*t=l.head;
while(t!=NULL){
if(t->data>n->data)
break;
t=t->next;
}
addBefore(l,t,n);
}
}
}
//Ham nay dung de duyet qua danh sach va in gia tri data
//param l la danh sach can duyet
void traverse(dslk l){
node*t=l.head;
while(t!=NULL){
cout<<t->data<<" ";
t=t->next;
}
cout<<endl;
}
int nodesCounter(dslk l){
node*t=l.head;
int dem=0;
while(t!=NULL){
dem++;
t=t->next;
}
return dem;
}
node*searchByKey(dslk l,int data){
node*t=l.head;
while(t!=NULL){
if(t->data==data)
return t;
t=t->next;
}
return NULL;
}
//xoa 1 phan tu dau danh sach
int deleteFirst(dslk&l){
if(l.head==NULL)
return -1;
node*p=l.head;//phan tu can xoa
l.head=p->next;
if(l.head==NULL)
l.tail=NULL;
delete p;
return 1;
}
//Xoa 1 node sau node q
//tra ve 1 neu xoa thanh cong
int deleteAfter(dslk&l,node*q){
if(q==NULL || q->next==NULL)
return -1;
node*p=q->next;
q->next=p->next;
if(p==l.tail)
l.tail=q;
delete p;
return 1;
}
//xoa 1 nút có khóa là key
//tra ve -1 neu ds rong, 0 neu khong tim thay, 1 neu OK
int deleteByKey(dslk&l,int key){
if(l.head==NULL) return -1;
node*sau=l.head;
node*truoc=NULL;
while(sau!=NULL){
if(sau->data==key) break;
truoc=sau;
sau=sau->next;
}
if(sau==NULL)
return 0;
if(truoc==NULL)
return deleteFirst(l);
return deleteAfter(l,truoc);
}
//xoa tat ca cac nut trong dslk l co data=key
void deleteByKeyAll(dslk&l,int key){
if(l.head==NULL) return;
node*sau=l.head;
node*truoc=NULL;int x=-1;
while(sau!=NULL){
x=-1;
if(sau->data==key){
if(truoc==NULL)
deleteFirst(l);
else
deleteAfter(l,truoc);
sau=l.head;
truoc=NULL;
x=1;
}
if(x!=1){
truoc=sau;
sau=sau->next;
}
}
}
//huy toan bo danh sach
void removeAll(dslk&l){
node*p;
while(l.head!=NULL){
p=l.head;
l.head=p->next;
delete p;
}
l.tail=NULL;
}
//ham ghi du lieu xuong file
void write2file(char * filename, dslk ds){
ofstream fs(filename, ios::binary | ios::out );//| ios::app
node*t=ds.head;
while(t!=NULL){
fs.write((char*)&t->data,sizeof(int));
t=t->next;
}
fs.close();
}
///hàm doc du lieu tu file
void readfromfile(char * filename, dslk &ds){
init(ds);
ifstream infile(filename,ios::in|ios::binary);
if(infile!=NULL){
int data;
infile.read((char*)&data,sizeof(int));
while(!infile.eof()){
node*n=createNode(data);
addLast(ds,n);
infile.read((char*)&data,sizeof(int));
}
}
infile.close();
}
Huy said
thầy ạ !
đối với Java thì em phải tạo danh sách liên kết như thế nào ạ ???
minh thư said
Em đang gặp vướng mắc về chương trình đồ họa mô phỏng ứng dụng của danh sách liên kết đơn. Em mong thầy giúp đỡ,