Hỏi đáp Giải giúp bài tập C làm hoài không được.......

Thảo luận trong 'Lập trình máy tính' bắt đầu bởi bethui2971992, 29 Tháng chín 2011.

  1. Offline

    bethui2971992

    • Thành Viên Mới

    Số bài viết:
    26
    Đã được thích:
    4
    Điểm thành tích:
    0
    Đề : 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á !!!!!!!!!!!!!!!!!!!!!!
  2. Offline

    nguyenvanthanh

    • Thành Viên Mới

    Số bài viết:
    25
    Đã được thích:
    7
    Điểm thành tích:
    0
    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 !;))
    bethui2971992congthangitvn thích bài này.
  3. Offline

    knight9000

    • Windows 3.0

    Số bài viết:
    144
    Đã được thích:
    42
    Điểm thành tích:
    40
    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 :D
  4. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    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.
  5. Offline

    clandn.angel

    • friend

    Số bài viết:
    655
    Đã được thích:
    361
    Điểm thành tích:
    450
    Integer nói đúng đó em :). Môn này môn liên thông, cũng hơi cực xíu, học đau đầu nhưng mà cố gắng :)
  6. Offline

    alt+F4

    • Core i3

    Số bài viết:
    596
    Đã được thích:
    423
    Điểm thành tích:
    450
    bethui2971992 thích bài này.
  7. Offline

    tangvanbinh

    • Đội cứu hộ máy tính

    Số bài viết:
    449
    Đã được thích:
    197
    Điểm thành tích:
    140
    hi.sao không đưa pass giải nén luôn nak.
  8. Offline

    bethui2971992

    • Thành Viên Mới

    Số bài viết:
    26
    Đã được thích:
    4
    Điểm thành tích:
    0
    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
  9. Offline

    alt+F4

    • Core i3

    Số bài viết:
    596
    Đã được thích:
    423
    Điểm thành tích:
    450
    sorry, pass giải nén: kvfitc
  10. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    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 pl 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ứ ?
    bethui2971992, nhatduy510312killyou117 thích bài này.
  11. Offline

    bethui2971992

    • Thành Viên Mới

    Số bài viết:
    26
    Đã được thích:
    4
    Điểm thành tích:
    0
    Đâ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
  12. Offline

    hoekaka

    • Windows 95

    Số bài viết:
    359
    Đã được thích:
    114
    Điểm thành tích:
    90
    Bạn nên đọc lại khái niệm và cách sử dụng con trỏ đi.
    lyvinhr00m thích bài này.
  13. Offline

    integer

    • Tiếu Ngạo Giang Hồ

    • :-?
    Số bài viết:
    1.695
    Đã được thích:
    1.313
    Điểm thành tích:
    900
    1. list *vt(int n, List *T)
    2. {
    3. list *P ;
    4. int count = 1;
    5. P = T;
    6. while ((P!=NULL)&&(count<n))
    7. {
    8. count++;
    9. P=P->next;
    10. }
    11. return P;
    12. }


    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 ?
    32767, lyvinhr00mbethui2971992 thích bài này.
  14. Offline

    bethui2971992

    • Thành Viên Mới

    Số bài viết:
    26
    Đã được thích:
    4
    Điểm thành tích:
    0
    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.
  15. Offline

    Xautrai_LT03B

    • Windows 1.0

    Số bài viết:
    38
    Đã được thích:
    15
    Điểm thành tích:
    10
    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();
    }
    bethui2971992 thích bài này.
  16. Offline

    32767

    • Thành Viên Mới

    Số bài viết:
    72
    Đã được thích:
    22
    Điểm thành tích:
    0
    Nếu có ai chưa hiểu bạn chỉ thẳng vô topic này cho nhanh, không mất công mấy ổng trả lời lại :))
  17. Offline

    conloc171

    • Thành Viên Mới

    Số bài viết:
    29
    Đã được thích:
    2
    Điểm thành tích:
    0
    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

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí