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.
Bài liên quan
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)
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!
tham khảo xem giúp dc gì ko nha. (Cú pháp có thể sai vài chổ)
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
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
xóa node ở đây là dùng free hoặc delete đó anh
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 ạ
em test qua thì thấy nếu node chắn là node đầu tiền thì không xoa được
node trước của node đầu tiên là node nào vậy anh
oki đã cập nhật lại code nha. xem oki ko em
Kết quả là giá trị trả về của hàm.
nếu node đầu là chăn thì không xóa đươc anh à
tempF sẽ là head mới.
nếu dùng sẽ có dạng
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
#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);
}
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);
}
code bị bug leak mem rồi bro.
Cố ý để vậy mà …
như vậy mới đúng nè