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!
Bài liên quan
Hàm
getNode
bạn đã return đâu ?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ểuNODE *
, mà biếnp
thuộc kiểuNODE *
được cấp phát trong hàm đó thì sau khi gán data chop
và chopNext
trỏ đếnNULL
thì phảireturn
nó về. Chứ nếu khôngreturn
về thì bạn khai báo, cấp phát, gán chop
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ùngdata
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:
đây, vẫn k dc
Bạn sửa câu này:
thành:
và debug từng dòng trong hàm
ThemGiua
rồi ngẫm nghĩ, bạn sẽ hiểu.