01/10/2018, 01:01

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("
Nhap 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

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

Người bí ẩn viết 03:03 ngày 01/10/2018

Đã 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

Bài liên quan
0