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\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);
	ThemSau(l,Q,P);
	//printf("\nDanh sach sau khi them: \n");
	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!

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é.

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

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

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ì ?

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

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

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

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

Đ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.

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

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

@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.

1 Like

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 ?

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

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ả.

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

    thế là vì sao vay ban?

    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;
    }
    
    

    đây, vẫn k dc

    83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?