การจัดการข้อมูลเป็นหนึ่งในภารกิจหลักของโปรแกรมเมอร์ ไม่ว่าจะเป็นการเรียงลำดับ, ค้นหา หรือการแก้ไขข้อมูล เรามักต้องการโครงสร้างข้อมูลที่เหมาะสมเพื่อให้ระบบทำงานได้อย่างมีประสิทธิภาพ Double Ended Queue หรือ Deque เป็นโครงสร้างข้อมูลที่เหมาะสมอย่างยิ่งสำหรับการจัดการข้อมูลแบบ dynamic ในภาษา C เนื่องจากเปิดโอกาสให้เราสามารถเข้าถึงข้อมูลจากทั้งสองด้านของคิว ทั้งส่วนหัวและส่วนท้ายได้
ความสำคัญและคุณสมบัติของ Deque
Deque นั้นมีความเหมาะสมเมื่อเราต้องเผชิญกับปัญหาที่ต้องการการเพิ่มหรือลบข้อมูลจากทั้งสองด้านของคิว โดยทั่วไปโครงสร้างข้อมูลดังกล่าวรักษาข้อมูลในลักษณะเชื่อมโยงกันเป็นลิสต์ (linked list) ทำให้การเข้าถึงข้อมูลสามารถทำได้ง่ายและรวดเร็ว
ข้อดีของ Deque:
- เข้าถึงข้อมูลได้จากทั้งสองด้าน
- การเพิ่มหรือลบข้อมูลใน Deque ทำได้รวดเร็ว
- เหมาะสะงัดกับการใช้งานที่มีความยืดหยุ่นสูง
ข้อเสียของ Deque:
- จัดการหน่วยความจำได้ซับซ้อนกว่า Array
- อาจใช้หน่วยความจำมากกว่า Array เนื่องจากต้องจัดเก็บ pointer
ตัวอย่างคำสั่งใน Deque และการทำงาน
การใช้งานโครงสร้างข้อมูลนี้ในภาษา C ไม่ได้ยากเย็นอะไร ลองมาดูตัวอย่างโค้ดการเพิ่ม (insert), เพิ่มที่ด้านหน้า (insertAtFront), ค้นหา (find), และลบ (delete) กัน:
#include
#include
// สมมติว่าเรามีโครงสร้างข้อมูลสำหรับโหนด (Node) และ deque
typedef struct Node {
int data;
struct Node *next;
struct Node *prev;
} Node;
typedef struct Deque {
Node *front;
Node *rear;
} Deque;
// ฟังก์ชันสำหรับสร้างโหนดใหม่
Node* createNode(int data) {
Node *newNode = (Node*) malloc(sizeof(Node));
if (!newNode) return NULL;
newNode->data = data;
newNode->next = newNode->prev = NULL;
return newNode;
}
// ฟังก์ชันสำหรับเพิ่มข้อมูลที่ส่วนท้ายของ Deque
void insert(Deque *deque, int data) {
Node *newNode = createNode(data);
if (!newNode) return;
if (!deque->rear) {
deque->front = deque->rear = newNode;
} else {
newNode->prev = deque->rear;
deque->rear->next = newNode;
deque->rear = newNode;
}
}
// ฟังก์ชันสำหรับเพิ่มข้อมูลที่ส่วนหัวของ Deque
void insertAtFront(Deque *deque, int data) {
Node *newNode = createNode(data);
if (!newNode) return;
if (!deque->front) {
deque->front = deque->rear = newNode;
} else {
newNode->next = deque->front;
deque->front->prev = newNode;
deque->front = newNode;
}
}
// ฟังก์ชันสำหรับการค้นหาข้อมูลภายใน Deque
Node* find(Deque *deque, int data) {
Node *current = deque->front;
while (current) {
if (current->data == data) return current;
current = current->next;
}
return NULL;
}
// ฟังก์ชันสำหรับการลบข้อมูลที่ส่วนหัวของ Deque
void deleteFront(Deque *deque) {
if (!deque->front) return;
Node *temp = deque->front;
deque->front = deque->front->next;
if (deque->front) {
deque->front->prev = NULL;
} else {
deque->rear = NULL;
}
free(temp);
}
// ฟังก์ชันสำหรับการลบข้อมูลที่ส่วนท้ายของ Deque
void deleteRear(Deque *deque) {
if (!deque->rear) return;
Node *temp = deque->rear;
deque->rear = deque->rear->prev;
if (deque->rear) {
deque->rear->next = NULL;
} else {
deque->front = NULL;
}
free(temp);
}
int main() {
// สร้าง Deque ว่าง
Deque deque = { NULL, NULL };
// ตัวอย่างการเพิ่มข้อมูล
insert(&deque, 10);
insertAtFront(&deque, 5);
// ตัวอย่างการค้นหาข้อมูล
Node *found = find(&deque, 10);
if (found) {
printf("Found: %d\n", found->data);
} else {
printf("Not found\n");
}
// ตัวอย่างการลบข้อมูล
deleteFront(&deque);
deleteRear(&deque);
return 0;
}
จากตัวอย่างโค้ดข้างต้นนี้, คุณจะเห็นว่า Deque ช่วยให้เราสามารถจัดการข้อมูลได้อย่างอิสระ ทั้งยังให้โอกาสในการเข้าถึงข้อมูลจากทั้งสองด้าน ตามที่ต้องการได้สะดวก ทว่าเรื่องของการจัดการหน่วยความจำนั้นต้องใช้ความรอบคอบและทักษะขั้นสูง โดยทั้งหมดนี้เป็นเพียงจุดเริ่มต้นสำหรับการเข้าใจตัวอย่างการใช้ Queue ในการจัดการข้อมูลไดนามิค
ณ สถาบัน EPT เรามีคอร์สเรียนเพื่อให้นักศึกษาได้ฝึกฝนทักษะโปรแกรมมิ่งในภาษา C และโครงสร้างข้อมูลอื่นๆ อย่างเชิงลึกมากขึ้น ถ้าคุณต้องการที่จะเสริมสร้างและพัฒนาทักษะในการเขียนโค้ดของคุณที่จะช่วยให้เข้าใจหลักการและประยุกต์ใช้งานได้จริง อย่ารอช้าที่จะติดต่อเราที่ EPT!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM