Hỏi về danh sách liên kết đơn trong C++

Trên mặt lý thuyết thì mình đã hiểu về cách hoạt động của danh sách liên kết đơn.
Nhưng tới khi viết code thì mình lại không biết cách nhập xuất như thế nào cả.
cần nhập xuất về danh sách liên kết đơn thì mình cần mấy bước vậy mấy bạn.
1.khai báo Node
2.khởi tạo dữ liệu
3…
Mong các bạn giúp mình với!!

1 Like

Một chương trình cơ bản này c:

#include <stdio.h>
#include <conio.h>


struct Node
{
	int Data;
	struct Node *pNext;
};
typedef struct Node NODE;

struct List
{
	NODE *pHead;
	NODE *pTail;
};
typedef struct List LIST;

void Init(LIST &l)
{
	l.pHead = l.pTail = NULL;
}
NODE* GetNODE(int x) 
{
	NODE *p = new NODE;
	if(p == NULL)
	{
		return NULL;
	}
	p->Data = x;
	p->pNext = NULL;
	return p;
}

void AddHead(LIST &l,NODE *p)
{
	if(l.pHead == NULL) 
	{
		l.pHead = l.pTail = p;
	}
	else
	{
		p ->pNext = l.pHead; 
		l.pHead = p; 		 
	}
}

void InPut(LIST &l,int n)
{
	Init(l); 
	for(int i = 1; i <= n; i++)
	{
		int x;
		printf("\nNhap vào data: ");
		scanf("%d", &x);
		
		NODE *p = GetNODE(x); 
		AddHead(l, p);
	}
}

void OutPut(LIST l)
{
	for(NODE *p = l.pHead; p != NULL; p = p ->pNext)
	{
		printf("%4d",p ->Data);
	}
}

int main()
{
	LIST l;
	int n;
	printf("\nBan muốn nhập bao nhiêu Node: ");
	scanf("%d", &n);
	InPut(l,n);
	OutPut(l);
}
3 Likes

Mình vẫn chưa hiểu chổ này bạn có thể giải thích cho mình được không!

NODE* GetNODE(int x) 
{
	NODE *p = new NODE;
	if(p == NULL)
	{
		return NULL;
	}
	p->Data = x;
	p->pNext = NULL;
	return p;
}
2 Likes
NODE* GetNODE(int x) 
{
	NODE *p = new NODE; // cấp phát bộ nhớ cho con trỏ p
	if(p == NULL) // ko cấp phát được bộ nhớ cho con trỏ p
	{
		return NULL;
	}
	p->Data = x; // Data = x
	p->pNext = NULL; // con trỏ pNext = NULL
	return p;
}
2 Likes

cho em hoi
struct List
{
NODE *pHead;
NODE *pTail;
};
em lên có cách hiểu nó là cái gì là chính xác nhất, là 1 LinkList bên trong có 2 con trỏ trỏ từ đầu phần tử -> cuối phần tử ạ

Một trỏ vào đầu, một trỏ vào đuôi của cùng một con… con gì bây h nhỉ.

1 Like

Danh sách liên kết đôi, mỗi node trỏ đến 2 node. 2 đầu danh sách trong trường hợp thông thường là NULL, trong trường hợp vòng thì trỏ đến node khác trong danh sách.

1 Like

anh ơi, em tưởng đó là dánh sách liên kết đơn ạ,

Phải xem NODE gồm thành phần nào nữa.

không biết mình sai ở đâu mà chạy không được

#include<iostream>
using namespace std;

struct Node
{
	int data;
	struct Node *pnext;
};
typedef struct Node NODE;
struct List
{
	NODE *phead;
	NODE *ptail;
};
typedef struct List LIST;

void init(LIST &l) {
	l.phead = l.ptail = NULL;
}
NODE *getnode(int x) {
	NODE *p = new NODE;
	if (p == NULL) {
		return p;
	}
	p->data = x;
	p->pnext = NULL;
	return p;
}
void addhead(LIST &l, NODE *p) {
	if (l.phead = NULL) {
		l.phead = l.ptail = p;
	}else{
	p->pnext = l.phead;
	l.phead = p;  }
}
void input(LIST &l, int n) {
	init(l);
	for (int i = 1; i <= n; i++) {
		int x;
		cout << " nhap : ";
		cin >> x;
		NODE *p = getnode(x);
		addhead(l, p);
	}
}

void output(LIST &l) {
	for (NODE *p = l.phead; p != NULL; p = p->pnext) {
		cout << p->data;
	}
}

int main() {
	LIST(l);
	int n;
	cout << " nhap ds ";
	cin >> n;
	input(l, n);
	output(l);
	system("pause");
}

Hình như ở hàm output
Cout<data

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