Tags:

คือนั่งงมๆอยู่พักใหญ่ๆแล้วทำไม่ถูกอะครับ
คือ ผมมีไฟล์ .txt ซึ้งในไฟล์นี้ก็จะมี ID Pass ของ สมาชิกอยู่ 10คน ผมอยากที่จะดึงข้อมูลในไฟล์นี้อะครับออกมา ทำเป็น link list ต่อๆกัน แล้วก็ เอามาใส่ไว้ใน file .txt อีกอันนึงอะครับ
ขอคำแนะนำหน่อยครับ

Get latest news from Blognone
By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 20 February 2014 - 08:01 #680973
UltimaWeapon's picture

อ่านไฟล์เป็นรึยัง

By: sandsd01
Windows
on 20 February 2014 - 15:42 #681113 Reply to:680973

เป็นละครับแต่ปัญหาคือผมพยามเขียน เป็นฟังก์ชัน ผมพยาม 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;

}

ผมเขียนอะไรผิดหรือเปล่าพอดีผมเพิ่งเริ่มศึกษา เรื่อง นี้อะครับ

By: Diaboros_Sorobaid
Windows PhoneAndroidWindows
on 20 February 2014 - 16:13 #681122 Reply to:681113
Diaboros_Sorobaid's picture

ถ้า Qnode เป็น List ที่มี item อยู่ก่อนแล้วอยากจะเพิ่ม head ที่หัว ผมยังไม่เห็นว่าจะมี head->next = Qnode เลย. นอกจากนั้นยังเขียนข้อมูลใหม่ทับ Qnode ที่มีข้อมูลอยู่ก่อนแล้วอีกตะหาก.

By: duoh on 20 February 2014 - 16:58 #681135 Reply to:681113

เพิ่ม Qnode->next = head; ครับ

By: Diaboros_Sorobaid
Windows PhoneAndroidWindows
on 20 February 2014 - 09:29 #680984
Diaboros_Sorobaid's picture

typedef struct _Item
{
Item* pPrevItem;
Item* pNextItem;
IDPass data;
} Item;

Item* pHeadItem;

เชิงโครงสร้างใบ้ได้แค่นี้ครับ มันพอจะบอก behaviour ได้หน่อยๆแล้วครับว่ามีอะไรบ้าง

By: mr_tawan
ContributoriPhoneAndroidWindows
on 20 February 2014 - 19:20 #681169
mr_tawan's picture

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 เป็นอันจบ


  • 9tawan.net บล็อกส่วนตัวฮับ
By: sandsd01
Windows
on 20 February 2014 - 19:42 #681178 Reply to:681169

ขอบคุณมากเลยครับ แล้วก็ขอบคุณทุกคนด้วยเข้าใจขึ้นเยอะเลย :D

By: nat3738
ContributorAndroidRed HatUbuntu
on 20 February 2014 - 20:19 #681185 Reply to:681169

นี่จริงๆ ก็ยังเป็น C++ นะครับ

C ต้องใช้ struct node มันไม่มี typedef อัตโนมัติ ไม่มี reference และไม่จำเป็นต้อง explicit cast เวลาแปลง void* เป็น T*

By: mr_tawan
ContributoriPhoneAndroidWindows
on 22 February 2014 - 23:36 #681698 Reply to:681185
mr_tawan's picture

ขอบคุณครับ ผมไม่ค่อยเชี่ยว C เท่าไหร่ (ปรกติเขียนแต่ C++) นึกไปเองว่ามันมีเพิ่มเข้ามาในเวอร์ชั่นใหม่ ๆ 555


  • 9tawan.net บล็อกส่วนตัวฮับ
By: sandsd01
Windows
on 21 February 2014 - 01:08 #681247

อีกหน่อยครับ ใครมีเทคนิคการ sort link list มั่งครับ

คือผมมี list อยู่ตัวนึงมีข้อมูลพนักงานอยู่ 10คน(เป็น strcut ) แต่ละคนก็มี ID เงินเดือน ตำแหน่ง แล้วอยาก จะให้มันเรียงลำดับให้ใหม่อะครับ ให้เอาเงินเดือนต่ำสุด เขียนลงไปใน file.txt เรียงลงมาเรื่อยๆจนถึงสูงสุด ถ้าเงินเดือนเท่ากันให้ ดูที่ ID ว่า IDใครมาก่อนก็อยู่บน

นี้คือ strcu ที่ผมบอกอะครับ
typedef struct employee{
int id;
double salary;
int per;
}EMP;

อยากทราบเทคนิคว่ามันทำวิธีไหนได้บ้าง ในการ sort มัน

By: mr_tawan
ContributoriPhoneAndroidWindows
on 22 February 2014 - 23:38 #681699 Reply to:681247
mr_tawan's picture
  1. สร้าง list ใหม่
  2. หา node ที่มีค่าน้อยที่สุด
  3. detach node นั้นออกมาใส่ list ใหม่
  4. กลับไป ทำ 2. จนกว่า list เดิมจะไม่มี node เหลือ

  • 9tawan.net บล็อกส่วนตัวฮับ
By: hisoft
ContributorWindows PhoneWindows
on 23 February 2014 - 00:16 #681702 Reply to:681699
hisoft's picture

ไหนๆ ก็ต้องไล่ตลอดสายแล้ว ทำแบบนี้ได้มั้ยครับ?

  1. สร้าง list ใหม่ l1, l2
  2. หา node ที่มีค่าน้อยที่สุดกับมากที่สุด
  3. detach node ที่น้อยที่สุดใส่ l1 มากที่สุดใส่ l2
  4. กลับไปทำ 2. จนกว่า list เดิมจะไม่มี node เหลือ (ระวังจำนวน node เป็นเลขคี่ เหลือ node เดียวก็อย่าใส่ไปทั้ง l1, l2)
  5. detach l2 จากท้ายมาต่อ l1 จนกว่า l2 จะหมด

เผื่อจะได้ + คะแนน :p

By: mr_tawan
ContributoriPhoneAndroidWindows
on 23 February 2014 - 05:11 #681742 Reply to:681702
mr_tawan's picture

ทำเกินคำสั่งอาจจะถูกตัดคะแนนได้นะครับ ระวังด้วย


  • 9tawan.net บล็อกส่วนตัวฮับ
By: bow_der_kleine
WriterAndroidUbuntu
on 16 March 2014 - 19:19 #688051 Reply to:681247
bow_der_kleine's picture

link list ไม่เหมาะกับการ sort ครับ เพราะมัน random access ไม่ได้ (เช่น จะหยิบสมาชิกตัวที่ 5 ใน list ต้องไล่ไป 5 ครั้ง) เวลา sort เลยต้องใช้ linear sort เท่านั้น ซึ่งเป็นวิธีที่แย่ที่สุด หากจะ sort ควรใช้ binary tree ครับ