คือนั่งงมๆอยู่พักใหญ่ๆแล้วทำไม่ถูกอะครับ คือ ผมมีไฟล์ .txt ซึ้งในไฟล์นี้ก็จะมี ID Pass ของ สมาชิกอยู่ 10คน ผมอยากที่จะดึงข้อมูลในไฟล์นี้อะครับออกมา ทำเป็น link list ต่อๆกัน แล้วก็ เอามาใส่ไว้ใน file .txt อีกอันนึงอะครับ ขอคำแนะนำหน่อยครับ
อ่านไฟล์เป็นรึยัง
เป็นละครับแต่ปัญหาคือผมพยามเขียน เป็นฟังก์ชัน ผมพยาม return ค่ากลับมา มันไม่มาทั้ง list ที่ผมสร้างไว้มามาแค่ตัวสุดท้ายที่ อะครับ createnode(LISTNODE *Qnode,FILE *fp,FILE *fp2){
LISTNODE *head; fscanf(fp,"%d",&Qnode->data.id); fscanf(fp,"%d",&Qnode->data.salary); fscanf(fp,"%d",&Qnode->data.per); head=malloc(sizeof(LISTNODE)); head->next=NULL; head->data.id=Qnode->data.id; head->data.salary=Qnode->data.salary; head->data.per=Qnode->data.per;
}
ผมเขียนอะไรผิดหรือเปล่าพอดีผมเพิ่งเริ่มศึกษา เรื่อง นี้อะครับ
ถ้า Qnode เป็น List ที่มี item อยู่ก่อนแล้วอยากจะเพิ่ม head ที่หัว ผมยังไม่เห็นว่าจะมี head->next = Qnode เลย. นอกจากนั้นยังเขียนข้อมูลใหม่ทับ Qnode ที่มีข้อมูลอยู่ก่อนแล้วอีกตะหาก.
เพิ่ม Qnode->next = head; ครับ
typedef struct _Item { Item* pPrevItem; Item* pNextItem; IDPass data; } Item;
Item* pHeadItem;
เชิงโครงสร้างใบ้ได้แค่นี้ครับ มันพอจะบอก behaviour ได้หน่อยๆแล้วครับว่ามีอะไรบ้าง
Edit: โอ๊ะ ภาษา C นึกว่า C++ ขอแก้นะครับ
linked list ผมเขียนแบบนี้ครับ (เป็น single linked-list นะครับ ถ้าเอา double ก็มีแก้เพิ่มอีกหน่อย)
struct node { value v; node* next; }; struct list { node* head; /* ใส่พวก property ที่อยากแคชเก็บไว้ เช่นพวกจำนวน Node ในลิสต์ }
แล้วก็มีฟังก์ชั่นพวก
node* list_insert_after(const node& pos, value v) { pos.next = (node*)malloc(sizeof(node)); pos.next->v = v; pos.next->next = NULL; return pos->next; } node* list_append(const list& l, const value& v) { node* pos = l.head; while(pos->next!=NULL) { pos = pos->next; } return list_append_after(*pos, v); }
(แยกเป็นสองฟังก์ชั่นน่าจะดูง่ายกว่าน่ะครับ และฟังก์ชั่นข้างบนมีจุดผิดอยู่)
จากนั้นก็ loop อ่านไฟล์แล้วก็ใส่ลงไปใน list เป็นอันจบ
ขอบคุณมากเลยครับ แล้วก็ขอบคุณทุกคนด้วยเข้าใจขึ้นเยอะเลย :D
นี่จริงๆ ก็ยังเป็น C++ นะครับ
C ต้องใช้ struct node มันไม่มี typedef อัตโนมัติ ไม่มี reference และไม่จำเป็นต้อง explicit cast เวลาแปลง void* เป็น T*
ขอบคุณครับ ผมไม่ค่อยเชี่ยว C เท่าไหร่ (ปรกติเขียนแต่ C++) นึกไปเองว่ามันมีเพิ่มเข้ามาในเวอร์ชั่นใหม่ ๆ 555
อีกหน่อยครับ ใครมีเทคนิคการ sort link list มั่งครับ
คือผมมี list อยู่ตัวนึงมีข้อมูลพนักงานอยู่ 10คน(เป็น strcut ) แต่ละคนก็มี ID เงินเดือน ตำแหน่ง แล้วอยาก จะให้มันเรียงลำดับให้ใหม่อะครับ ให้เอาเงินเดือนต่ำสุด เขียนลงไปใน file.txt เรียงลงมาเรื่อยๆจนถึงสูงสุด ถ้าเงินเดือนเท่ากันให้ ดูที่ ID ว่า IDใครมาก่อนก็อยู่บน
นี้คือ strcu ที่ผมบอกอะครับ typedef struct employee{ int id; double salary; int per; }EMP;
อยากทราบเทคนิคว่ามันทำวิธีไหนได้บ้าง ในการ sort มัน
ไหนๆ ก็ต้องไล่ตลอดสายแล้ว ทำแบบนี้ได้มั้ยครับ?
เผื่อจะได้ + คะแนน :p
ทำเกินคำสั่งอาจจะถูกตัดคะแนนได้นะครับ ระวังด้วย
link list ไม่เหมาะกับการ sort ครับ เพราะมัน random access ไม่ได้ (เช่น จะหยิบสมาชิกตัวที่ 5 ใน list ต้องไล่ไป 5 ครั้ง) เวลา sort เลยต้องใช้ linear sort เท่านั้น ซึ่งเป็นวิธีที่แย่ที่สุด หากจะ sort ควรใช้ binary tree ครับ
อ่านไฟล์เป็นรึยัง
เป็นละครับแต่ปัญหาคือผมพยามเขียน เป็นฟังก์ชัน ผมพยาม return ค่ากลับมา มันไม่มาทั้ง list ที่ผมสร้างไว้มามาแค่ตัวสุดท้ายที่ อะครับ
createnode(LISTNODE *Qnode,FILE *fp,FILE *fp2){
}
ผมเขียนอะไรผิดหรือเปล่าพอดีผมเพิ่งเริ่มศึกษา เรื่อง นี้อะครับ
ถ้า Qnode เป็น List ที่มี item อยู่ก่อนแล้วอยากจะเพิ่ม head ที่หัว ผมยังไม่เห็นว่าจะมี head->next = Qnode เลย. นอกจากนั้นยังเขียนข้อมูลใหม่ทับ Qnode ที่มีข้อมูลอยู่ก่อนแล้วอีกตะหาก.
เพิ่ม Qnode->next = head; ครับ
typedef struct _Item
{
Item* pPrevItem;
Item* pNextItem;
IDPass data;
} Item;
Item* pHeadItem;
เชิงโครงสร้างใบ้ได้แค่นี้ครับ มันพอจะบอก behaviour ได้หน่อยๆแล้วครับว่ามีอะไรบ้าง
Edit: โอ๊ะ ภาษา C นึกว่า C++ ขอแก้นะครับ
linked list ผมเขียนแบบนี้ครับ (เป็น single linked-list นะครับ ถ้าเอา double ก็มีแก้เพิ่มอีกหน่อย)
แล้วก็มีฟังก์ชั่นพวก
(แยกเป็นสองฟังก์ชั่นน่าจะดูง่ายกว่าน่ะครับ และฟังก์ชั่นข้างบนมีจุดผิดอยู่)
จากนั้นก็ loop อ่านไฟล์แล้วก็ใส่ลงไปใน list เป็นอันจบ
ขอบคุณมากเลยครับ แล้วก็ขอบคุณทุกคนด้วยเข้าใจขึ้นเยอะเลย :D
นี่จริงๆ ก็ยังเป็น C++ นะครับ
C ต้องใช้ struct node มันไม่มี typedef อัตโนมัติ ไม่มี reference และไม่จำเป็นต้อง explicit cast เวลาแปลง void* เป็น T*
ขอบคุณครับ ผมไม่ค่อยเชี่ยว C เท่าไหร่ (ปรกติเขียนแต่ C++) นึกไปเองว่ามันมีเพิ่มเข้ามาในเวอร์ชั่นใหม่ ๆ 555
อีกหน่อยครับ ใครมีเทคนิคการ sort link list มั่งครับ
คือผมมี list อยู่ตัวนึงมีข้อมูลพนักงานอยู่ 10คน(เป็น strcut ) แต่ละคนก็มี ID เงินเดือน ตำแหน่ง แล้วอยาก จะให้มันเรียงลำดับให้ใหม่อะครับ ให้เอาเงินเดือนต่ำสุด เขียนลงไปใน file.txt เรียงลงมาเรื่อยๆจนถึงสูงสุด ถ้าเงินเดือนเท่ากันให้ ดูที่ ID ว่า IDใครมาก่อนก็อยู่บน
นี้คือ strcu ที่ผมบอกอะครับ
typedef struct employee{
int id;
double salary;
int per;
}EMP;
อยากทราบเทคนิคว่ามันทำวิธีไหนได้บ้าง ในการ sort มัน
ไหนๆ ก็ต้องไล่ตลอดสายแล้ว ทำแบบนี้ได้มั้ยครับ?
เผื่อจะได้ + คะแนน :p
ทำเกินคำสั่งอาจจะถูกตัดคะแนนได้นะครับ ระวังด้วย
link list ไม่เหมาะกับการ sort ครับ เพราะมัน random access ไม่ได้ (เช่น จะหยิบสมาชิกตัวที่ 5 ใน list ต้องไล่ไป 5 ครั้ง) เวลา sort เลยต้องใช้ linear sort เท่านั้น ซึ่งเป็นวิธีที่แย่ที่สุด หากจะ sort ควรใช้ binary tree ครับ