#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!
Thêm 1 phần tử vào sau 1 phần tử trong danh sách liên kết đơn
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
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.
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:
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;
}