Lỗi khi thêm 1 node vào đằng sau các node chẵn trong Doubly-Linked List

Hi mọi người,

Mình đang làm 1 bài tập nhập/xuất DSLK đôi và thêm 1 node (nhập từ keyboard) vào đằng trước tất cả các node chẵn có trong DSLK.
VD: Node thêm vào có data là 69. Suy ra:

Input: 23 54 90 87 66
Output: 23 69 54 69 90 87 69 66

Còn đây là source code: http://codepad.org/utADgM7v

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

typedef struct node NODE; // khai báo thông tin của 1 node (gồm data và pNext, pPrev)
typedef struct list LIST; // khai báo thông tin của 1 list (gồm pHead và pTail)
NODE* CreateNode(int); // tạo 1 node và trả về con trỏ NODE *
void AddHead(LIST *, NODE *); // thêm 1 node vào đầu danh sách
void AddTail(LIST *, NODE *); // thêm 1 node vào cuối danh sách
void InPut(LIST *l, int ); // nhập danh sách
void OutPut(LIST *); // xuất danh sách
void Delete(LIST *); // giải phóng tất cả con trỏ
void AddPrevEvenNumber(LIST *, NODE *, int *); // thêm 1 node vào đằng sau các node chẵn

struct node {
	int data;
	NODE *pNext, *pPrev;
};

struct list {
	NODE *pHead, *pTail;
};

NODE* CreateNode(int value)
{
	NODE *p = (NODE *)malloc(sizeof(NODE));
	if (p == NULL)
		return NULL;
	p->data = value;
	p->pNext = p->pPrev = 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->pPrev = p;
		l->pHead = p;
	}
}

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

void InPut(LIST *l, int n)
{
	l->pHead = l->pTail = NULL;
	for (int i = 0; i < n; ++i) {
		int value = 1 + rand() % 100;
		NODE *p = CreateNode(value);
		// AddHead(l, p);
		AddHead(l, p);
	}
}

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

void Delete(LIST *l)
{
	NODE *p = NULL;
	while (l->pHead != NULL) {
		p = l->pHead;
		l->pHead = l->pHead->pNext;
		free(p);
	}
}

void AddPrevEvenNumber(LIST *l, NODE *p, int *listsize)
{
    // xét từ node kế đầu trở đi
	for (NODE *n = l->pHead->pNext; n != NULL; n = n->pNext) {
		if (n->data % 2 == 0) {
			n->pPrev->pNext = p;
			p->pPrev = n->pPrev;
			p->pNext = n;
			n->pPrev = p;
			++(*listsize);
		}
	}
	// Xét riêng node đầu
	if (l->pHead->data % 2 == 0) {
		AddHead(l, p);
		++(*listsize);
	}
}

int main()
{
    srand(time(NULL));
    LIST *l = (LIST *)malloc(sizeof(LIST));
    int n;
    printf("Nhap so luong node: ");
    scanf("%d", &n);
    InPut(l, n);
    OutPut(l);
    int _value;
    printf("\nNhap data cua node muon them: ");
    scanf("%d", &_value);
    NODE *_p = CreateNode(_value);
    printf("List sau khi them node %d vao sau tat ca node chan: ", _value);
    AddPrevEvenNumber(l, _p, &n);
    OutPut(l);
    return 0;
}

Tuy code hơi dài, nhưng không khó hiểu lắm vì những hàm trong code chỉ là những hàm nhập/xuất bình thường, mình cũng đã chú thích rõ.
Nhưng khi compile & run thì kết quả không như mình mong muốn, lúc thì nó bị lặp vô tận, lúc thì nó không insert được mà còn mất 1 số node.
Lưu ý là nó chỉ sai ở hàm AddPrevEvenNumber thôi nhé, còn mấy hàm còn lại đều ổn.
Mình đã thử debug nhiều lần nhưng vẫn không tìm ra nguyên do :frowning:

Mọi người giúp mình nhé, xin cảm ơn !

Đã tìm ra solution.
Đây là 1 lỗi rất căn bản: 1 node không thể thêm được nhiều lần (do mình lầm với bên mảng).
Cảm ơn mọi người đã quan tâm :slight_smile:

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