BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

default BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by itsnotoverlbh on Mon Mar 07, 2011 10:11 pm

Vận dụng các phép toán trên danh sách đặc để viết chương trình nhập vào một danh sách các số nguyên và hiển thị danh sách vừa nhập ra màn hình. Thêm 1 phần tử có nội dung x vào danh sách tại vị trí p (trong đó x và p được nhập từ bàn phím). Xóa phần tử đầu tiên có nội dung x (nhập từ bàn phím) ra khỏi danh sách.
ai test được lỗi thì pm cho tôi hay với nha!!
Code:

#include <conio.h>
#include <stdio.h>
#define MaxLength 100
typedef int ElementType;
typedef int Position;
typedef struct{
ElementType Elements[MaxLength];
Position Last;
} List;
/*Khoi tao danh sach rong*/
void MakeNull_List(List &L){
L.Last=0;
}/*Kiem tra danh sach rong*/
int Empty_List(List L){
return L.Last==0;
}/*Vi tri phan tu dau tien*/
Position First(List L){
return 1;
}/*Gia tri phan tu o vi tri p*/
ElementType Retrieve(Position p, List L){
return L.Elements[p-1];
}/*Vi tri sau vi tri phan tu cuoi cung*/
Position EndList(List L){
return L.Last+1;
}/*Vi tri sau vi tri p*/
Position Next(Position p, List L){
return p+1;
}/*Xen 1 phan tu vao danh sach*/
void Insert_List(ElementType x, Position p, List &L){
if(L.Last==MaxLength)
printf("Danh sach day");
else if((p<1)||(p>L.Last+1))
printf("Vi tri khong hop le");
else{
Position q;
for(q=(L.Last-1)+1;q>p-1; q--)
L.Elements[q]=L.Elements[q-1];
L.Elements[p-1]=x;
L.Last++;
}
}/*Xoa 1 phan tu ra khoi danh sach*/
void Delete_List(Position p, List &L){
if((p<1)||(p>L.Last))
printf("Vi tri khong hop le");
else if(Empty_List(L))
printf("Danh sach rong!");
else{Position q;
for(q=p-1;q<L.Last-1;q++)
L.Elements[q]=L.Elements[q+1];
L.Last--;
}
}/*Dinh vi 1 phan tu trong danh sach*/
Position Locate(ElementType x, List L){
Position p; int Found=0; p=First(L);
while((p!=EndList(L))&&(Found==0))
if(Retrieve(p,L)==x)Found=1;
else p=Next(p,L);
return p;
}/*Doc vao 1 danh sach*/
void Read_List(List &L){
ElementType x;
Position p=1;
printf("\nEnter a list of interger numbers. -1 to stop.\n");
do{
printf("x=");scanf("%d",&x);
Insert_List(x,p,L);
p++;
}while(x!=-1);
}/*In danh sach ra man hinh*/
void Print_List(List L){
Position p;
for(p=1;p!=EndList(L);p++){
printf("%5d",Retrieve(p,L));
}printf("\n");
}main(){List L;
ElementType x;
Position p;
MakeNull_List(L);
Read_List(L);
printf("Danh sach vua nhap:");
Print_List(L);
printf("Phan tu can them:"); scanf("%d",&x);
printf("Vi tri can them:"); scanf("%d",&p);
Insert_List(x,p,L);
printf("Danh sach sau khi them phan tu la:");
Print_List(L);
printf("Noi dung phan tu can xoa:");scanf("%d",&x);
p=Locate(x,L);
if(p!=EndList(L)) Delete_List(p,L);
printf("Danh sach sau khi xoa %d la:",x);
Print_List(L);
getch();}
avatar
itsnotoverlbh

Posts : 367
Thanked : 21
Gia Nhập 18/02/2011

Tài Sản
Thú nuôi:

http://www.ittd.freevnn.com

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by LE BAO TRANG on Sun Apr 08, 2012 10:26 pm

Xin chào các bạn! Mình là thành viên mới. Hiện là sinh viên năm 2 ngành IT. Mình dở lập trình lắm, đặc biệt là mấy kiểu dữ liệu trừu tượng. Mình thấy kiểu danh sách gần giống như mảng (danh sách đặc). Vậy có sư huynh nào so sánh giùm mình sự khác nhau không? Với kiểu mảng mình có thể xây dựng được 1 danh sách các phần tử kiểu "sinhvien" bao gồm họ tên sv, năm sinh, điểm số.... Vậy với kiểu danh sách mình làm được không? cách làm thế nào xin nhờ các bạn hướng dẫn giùm. Mình rất cám ơn!
avatar
LE BAO TRANG

Posts : 2
Thanked : 0
Gia Nhập 08/04/2012

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by itsnotoverlbh on Sun Apr 08, 2012 10:44 pm

LE BAO TRANG đã viết:Xin chào các bạn! Mình là thành viên mới. Hiện là sinh viên năm 2 ngành IT. Mình dở lập trình lắm, đặc biệt là mấy kiểu dữ liệu trừu tượng. Mình thấy kiểu danh sách gần giống như mảng (danh sách đặc). Vậy có sư huynh nào so sánh giùm mình sự khác nhau không? Với kiểu mảng mình có thể xây dựng được 1 danh sách các phần tử kiểu "sinhvien" bao gồm họ tên sv, năm sinh, điểm số.... Vậy với kiểu danh sách mình làm được không? cách làm thế nào xin nhờ các bạn hướng dẫn giùm. Mình rất cám ơn!
Bạn đang nói đến lập trình bằng ngôn ngữ nào? bài trên dùng theo cấu trúc dữ liệu, bạn phải nói rõ ngôn ngữ
Bài sau viết bằng c++

Code:

#include<conio.h>
#include<iostream>
using namespace std;
class chung{
      char ms[20];
      char hoten[30];
      int namsinh;
      friend class sinhvien;
        public:
            void nhap();
            void in();
            };
void chung::nhap(){
    cout<<"\nNhap ma so:";
    cin>>ms;
    cout<<"\nTen :";
    cin.ignore();
    cin.getline(hoten,30);
    //cout<<"\nNhap vao nam sinh:";
    //cin>>namsinh;
    };
void chung::in(){
    cout<<"\nMa:"<<ms<<"\nTen:"<<hoten;//<<"\nNS:"<<namsinh;
    };
class sinhvien:public chung{
        int diemtb;
        int ssv;
        int namsinh;
        sinhvien* dssv[100];
        friend class lop;
        public:
                void nhapsv();
                void insv();
                };
void sinhvien::nhapsv(){
    //nhap();
    cout<<"n\n--NHAP THONG TIN SINH VIEN--";
    cout<<"\nNhap so luong sinh vien lop:";cin>>ssv;
    for(int i=0;i<ssv;i++){
            cout<<"\nSinh vien thu:"<<i+1;
            dssv[i]=new sinhvien();
            dssv[i]->nhap();
            cout<<"\nNhap nam sinh:";cin>>namsinh;
            cout<<"\nNhap diem TB:";
              cin>>diemtb;
            }
            };
void sinhvien::insv(){
    // in();
    // cout<<"\n\n\t--THONG TIN SINH VIEN DA NHAP--";
   
    cout<<"\nSo sinh vien  lop:";
    for(int i=0;i<ssv;i++){
            dssv[i]->in();
              cout<<"\nDienTB:"<<diemtb;
              cout<<"\nNS:"<<namsinh;
            }
            };
int main(){
    sinhvien a;
    a.nhapsv();
    a.insv();
    getch();
}

avatar
itsnotoverlbh

Posts : 367
Thanked : 21
Gia Nhập 18/02/2011

Tài Sản
Thú nuôi:

http://www.ittd.freevnn.com

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by Admin on Sun Apr 08, 2012 11:28 pm

Surprised Cái này đã học cũng lâu ùi giờ quên hết rồi. Bạn hỏi chắc cũng phải đem sách ra mà xem lại(không bik cuốn sách còn hay mất nữa).

Mình xin nhớ gì nói nấy vậy:
=> Mảng là một danh sách các phần tử có kiểu mặc định do ngôn ngữ lập trình hỗ trợ hay có kiểu theo người dùng tự định nghĩa. Khi khi báo mảng thì ta cần phải xác định gõ số phần tử của mảng là bao nhiêu còn với danh sách liên kết thì không cần. Với mảng vì cần khai báo số phần tử mảng trước nên bị hạn chế hơn sơ với DSLK là khi cần mở rộng thêm danh sách hoặc biểu diễn 1 số nguyên vô cùng lớn thì thằng mảng làm không nổi. Điều thứ 2 là khi đã khai báo số phần tử rồi thì máy liền cấp ngay bộ nhớ cho mỗi phần tử mảng, điều này gây lãng phí ô nhớ khi ta không sử dụng hết số phần tử của mảng và điều đặt biệt nữa là ta không thể huy ô nhớ đó nếu không dùng đến. Còn DSLK thì khi nào cần ta mới cấp phát ô nhớ, số phần tử của DS không giới hạng hay không cần khai báo trước. Khi ô nhớ không sử dụng ta co thể huy ô nhớ để tránh lãng phí.Rất hay và tiên hơn, nhiều ưu điểm hơn so với mảng tuy nhiên để truy cập hay tác động đến DSLK thì công việc đầu tiên cần làm là xác định số phần tử DSLK. Về cách dùng dĩ nhiên có thể làm được và hơn hẳn cả mảng.
VD với kiểu sinh viên ta định nghĩa trước rồi
Code:
typedef struct sinhvien
 {
    char mssv[12];
    string tensv;
    int diemso;
 } sinhvien;
Phần khai báo 1 kiểu danh sách sinh viên ta làm như sau:
Code:
  struct node {
    sinhvien dssv;
    node* next;
};
DSLK gồm nhiều nút (node) mỗi nút chứa thông tin cần lưu trữ (VD sinh viên) và 1 liên kết đến nút khác. Bước trên là ta đi định nghĩa 1 nút của DS. Và để sử dụng DSLK bạn nên tham khảo tài liệu thêm để biết 1 số hàm tác động đến DSLK( khởi tạo, thêm nút, xóa nút...) chứ không thể sử dụng bình thường như mảng được vì số phần tử của DSLK không xác định trước được!
Chúc bạn học tốt
avatar
Admin

Posts : 1013
Thanked : 47
Gia Nhập 25/08/2010

Tài Sản
Thú nuôi:

http://k4info.forumr.net

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by Admin on Sun Apr 08, 2012 11:33 pm

Cái của Mến là chuyên về hướng đối tượng vẫn xài mảng. ý của bạn ấy là hỏi phân biệt giữa mảng và danh sách liên kết (C hay C++ gì cũng vậy) và cách xài DSLK như thế nào?


Được sửa bởi itsnotoverlbh ngày Mon Apr 09, 2012 9:43 pm; sửa lần 1. (Reason for editing : đề bác tâm xưng hô lại nha)
avatar
Admin

Posts : 1013
Thanked : 47
Gia Nhập 25/08/2010

Tài Sản
Thú nuôi:

http://k4info.forumr.net

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by shippou777 on Mon Apr 09, 2012 11:52 am

Có girl vào hỏi là bác Tâm tích cực ghê

shippou777

Posts : 460
Thanked : 8
Gia Nhập 11/10/2011

Tài Sản
Thú nuôi:

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by LE BAO TRANG on Mon Apr 09, 2012 11:57 am

xin lỗi. Mình quên. Làm trên C.
avatar
LE BAO TRANG

Posts : 2
Thanked : 0
Gia Nhập 08/04/2012

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by shippou777 on Mon Apr 09, 2012 12:04 pm

Bác Tâm vào trả lời kìa Sad

shippou777

Posts : 460
Thanked : 8
Gia Nhập 11/10/2011

Tài Sản
Thú nuôi:

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by Admin on Mon Apr 09, 2012 12:20 pm

Thì trả lời rồi đó Bác, làm trên C hay C++ gì không được!
avatar
Admin

Posts : 1013
Thanked : 47
Gia Nhập 25/08/2010

Tài Sản
Thú nuôi:

http://k4info.forumr.net

Về Đầu Trang Go down

default Re: BÀI TẬP CTDL VỀ DANH SACH LIÊN KẾT

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết