Đề : tạo danh sách liên kết các số nguyên, làm các công việc xác định vị trí,chèn,xóa, tìm kiếm 1 số a, Tạo danh sách b, Xuất danh sách c, Viết hàm chèn d, Viết hàm xóa e, Viết hàm tìm kiếm f, Viết hàm main(); Em nghỉ học môn cấu trúc dữ liệu mấy hôm nên cái danh sách liên kết hơi mù mờ.Mấy anh viết luôn ý nghỉa từng câu lệnh cho em dễ hiểu. Cho em 1 vài tài liệu về danh sach liên kết nửa. Em cám ơn mấy anh trước .Mai kiểm tra rồi mà giờ còn chả hiểu gì lo quá !!!!!!!!!!!!!!!!!!!!!!
Bàii DS LK Đây Mã: #include<iostream.h> #include<conio.h> typedef int kieu; typedef struct node { kieu dt; struct node *link; }list; list *t,*s; void tao(list **t,list **s) { (*t)=(*s)=NULL; } int kt(list *t) { return t==NULL; } list *tim(int n,list *t) { list *p; int d=1; if(kt(t))cout<<"\nDanh sach rong"; else { while(t!=NULL&&d<n) { d++; p=t; t=t->link; } } if(d!=n) return NULL; else return p; } void chen(kieu x,int n,list **t,list **s) { list *p,*k; p=new list; p->dt=x; switch (n) { case 0://chen dau { p->link=(*t); (*t)=p; }break; case -1://chen cuoi { p->link=NULL; if(kt(*t)) (*t)=(*s)=p; else { (*s)->link=p; (*s)=(*s)->link; } }break; default://chen giua { k=tim(n,*t); p->link=k->link; k->link=p; } } } void xem(list *t) { while(!kt(t)) { cout<<t->dt<<" "; t=t->link; } } void xoa(int n,list **t,list **s) { if(kt(*t))cout<<"\ndanh sach rong"; else { list *p,*q; switch (n) { case 0: { p=(*t); (*t)=p->link; delete (p); }break; case -1: { while((*t)!=(*s)) { p=*t; (*t)=(*t)-> link; } p->link=NULL; delete(*s); (*s)=p; }break; default : { p=tim(n,*t); if(p->link!=NULL); { q=p->link; p->link=q->link; delete(q); } }break; } } }void nhap(list **t,list **s) { kieu n; cout<<"Nhap vao ds neu =0 thoat ";cin>>n; while(n!=0) { chen(n,-1,t,s); cin>>n; } } int dem(list *t) { list *p; int d=0; if(kt(t))return 0; else { while(t!=NULL) { d++; t=t->link; } } return d; } void main() { int i; kieu n; char c='y'; do { clrscr(); tao(&t,&s); //bai 1 chuong 2 dslk nhap(&t,&s); xem(t); //bai 2 chuong 2 dslk do { cout<<"\nNhap vao vi tri can chen ";cin>>i; }while(i<0); cout<<"\nNhap vao gia tri ";cin>>n; chen(n,i,&t,&s); cout<<"\ndanh sach sau khi them \n";xem(t); //bai 3 chuong 2 dslk do { cout<<"\nnhap vao vi tri can xoa ";cin>>i; }while(i<-1); xoa(i,&t,&s); cout<<"\nDanh sach sau khi xoa la \n";xem(t); //bai 4 chuong 2 dslk cout<<"\nSo phan tu cua danh sach la "; cout<<dem(t); cout<<"\nCo tiep tuc ko y/n ";cin>>c; }while(c=='y'); getch(); } Cảm ơn cái xem thử nào hj !;))
Cái môn cấu trúc dữ lại này đi học còn chưa chắc nắm rõ nữa là nghỉ học... bạn cẩn thận chứ không là ở lại thiệt đấy
Em tìm kiếm trên diễn đàn đã post từ năm ngoái có rất nhiều bài. Tham khảo, nếu có chỗ nào không hiểu thì lên đây hỏi, xin code vậy không tốt.
Tổng hợp một số bài tập cấu trúc dữ liệu chương 2 đây. Bạn tham khảo http://www.mediafire.com/?9xh15zx0524zhzz
Em mới xin được đứa bạn đoạn code viết hàm nhập và xuất, nhưng không hiểu lắm Mã: Code: #include<conio.h> #include<stdio.h> typedef struct list{ int so; list *next; }; list *t; /*Khai báo danh sách liên kết t */ void taods(int x,list **l) { list *p; p=new list; /* Cấp phát bộ nhớ cho nút*/ p-> so=x; p-> next = (*l); (*l)=p; } void xuatds(list *l) { list *p; p=l; while (p!=NULL) { printf("%3d",p->so); p= p->next; } } main() { int x,n; char ch; clrscr(); t=NULL; do{ printf("\n x="); scanf("%d",&x); taods(x,&t); printf("\n bam phim K nen ban muon ket thuc \n "); printf("\n tiep tuch nao"); scanf("%c",&ch); } while (ch!='k'); printf("\n danh sach vua tao: \n"); xuatds(t); getch(); return 0; } p-> so=x; p-> next = (*l); (*l)=p; 3 câu kệnh này là gì nhỉ cái này nghỉa là gì nhỉ list *p; khai báo cái này có phải là cái nút chỏ bên ngoài ko nhỉ **l là sao Em hiểu nôm na cái danh sách liên kết như thế này không biết có chính xác không: Danh sách liên kết là 1 dách sách động, mỗi phần tử có 1 vung để chứa dữ liệu và 1 vùng chứa thông tin của phần tử kế tiếp. Cần có 1 cái T để cầm nút đầu tiên để quản lí toàn bộ danh sách 1 cái Q chạy hết từ T đến các phần tử còn lại và có 1 cái nút P bên ngoài(con trỏ) nào đó để thêm vào danh sách hoặc chỏ đến các phần tử khác
Nội dung hàm taods là khai báo 1 dslk p p-> so=x; --> Truyền giá trị x cho trường so. p-> next = (*l); --> trỏ node tiếp theo vào vị trí bắt đầu của dslk l đầu --> Việc này sẽ nối dslk p vào đầu dslk l. (*l)=p; --> Sau khi nối p và l thì p bây giờ là danh sách l + phần tử mới. Gán l lại cho p. Ở đây dùng **l tức là trỏ tới con trỏ l. Việc này giúp dữ liệu được thay đổi sẽ tham chiếu trực tiếp tới l ở hàm main. Em có để ý taods(x,&t); --> có dấu & không ? đây là cách truyền địa chỉ vào hàm con để thao tác trực tiếp với biến. Em hiểu chứ ?
Đây là hàm xát định vị trí: list *vt(int n, List *T) { list *P ; int count = 1; P = T; while ((P!=NULL)&&(count<n)) { count++; P=P->next; } return P; } count = 1 là cái gì vậy ? Tại sao lại khai báo cái hàm vt là list *vt(int n, List *T) mà lại không như hàm taods, xuatds À có phải cái count= 1 giống như cái i =1 chạy đến hết n(số các phần tử hiện có ds) ko nhỉ Cái T là 1 danh sách ta đã khai báo ở trên,còn cái P này là 1 nút .Ta cho chúng bằng nhau là sao? P=T; Công việc của hàm này là đưa ra số P tại vị trí n-1 phải ko ?,em thấy có return p; Hàm xác định vị trí: List *Locate(int n, List *T) { List *P ; int count = 1; P = T; while ((P!=NULL)&&(count<n)) { count++; P=P->next; } return P; } T là dslk đã khai báo ở trên,P là 1 cái nút, cho chúng = nhau là sao? P=T; count = 1 có phải giống cái i=1 chạy đến hết n không nhỉ? Hàm này làm công viêc đưa ra giá trị P tại vị trí n-1(em thấy có return p) và cái n là vị trí cần đưa ra giá trị đúng không? void chen(int x,list**L,int n) { list*vt(int n,list *T); list *P,*Q; P=new list; P->so=x; if(n==1) { P->next=(*L); (*L)=P; } else { Q=(n-1,*L); if (Q==NULL) printf(" vi tri khong hop le "); else { P->next=Q->next; Q->next=P; } } } trong này có thêm cái Q là gì vậy?. Ai giỏi môn này chỉ giúp em với. (Giải thích từng câu lệnh thì càng tốt).Thank mọi người trước
list *vt(int n, List *T) { list *P ; int count = 1; P = T; while ((P!=NULL)&&(count<n)) { count++; P=P->next; } return P; } Hàm này trả về vị trí ô nhớ P, dùng biến count để đếm. qua mỗi node của dslk thì tăng biến đếm lên 1. Việc trỏ P=P->next sẽ làm thay đổi dslk, nên gán qua P=T để dslk T không thay đổi giá trị. list *vt(int n, List *T) : Kiểu dữ liệu trả về là kiểu list. nên phải return P (P mang kiểu list). Hàm trả về 1 con trỏ P, xác định vị trí trong dslk. Q=(n-1,*L); --> Q ở đây em xem lại có phải hàm vt ko ? Hay viết thiếu ?
Em đã hiểu rõ về danh sách liên kết rồi. Cám ơn mọi người đã chịu khó bỏ thời gian ra giảng bài cho em.
list *p khai báo con tro p kiểu dữ liệu list nó đông thời là con trỏ giữ vị trí đầu tiên trong ds , **l có con tro l sẽ thay dổi độ dài của danh sách gần giống với n trong dsd nhưng còn đây là nhập xuất sinh vien minh dưa len tham khao khi rao ranh minh se pos len cho anh em góp ý à: #include<iostream.h> #include<string.h> #include<conio.h> typedef struct sv { char masv[10]; char hoten[30]; float diem; sv *next; };sv *l; void nhap(char msv[],char ht[],float d,sv **t) { sv *p; p=new sv; strcpy(p->masv,msv); strcpy(p->hoten,ht); p->diem=d; p->next=(*t); (*t)=p; } void xuat(sv *t) { sv *p; p=t; while(p!=NULL) { cout<<" "<<p->masv<<" "<<p->hoten<<" "<<p->diem<<endl; p=p->next; } } void main() { clrscr(); l=NULL; char msv[10]; char ht[30]; float d; char k; do { cout<<"Nhap msv : ";cin>>msv; cout<<"Nhap ho ten : ";cin>>ht; cout<<"Nhap diem : ";cin>>d; nhap(msv,ht,d,&l); cout<<"nhap tiep ('y'):"; cin>>k; }while(k=='y'); xuat(l); getch(); }
Em có đoạn code danh sách liên kết quản lý số nguyên, nhưng không biết hàm locate sai chổ nào mà khi chèn số vào thì sai,và khi xóa thì không được VD: Nhập 5 số : 1 5 3 7 8 số cần chèn: 6 Vị trí cần chèn: 4 thì nó ra thế này đây: 1 6 5 3 7 8 Còn xóa thì không được nó in nguyên lại : 1 5 3 7 8 #include<conio.h> #include<stdio.h> #include<iostream.h> #include<string.h> typedef struct list { int so; list*next; }; list*T; void tao(int x,list **Q) { list *P; P=new list; P->so=x; P->next=(*Q); (*Q)=P; } void xuat(list*Q) { list*P; P=Q; while (P!=NULL) { printf("%3d",P->so); P=P->next; } } List *Locate(int n, List *T) { List *P ; int count = 1; P = T; while ((P!=NULL)&&(count<=n)) { count++; P=P->next; } return P; } void chen(int x,list**T,int n) { list*Locate(int n,list *T); list *P,*Q; P=new list; P->so=x; if(n==1) { P->next=(*T); (*T)=P; } else { Q=(n-1,*T); if (Q==NULL) printf(" vi tri khong hop le "); else { P->next=Q->next; Q->next=P; } } } void xoa(int n, list**T) { list *Q,*P; if(*T==NULL) printf(" danh sach rong "); else { if (n==1){ P=(*T); (*T)=P->next; delete(P); } else { Q = Locate(n - 1, *T); if((Q==NULL)||(Q->next==NULL)) printf("Vi tri khong hop le"); else{ P = Q->next; P->next = P->next; delete P; } } } } main() { int x,n; char ch,c; clrscr(); T=NULL; do { printf("x= "); scanf("%d",&x); tao(x,&T); printf("nhap k de thoat, nhap c de tiep tuc:\n"); cin>> ch; } while (ch!='k'); printf(" danh sach vua tao :\n"); xuat(T); printf("\n nhap vao so can chen: "); cin>>x; printf("\n nhap vi tri can chen: "); cin>>n; chen(x,&T,n); xuat(T); printf("\nvi tri can xoa:"); cin>>n; xuat(T); getch(); return 0; } A!!! hình như trong hàm main thiếu hàm xác định vị trí thì phải. Chưa kịp xem đã mang lên đây hỏi