01/10/2018, 08:23

Thêm 1 phần tử vào sau 1 phần tử trong danh sách liên kết đơn

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//khai bao cau truc du lieu
struct node{
	int data;
	struct node *pNext;
};
typedef struct node NODE;
struct list{
	NODE *pHead;
	NODE *pTail;
};
typedef struct list LIST;
//khoi tao
void init(LIST &l)
{
	l.pHead = l.pTail = NULL;
}
//tao node
NODE *getNode(int x)
{
	NODE *p;
	p = (NODE*)malloc(sizeof(NODE));
	if(p == NULL)
	{
		return NULL;
	}
	else
	{
		p->data = x;
		p->pNext = NULL;
	}
}
// them vao dau cua list
void insertFirst(LIST &l, NODE *new_element)
{
	if(l.pHead == NULL)
	{
		l.pHead = l.pTail = new_element;
	}
	else
	{
		new_element->pNext = l.pHead;
		l.pHead = new_element;
	}
}
// them vao cuoi list
void insertEnd(LIST &l,NODE *new_element)
{
	if(l.pHead == NULL)
	{
		l.pHead = l.pTail = new_element;
	}
	else
	{
		l.pTail->pNext = new_element;
		l.pTail = new_element;
	}

}
//them vao giua
/*void insertAfter(LIST &l, NODE *q, NODE *new_element)
{
	
	for(NODE *k = l.pHead; k != NULL; k = k->pNext)
	{
		if(k->data = q->data)
		{
			k->pNext = new_element;
			new_element->pNext = k->pNext;
		}
	}
}*/
void ThemGiua(LIST &l, NODE *p, NODE *q)
{
	for(NODE *k = l.pHead; k != NULL; k = k ->pNext)
	{
		if(k->data == q->data) // Tìm th?y q nè
		{
			NODE *g = k ->pNext;
			k ->pNext = p;
			p->pNext = g;
			return; // K?t thúc
		}
	}
}
//in put
void inPut(LIST &l, int n)
{
	init(l);

	for(int i=1; i<=n; i++)
	{
		int x;
		printf("nhap data: ");
		scanf("%d", &x);
		NODE *new_element = getNode(x);
		insertEnd(l,new_element);
	}
}
// out put
void outPut(LIST l)
{
	for(NODE *p = l.pHead; p != NULL; p = p->pNext)
	{
		printf("%d	", p->data);
	}
}
int main()
{
	LIST l;
	int n;
	printf("nhap so node trong list: ");
	scanf("%d", &n);
	inPut(l,n);
	outPut(l);
	int q;
	int p;
	printf("
nhap vi tri muon them: ");
	scanf("%d", &q);
	NODE *Q = getNode(q);
	printf("
nhap element: ");
	scanf("%d", &p);
	NODE *P = getNode(p);
	ThemSau(l,Q,P);
	//printf("
Danh sach sau khi them: 
");
	outPut(l);
	getch();
}


sao mình chạy khi thêm nó lại chỉ hiện ra list cũ mà không thêm dc nhỉ? mọi người chỉ mình với. thanks all!
Người bí ẩn viết 10:35 ngày 01/10/2018

Hàm getNode bạn đã return đâu ?

NODE *getNode(int x)
{
    NODE *p;
    p = (NODE*)malloc(sizeof(NODE));
    if(p == NULL)
    {
        return NULL;
    }
    else
    {
        p->data = x;
        p->pNext = NULL;
    }
    return p; // thêm chỗ này
}

Còn các hàm khác bạn nên đặt tên cho dễ hiểu, tường minh một xíu nhé. Chứ hàm thì đặt tên bằng tiếng Anh, còn hàm thì đặt tên bằng tiếng Việt nó không “cân bằng” cho lắm.

P/S: Bạn chỉ cần bỏ source code vào trong cặp thẻ [code][/code] là nó tự markdown luôn nhé.

hai viết 10:24 ngày 01/10/2018

cho dễ hiểu, tường minh một xíu nhé. Chứ hàm thì đặt tên bằng tiếng Anh, còn hàm thì đặt tên bằng tiếng Việt nó khô

ok thanks b. nhưng b cho mình hỏi là tại sao phải return chỗ đấy vậy?

rogp10 viết 10:25 ngày 01/10/2018

Bạn không return thì con trỏ đâu mà dùng

Người bí ẩn viết 10:29 ngày 01/10/2018

Hàm getNode của bạn trả về kiểu NODE *, mà biến p thuộc kiểu NODE * được cấp phát trong hàm đó thì sau khi gán data cho p và cho pNext trỏ đến NULL thì phải return nó về. Chứ nếu không return về thì bạn khai báo, cấp phát, gán cho p làm gì ?

hai viết 10:36 ngày 01/10/2018

nhưng mình thêm return rồi mà kết quả vẫn không dc, nó chỉ hiện ra list ban đầu

hai viết 10:24 ngày 01/10/2018

thế là vì sao vậy b??

Người bí ẩn viết 10:28 ngày 01/10/2018

ThemSau(l,Q,P);

Cái hàm này ở đâu ra thế ?

hai viết 10:26 ngày 01/10/2018

Node§;
ThemSau(l,Q,P

mình sửa chỗ đấy rồi mà nó vẫn thế mà

rogp10 viết 10:32 ngày 01/10/2018

Điều kiện phải là k == q. Nếu chỉ cần trùng data bạn đã viết prototype khác.

Với lại hai câu đó tạo thành 1 vòng kín, tức là new_element -> pNext == new_element, may là bạn chưa chạy được.

hai viết 10:29 ngày 01/10/2018

t chạy dc ròi nhưng kq ra không đúng b

hai viết 10:31 ngày 01/10/2018

mình sửa chỗ đấy rồi mà nó vẫn thế mà

Người bí ẩn viết 10:26 ngày 01/10/2018

@nguyenhonghai1997 bạn có biết source code của bạn đang làm cái gì không ?
Code bạn hoàn toàn chạy đúng, nó không ra kết quả là do bạn không biết source code của bạn chạy như thế nào.

hai viết 10:35 ngày 01/10/2018

không ra kết quả là do bạn khô

mình muốn code chạy:“thêm phần tử new_element vào sau phan tử thứ q”

Người bí ẩn viết 10:29 ngày 01/10/2018

mình muốn code chạy:“thêm phần tử new_element vào sau phan tử thứ q”

Bạn chắc chưa ?

Người bí ẩn viết 10:34 ngày 01/10/2018
printf("\nnhap vi tri muon them: ");
scanf("%d", &q);
NODE *Q = getNode(q);

Ở đây, bạn thực hiện động tác nhập vị trí của node cần thêm.

if(k->data == q->data) // Tìm th?y q nè

Nhưng ở đây, bạn lại thực hiện động tác kiểm tra xem data của node hiện tại có trùng với data của node cần thêm vào sau hay không, hay nói cách khác, source code của bạn dùng để thêm 1 node vào sau 1 node định trước có trong list, chứ không phải thêm node vào sau node thứ n !

Để cho dễ hiểu, bạn chạy chương trình lên và nhập 3 node:

  • Node 1: Nhập data là giá trị 1
  • Node 2: Nhập data là giá trị 2
  • Node 3: Nhập data là giá trị 3
  • Sau khi nhập xong, chương trình sẽ hỏi "Nhap vi tri muon them: ", bạn sẽ nhập giá trị 3, sau đó chương trình sẽ hỏi tiếp "nhap element: ", bạn sẽ nhập bất cứ giá trị nào bạn muốn, và xem kết quả.
    hai viết 10:32 ngày 01/10/2018

    uh mình thử thì nó vẫn hiện danh sách ban đầu

    hai viết 10:25 ngày 01/10/2018

    thế là vì sao vay ban?

    Người bí ẩn viết 10:36 ngày 01/10/2018

    uh mình thử thì nó vẫn hiện danh sách ban đầu

    Bạn update lại source code chưa:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    //khai bao cau truc du lieu
    struct node
    {
    	int data;
    	struct node *pNext;
    };
    typedef struct node NODE;
    struct list
    {
    	NODE *pHead;
    	NODE *pTail;
    };
    typedef struct list LIST;
    //khoi tao
    void init(LIST &l)
    {
    	l.pHead = l.pTail = NULL;
    }
    //tao node
    NODE *getNode(int x)
    {
    	NODE *p;
    	p = (NODE*)malloc(sizeof(NODE));
    	if (p == NULL)
    	{
    		return NULL;
    	}
    	else
    	{
    		p->data = x;
    		p->pNext = NULL;
    	}
    	return p;
    }
    // them vao dau cua list
    void insertFirst(LIST &l, NODE *new_element)
    {
    	if (l.pHead == NULL)
    	{
    		l.pHead = l.pTail = new_element;
    	}
    	else
    	{
    		new_element->pNext = l.pHead;
    		l.pHead = new_element;
    	}
    }
    // them vao cuoi list
    void insertEnd(LIST &l, NODE *new_element)
    {
    	if (l.pHead == NULL)
    	{
    		l.pHead = l.pTail = new_element;
    	}
    	else
    	{
    		l.pTail->pNext = new_element;
    		l.pTail = new_element;
    	}
    
    }
    
    void ThemGiua(LIST &l, NODE *p, NODE *q)
    {
    	for (NODE *k = l.pHead; k != NULL; k = k->pNext)
    	{
    		if (k->data == q->data) // Tìm th?y q nè
    		{
    			NODE *g = k->pNext;
    			k->pNext = p;
    			p->pNext = g;
    			return; // K?t thúc
    		}
    	}
    }
    //in put
    void inPut(LIST &l, int n)
    {
    	init(l);
    
    	for (int i = 1; i <= n; i++)
    	{
    		int x;
    		printf("nhap data: ");
    		scanf("%d", &x);
    		NODE *new_element = getNode(x);
    		insertEnd(l, new_element);
    	}
    }
    // out put
    void outPut(LIST l)
    {
    	for (NODE *p = l.pHead; p != NULL; p = p->pNext)
    	{
    		printf("%d\t", p->data);
    	}
    }
    int main()
    {
    	LIST l;
    	int n;
    	printf("nhap so node trong list: ");
    	scanf("%d", &n);
    	inPut(l, n);
    	outPut(l);
    	int q;
    	int p;
    	printf("\nnhap vi tri muon them: ");
    	scanf("%d", &q);
    	NODE *Q = getNode(q);
    	printf("\nnhap element: ");
    	scanf("%d", &p);
    	NODE *P = getNode(p);
    	ThemGiua(l, P, Q);
    	//printf("\nDanh sach sau khi them: \n");
    	outPut(l);
    	getch();
    	return 0;
    }
    
    
    hai viết 10:30 ngày 01/10/2018

    đây, vẫn k dc

    Người bí ẩn viết 10:31 ngày 01/10/2018

    thế là vì sao vay ban?

    Bạn sửa câu này:

    printf("\nnhap vi tri muon them: ");

    thành:

    printf("\nNhap gia tri Node can duoc them vao sau: ");
    

    và debug từng dòng trong hàm ThemGiua rồi ngẫm nghĩ, bạn sẽ hiểu.

    Bài liên quan
    0