ช่วยแก้โค๊ดหั้ยหน่อยน่ะค่ะ
ช่วยทีค่ะส่งก่อนห้าทุ่มวันนี้ค่ะ
โปรแกรมที่รวมรายการโยงสองสายเข้าด้วยกัน โดยที่ผลลัพธ์เป็นรายการโยงที่มีการเรียงลำดับจากน้อยไปมาก สมมุติให้ข้อมูลที่เก็บในรายการโยงทั้งสองสายนั้นเรียงลำดับจากน้อยไปมาก (ต้องคำนึงถึงวิธีดำเนินการที่มีประสิทธิภาพสูงสุด) เช่น List1: 1, 3, 5, 6, 8, 10 List2: 1, 2, 8, 16, 32, 50 AList: 1, 1, 2, 3, 5, 6, 8, 8, 10, 16, 32, 50
แก้โค๊ดนี่น่ะค่ะ
#include<stdio.h> #include<conio.h> #include<stdlib.h>
typedef int NODEVAL;
typedef struct node{ NODEVAL val; struct node *next; } LISTNODE;
typedef struct list{ LISTNODE *head; } LIST;
LISTNODE *getnode(NODEVAL v){ LISTNODE *n; n = new LISTNODE; // n = (LISTNODE *)malloc(sizeof(LISTNODE)); n->val = v; n->next = NULL; return n; }
LIST *createList(){ LIST *l; l = new LIST; l->head = NULL; return l; }
// isListEmpty() is a function to check whether // list is empty. // return value: // return 1 if list is empty, else return 0. int isListEmpty(LIST *l) { return (l->head == NULL); }
void insFront(LIST *l, LISTNODE *n){ n->next = l->head; l->head = n; }
void insAfter(LISTNODE *pre, LISTNODE *n){ n->next = pre->next; pre->next = n; }
void insEnd(LISTNODE *pre, LISTNODE *n){ insAfter(pre, n); }
void insOrdList(LIST *l, LISTNODE *n){ if(isListEmpty(l)) insFront(l, n); // ins first node else{ LISTNODE *ptr, *pre=NULL; ptr = l->head; while((ptr->val < n->val ) && ptr->next!=NULL){ pre = ptr; ptr = ptr->next; } if(ptr->val == n->val) insAfter(ptr, n); // same val, ins into else{ if(ptr->val < n->val) // ins end insAfter(ptr, n); else if(ptr==l->head) insFront(l, n); // ins before head-node else insAfter(pre, n); // ins between list } } }
void delFront(LIST *l){ LISTNODE *save; save = l->head; l->head = (l->head)->next; delete save; // free(save); }
void delAfter(LISTNODE *pre){ LISTNODE *save; save = pre->next; pre->next = save->next; delete save; // free(save); }
void delOrdList(LIST *l, NODEVAL target){ if(isListEmpty(l)) return; else{ LISTNODE *ptr, *pre=NULL; ptr = l->head; while((ptr->val != target) && ptr->next!=NULL){ pre = ptr; ptr = ptr->next; } if(ptr->val != target) return; // no data found. else{ if(ptr==l->head) delFront(l); // del head else delAfter(pre); // del after } } }
void printList(LIST *l) { LISTNODE *ptr = l->head; while( ptr != NULL ){ printf("%3d", ptr->val); ptr = ptr->next; // next node } printf("\n"); }
main() { LIST *list; LISTNODE *node; list = createList(); int i, v; for(i=1;i<=4;i++){ printf("INSERT number(%d) into list: ", i); scanf("%d", &v); node = getnode(v); insOrdList(list, node); }
printList(list);
printf("DELETE: "); scanf("%d", &v); delOrdList(list, v);
printList(list);
getch(); }
# แก้ไขโค้ดตัวอย่างจากน main() ให้มีได้ 2 list จากนั้นจึงสร้างฟังก์ชัน mergeList() เพื่อผสาน list ทั้งสอง
void mergeList(LIST *l1, LIST *l2){ ? ? ... ? ?... }
|