Announcement

Collapse
No announcement yet.

Danh sách liên kết.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Ansi C] Danh sách liên kết.

    Em mới học đến danh sách liên kết, thấy nó khó hiểu quá nhờ mọi người xem giúp mình bài này.
    Bài toán đơn giản yêu cầu nhập vào một danh sách các số kiêu int sau đó xuất nó ra. Em làm thế này...
    PHP Code:
    #include"stdafx.h"
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    #include<stdlib.h>
    typedef struct phantu
    {
        
    int Info;
        
    struct phantu *Next;
    }
    NODE;
    typedef struct 

        
    NODE *Head;
        
    NODE *Tail;
    }LIST;
    void *Nhap(LIST &l)
    {
        
    int i=0,n;
        
    NODE *p;
        
    = new NODE;
        
    printf("\nNhap so phan tu "); scanf("%d",&n);
        for(;
    i<n;i++)
        {
            
    printf("\nNhap vao so thu %d: ",i+1);
            
    scanf("%d",&(p->Info));

            if(
    l.Head == NULL)
            {
                
    l.Head p;
                
    l.Tail p;
            }
            else 
            {
                
    l.Tail ->Next=p;
                
    l.Tail p;
            }
        }
        
    l.Tail->Next=NULL;
        return 
    p;
    }
    void HienThi(LIST l)
    {
        
    NODE *p;
        
    p=l.Head;
        if(
    p==NULLprintf("\nKhong co phan tu!!");
        else
        {
            
    printf("\nCac phan tu co trong danh sach!\n");
            while(
    != NULL)
            {
                
    printf("%2d",p->Info);
                
    p=p->Next;
            }
        }
    }
    void main()
    {
        LIST 
    l;
        
    int x;
        
    Nhap(l);
        
    HienThi(l); getch();

    Không biết nó đã sai chỗ nào..???mong mọi người giúp đỡ
    not..

  • #2
    void main()
    {
    LIST l = NULL;
    int x;
    Nhap(l);
    HienThi(l); getch();
    }
    Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

    Comment


    • #3
      Trong hàm main bạn phải khởi tạo ban đầu l.head=NULL,l.Tail=NULL.
      Một chỗ nữa là:trong hàm nhập bạn cho kiểu trả về là void mà bạn lại return p,p có kiểu Node* mà. Hàm nhập cả danh sách nên ko cần return làm gì vậy bạn nên bỏ dòng return p đi.

      Comment


      • #4
        bạn này làm sai oi
        LIST l = NULL là sai.(vì l là 1 đối tượng kiểu dữ liệu LIST, chứ đâu phải là con trỏ)
        .................................
        Còn bài của bạn mình thấy nhìu chỗ không hợp lý, như:
        Bạn chỉ cần ghi hàm nhập thế này là ok
        Code:
        void Nhap(LIST &l)
        {
            int i=0,n,x;
            NODE *p;
            p = new NODE;
            printf("\nNhap so phan tu "); scanf("%d",&n);
            for(;i<n;i++)
            {
                printf("\nNhap vao so thu %d: ",i+1);
                scanf("%d",&x);
                p->Info = x; // Không nên nhập trực tiếp vào p->Info.
                if(l.Head == NULL)
                {
                    l.Head = p;
                    l.Tail = p;
                }
                else 
                {
                    l.Tail ->Next=p;
                    l.Tail = p;
                }
            }
            // l.Tail->Next=NULL; dòng này thừa.
        }

        Comment


        • #5
          Originally posted by 10520191 View Post
          bạn này làm sai oi
          LIST l = NULL là sai.(vì l là 1 đối tượng kiểu dữ liệu LIST, chứ đâu phải là con trỏ)
          .................................
          Còn bài của bạn mình thấy nhìu chỗ không hợp lý, như:
          Bạn chỉ cần ghi hàm nhập thế này là ok
          Code:
          void Nhap(LIST &l)
          {
              int i=0,n,x;
              NODE *p;
              p = new NODE;
              printf("\nNhap so phan tu "); scanf("%d",&n);
              for(;i<n;i++)
              {
                  printf("\nNhap vao so thu %d: ",i+1);
                  scanf("%d",&x);
                  p->Info = x; // Không nên nhập trực tiếp vào p->Info.
                  if(l.Head == NULL)
                  {
                      l.Head = p;
                      l.Tail = p;
                  }
                  else 
                  {
                      l.Tail ->Next=p;
                      l.Tail = p;
                  }
              }
              // l.Tail->Next=NULL; dòng này thừa.
          }
          hahahaha )
          Đồng ý là phần LIST l = NULL là mình sai đấy, lúc đó buồn ngủ quá nên mình ko để ý là struct chứ ko phải pointer, còn sửa cho đúng ý mình thì bạn Tín đã ghi là "phải khởi tạo ban đầu l.head=NULL,l.Tail=NULL.".
          Còn bạn sửa bài cho người ta thành
          // l.Tail->Next=NULL; dòng này thừa.

          Bạn chỉ cần ghi hàm nhập thế này là ok
          mà không đả động gì tới khởi tạo thì chứng tỏ bạn vẫn không hiểu gì về giá trị ban đầu cả )
          cái l.Tail -> Next = NULL mà thừa à ? )
          Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

          Comment


          • #6
            Originally posted by 11520338 View Post
            Em mới học đến danh sách liên kết, thấy nó khó hiểu quá nhờ mọi người xem giúp mình bài này.
            Bài toán đơn giản yêu cầu nhập vào một danh sách các số kiêu int sau đó xuất nó ra. Em làm thế này...
            PHP Code:
            #include"stdafx.h"
            #include<stdio.h>
            #include<conio.h>
            #include<malloc.h>
            #include<stdlib.h>
            typedef struct phantu
            {
                
            int Info;
                
            struct phantu *Next;
            }
            NODE;
            typedef struct 

                
            NODE *Head;
                
            NODE *Tail;
            }LIST;
            void *Nhap(LIST &l)
            {
                
            int i=0,n;
                
            NODE *p;
                
            = new NODE;
                
            printf("\nNhap so phan tu "); scanf("%d",&n);
                for(;
            i<n;i++)
                {
                    
            printf("\nNhap vao so thu %d: ",i+1);
                    
            scanf("%d",&(p->Info));

                    if(
            l.Head == NULL)
                    {
                        
            l.Head p;
                        
            l.Tail p;
                    }
                    else 
                    {
                        
            l.Tail ->Next=p;
                        
            l.Tail p;
                    }
                }
                
            l.Tail->Next=NULL;
                return 
            p;
            }
            void HienThi(LIST l)
            {
                
            NODE *p;
                
            p=l.Head;
                if(
            p==NULLprintf("\nKhong co phan tu!!");
                else
                {
                    
            printf("\nCac phan tu co trong danh sach!\n");
                    while(
            != NULL)
                    {
                        
            printf("%2d",p->Info);
                        
            p=p->Next;
                    }
                }
            }
            void main()
            {
                LIST 
            l;
                
            int x;
                
            Nhap(l);
                
            HienThi(l); getch();

            Không biết nó đã sai chỗ nào..???mong mọi người giúp đỡ
            thiếu chương trình rồi
            PHP Code:
            void Khoitao(List &l)
            {
                
            l.pHead=Null;
                
            l.pTail=Null;
            }
            Node *taoNode(Data x)
            {
                
            Node *p= new Node;
                if(
            p==Null)
                    
            printf(" rong");
                
            p->info=x;
                
            p->pNext=Null;
                return 
            p;

            phần nhập tách ra
            PHP Code:
                    if(l.Head == NULL
                    { 
                        
            l.Head p
                        
            l.Tail p
                    } 
                    else  
                    { 
                        
            l.Tail ->Next=p
                        
            l.Tail p
                    } 
                } 
                
            l.Tail->Next=NULL
                return 
            p
            la một chương trình con lun.
            PHP Code:
            void nhapds(List &l)
            {
                
            Data n;
                
            Node *moi;
                do
                {
                    
            printf(" nhap :"); scanf("%d",&n);
                        if (
            n== -1)
                            break;
                    
            moi=taoNode(n);
                    
            themdau(l,moi);
                }
                while(
            1);

            11520025
            Ngô Tấn Bình
            Last edited by 11520025; 02-04-2012, 11:03.

            Comment


            • #7
              mình thấy cách nhập của bạn này sao sao ý.thường thì mình thấy họ dùng cách thêm vào đầu hoặc vào cuối chứ không nhập trực tiếp như thế
              Hà Tĩnh Quê Choa:sunglasses:
              FACEBOOK

              Comment


              • #8
                bác nào xem giùm em đoạn code dưới đây với..........help help...
                lưu các phần tử là số nguyên dùng code dưới đây đã đúng chưa hay có ý tướng nào khác...
                sẵn đây cho em hỏi luôn là khi lưu danh sách bằng liên kết đơn thì có cần khai báo có bao nhiêu phần tử trong danh sách không???
                help me....
                thank cả nhà trước...hihihi

                Code:
                #include "stdafx.h"
                #include <stdio.h>
                #include <conio.h>
                #include <stdlib.h>
                #include <string.h>
                typedef struct tagnode
                {
                	int info;
                	struct tagnode *pNext;
                } node;
                typedef struct taglist
                {
                	node *pHead;
                	node *PTail;
                } list;
                void create_list(list &l)
                {
                	l.pHead=NULL;
                	l.PTail=NULL;
                }
                node *getnode(int x)
                {
                	node *p;
                	p=new node;
                	if(p==NULL)
                	{
                		printf("khong du bo nho.\n");
                		exit(0);
                	}
                	p->info=x;
                	p->pNext=NULL;
                	return p;
                }
                void addFirst(list &l, node *p)
                {
                	if(l.pHead==NULL)
                		l.pHead=l.PTail=p;
                	else
                	{
                		p->pNext=l.pHead;
                		l.pHead=p;
                	}
                }
                node *insert_First(list &l, int &x)
                {
                	node *new_ele = getnode(x);
                	if(new_ele==NULL)
                		return NULL;
                	else
                		addFirst(l,new_ele);
                	
                	return new_ele;
                }
                void addTail(list &l, node *p)
                {
                	if(p==NULL)
                		l.pHead=l.PTail=p;
                	else
                	{
                		l.PTail->pNext=p;
                		l.PTail=p;
                	}
                }
                node *insert_after(list &l, int &x)
                {
                	node *new_ele=getnode(x);
                	if(new_ele==NULL)
                		return NULL;
                	else
                		addTail(l,new_ele);
                	return new_ele;
                }
                void output(list &l)
                {
                	node *p;
                	p=l.pHead;
                	while(p!=NULL)
                	{
                		printf("%d\t", p->info);
                		p=p->pNext;
                	}
                	printf("\n");
                }
                void main()
                {
                	int x,n;
                	char m;
                	list l;
                	create_list(l);
                	do
                	{
                		flushall();
                		printf("1. Them vao dau danh sach.\n");
                		printf("2. Them vao cuoi danh sach.\n");
                		printf("3. Xuat danh sach.\n");
                		printf("nhap lua chon: ");
                		scanf("%c", &m);
                		switch(m)
                		{
                		case '1':
                			printf("nhap phan tu: ");
                			scanf("%d", &x);
                			insert_First(l,x);
                			break;
                		case '2':
                			printf("nhap phan tu: ");
                			scanf("%d", &x);
                			insert_after(l,x);
                			break;
                		case '3':
                			printf("danh sach vua nhap la: ");
                			output(l);
                			break;
                		}
                	}
                	while(m!='0');
                	getch();
                }

                Comment


                • #9
                  Danh sách liên kết không cần định trước số lượng phần tử bạn à. Việc định số phần tử như trong mảng là để chương trình biết mà cấp phát một vùng nhớ liên tục cho mảng, cấu trúc danh sách liên kết cho phép linh động về mặt bộ nhớ(các vùng nhớ không liên tục) khi bạn thêm vào một node mới thì mới cấp phát tiếp -> Do đó không cần định trước số phần tử cho danh sách. Tùy vào yêu cầu của bài toán mà bạn dùng mảng hay danh sách cho phù hợp

                  Comment


                  • #10
                    Originally posted by 08520021 View Post
                    Danh sách liên kết không cần định trước số lượng phần tử bạn à. Việc định số phần tử như trong mảng là để chương trình biết mà cấp phát một vùng nhớ liên tục cho mảng, cấu trúc danh sách liên kết cho phép linh động về mặt bộ nhớ(các vùng nhớ không liên tục) khi bạn thêm vào một node mới thì mới cấp phát tiếp -> Do đó không cần định trước số phần tử cho danh sách. Tùy vào yêu cầu của bài toán mà bạn dùng mảng hay danh sách cho phù hợp
                    vậy nếu muốn nhập 1 danh sách mà không khai báo số phần tử trong danh sách đó thì phải làm thế nào vậy?

                    Comment


                    • #11
                      Originally posted by 11520579 View Post
                      vậy nếu muốn nhập 1 danh sách mà không khai báo số phần tử trong danh sách đó thì phải làm thế nào vậy?
                      Code:
                      do {
                         nhập x;
                         thêm x vào danh sách;
                      } while (x != "Một giá trị nào đó cho ta biết người dùng không muốn nhập nữa" );
                      Đại loại vậy đó, em tự viết thành code nhá.

                      Comment


                      • #12
                        [/QUOTE]
                        Originally posted by 11520579 View Post
                        vậy nếu muốn nhập 1 danh sách mà không khai báo số phần tử trong danh sách đó thì phải làm thế nào vậy?
                        PHP Code:
                        do
                        {
                         
                        printf(" nhap x:"); 
                         
                        scanf("%d",&x);
                        if(
                        x==0)
                              break; 
                        // nhap x=0 thoát chương trình .
                          
                        moi=taophantu(x);
                          
                        themdau(l,moi);
                        }
                        while(
                        1); 
                        Thân !

                        Comment


                        • #13
                          thank mọi người

                          Comment


                          • #14
                            bạn viết hai hàm con,một hàm thêm đầu ,một hàm thêm cuối,sau đó lúc nhập bạn add đầu or cuối là được thôi à

                            Comment

                            LHQC

                            Collapse
                            Working...
                            X