01/10/2018, 00:38

Xóa node trong danh sách liên kết

Em xin chào các anh chi ạ

Em đang làm bài tập về danh sách liên kết đơn. Nếu xóa , chèn vào các vị trí thì em làm được rồi. Giờ em đang khó khắn ở chỗ này: em có một danh danh sách các số nguyên (link list). Em muốn loại bỏ các node có trường data là chẵn ( vì node chẵn có thể năm ở đầu giữa hoắc cuối ), các anh chi và các bạn có thể hướng dẫn cho em cách duyệt thế nào được không ạ.Em cám ơn.

viết 02:52 ngày 01/10/2018

xóa con trỏ đầu và cuối thì không có gì! xóa ở giữa thì cho khi nào duyệt đến vị trí trước vị trí cần xóa( p->next thỏa mãn điều kiện xóa) thì cho nó trỏ đến nút tiếp theo(p->next = p->next->next)

Tao Không Ngu. viết 02:39 ngày 01/10/2018

Tuy yêu cầu bạn có thể thêm 1 flag isUse. Nếu muốn xóa thì gán nó bằng false là OK!

Bò Lúc Lắc viết 02:41 ngày 01/10/2018
Node* xoaNodeChan(Node *node) 
{
    Node *tempF = null;
    Node *temp = new Node();
    temp->p_next = node;
    while(temp->p_next != null) 
    {
        if (temp->p_next->value % 2 == 0) {
            Node *tempDel = temp->p_next;
            temp->p_next = temp->p_next->p_next;
            Delete(tempDel);
        } else {
             if (tempF == null) 
             {
                  tempF = temp->p_next;
             }
             temp = temp->p_next;
        }
    }
    return tempF;
}

tham khảo xem giúp dc gì ko nha. (Cú pháp có thể sai vài chổ)

Gió viết 02:50 ngày 01/10/2018

Dùng đệ quy là cách đơn giản để thao tác trên node, vì không phải quan tâm đến node trước đó

ví dụ xóa node chẵn

node * xoa_chan(node *n){
     if(n==NULL) return NULL;
     if(n->data%2==0) return xoa_chan(n->next); // node n bị xóa trả về kết quả của các node sau
     n->next=xoa_chan(n->next);  // node n được giữ lại +  kq node sau
     return n;
}
DAT NGO viết 02:42 ngày 01/10/2018

duyệt đến node đứng trước node cần xóa rồi dùng hàm xóa trước 1 node nha bạn

Nobita viết 02:38 ngày 01/10/2018

xóa node ở đây là dùng free hoặc delete đó anh

Nobita viết 02:50 ngày 01/10/2018

anh ơi .cho em hỏi là như đoạn code trên thì ô nhớ chứa dữ liệu chẵn có hoàn toàn bị xóa ko vậy ạ

Nobita viết 02:43 ngày 01/10/2018

em test qua thì thấy nếu node chắn là node đầu tiền thì không xoa được

Nobita viết 02:47 ngày 01/10/2018

node trước của node đầu tiên là node nào vậy anh

Bò Lúc Lắc viết 02:52 ngày 01/10/2018

oki đã cập nhật lại code nha. xem oki ko em

Gió viết 02:47 ngày 01/10/2018

Kết quả là giá trị trả về của hàm.

Nobita viết 02:39 ngày 01/10/2018

nếu node đầu là chăn thì không xóa đươc anh à

Bò Lúc Lắc viết 02:46 ngày 01/10/2018

tempF sẽ là head mới.
nếu dùng sẽ có dạng

node = xoaNodeChan(node);

em có dùng giống vậy không. Code này a chỉ code chứ ko chạy thử trên máy nên ko biết sẽ sai ở đâu. e check lại nha

Nobita viết 02:46 ngày 01/10/2018

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

typedef struct node{
int data;
struct node *next;
}node;
node *init(node *list,int x)
{
node p=(node)malloc(sizeof(node));
p->next=list;
p->data=x;
}

node* xoaNodeChan(node *list)
{
node tempF =(node)malloc(sizeof(node));
tempF=NULL;
node temp =(node)malloc(sizeof(node));
temp->next = list;
while(temp->next != NULL)
{
if (temp->next->data % 2 == 0) {
node tempDel=(node)malloc(sizeof(node));
tempDel = temp->next;
temp->next = temp->next->next;
free(tempDel);
} else {
if (tempF == NULL)
{
tempF = temp->next;
}
temp = temp->next;
}
}
return tempF;
}
void printfll(node *list)
{
while(list!=NULL)
{
printf("%d :",list->data);
list=list->next;}
printf("\n");
}
int main()
{
node *a,*b,*c,*d,*e,*f;
a=init(NULL,50);
b=init(a,4);
c=init(b,3);
d=init(c,2);
e=init(d,10);
f=init(e,2);
printfll(f);

xoaNodeChan(f);
printfll(f);

getch();
return 1;

}

Nobita viết 02:48 ngày 01/10/2018

em dùng như dưới đó anh
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

typedef struct node{
int data;
struct node *next;
}node;
node *init(node *list,int x)
{
node p=(node)malloc(sizeof(node));
p->next=list;
p->data=x;
}

node* xoaNodeChan(node *list)
{
node tempF =(node)malloc(sizeof(node));
tempF=NULL;
node temp =(node)malloc(sizeof(node));
temp->next = list;
while(temp->next != NULL)
{
if (temp->next->data % 2 == 0) {
node tempDel=(node)malloc(sizeof(node));
tempDel = temp->next;
temp->next = temp->next->next;
free(tempDel);
} else {
if (tempF == NULL)
{
tempF = temp->next;
}
temp = temp->next;
}
}
return tempF;
}
void printfll(node *list)
{
while(list!=NULL)
{
printf("%d :",list->data);
list=list->next;}
printf("\n");
}
int main()
{
node *a,*b,*c,*d,*e,*f;
a=init(NULL,50);
b=init(a,4);
c=init(b,3);
d=init(c,2);
e=init(d,10);
f=init(e,2);
printfll(f);

xoaNodeChan(f);
printfll(f);

getch();
return 1;

}

Quân viết 02:53 ngày 01/10/2018

code bị bug leak mem rồi bro.

Gió viết 02:51 ngày 01/10/2018

Cố ý để vậy mà …

Bò Lúc Lắc viết 02:52 ngày 01/10/2018

xoaNodeChan(f);
printfll(f);

như vậy mới đúng nè

f = xoaNodeChan(f);
printfll(f);
Bài liên quan
0