2012-09-12 258 views
0

我一直忙於從C書中提出一個問題。問題很簡單,但它有一些特定的部分。創建數組結構

我想問一個關於數組的問題。 我的問題是關於創建一個結構數組的最佳方法。這個問題想要這些; 首先創建一個結構數組。其次,創建一個鏈接列表,將這些數組與一個restp指針連接起來。 我想將我的問題分成子部分。第一部分是結構數組... 如何創建結構數組。我對此進行了研究。這裏是我的方式: 我創造了我的陣列結構的結構:

struct student{ 
    int id; 
    struct courseList_node_s *restp; 
}; 

和我聯繫完成問題清單休息:

typedef struct courseList_node_s{ 
    char course[6]; 
    int credit, 
     section; 
    struct courseList_node_s *restp; 
}courseList_node_t; 

我已經實現了一些函數來處理這個學生時間表。 在我的get_studentList函數中; 我宣佈我的陣列是這樣的;

struct student *ansp[size]; 

並作內存分配;

ansp[i] = malloc(sizeof(struct student)); 

最後分配一個值;

ansp[i]->id =id; 

現在,我的問題是,當創建一個數組,我不能使它作爲一個有序數組。例如,用戶可以輸入1111,1222,1232,然後輸入1011.所以,我的第一個數組元素是ansp [0] = 1011和ansp [1] = 1111.

我無法確定數字出。

你可以給我一個包含這些的算法(創建一個有序的結構數組)。

最後,對不起,我的英語不好,我可能會做一些語法錯誤...

在此先感謝。

+0

'malloc(sizeof(struct student));'應該是'sizeof coursList_node_t'。 'student'是一個指向'courseList_node_t'的指針數組,不是'courseList_node_t'。 –

+0

我想,應該在用戶操作後創建一個有序的數組,然後找到最小的 - >放入數組[0],找到最小的剩餘 - >放入數組[1],....所以你可能需要學生結構中的另一個參數(例如,bool歸檔)來表示它是否已經在數組中。 – benbai123

回答

0

我已經解決了這個問題,幫助@Keith Randall和 lserni 我已經實現了二叉搜索樹和結構數組。

第一種方式,與快速排序排序數組:

我不得不創建一個比較功能:

int compare(const void *p1, const void *p2){ 
    return (* (struct student **) p1)->id - (* (struct student **) p2)->id; 
} 

而我的其他輔助功能;

void get_studentList(struct student **listp,int size){ 
    int id,i; 
    struct student *ansp[size]; 
    for(i=0;i<size;i++){ 
     printf("Enter student's id to exit enter -1> "); 
     scanf("%d", &id); 
     ansp[i] = malloc(sizeof(courseList_node_t)); 
     ansp[i]->id = id; 
     ansp[i]->restp = NULL; 
    } 
    qsort (ansp, size, sizeof(struct student *), compare); 
    for(i=0;i<size;i++){ 
     listp[i] = ansp[i]; 
    } 
} 


courseList_node_t * insert_studentSchedule(courseList_node_t *headp, int size){ 
    courseList_node_t *cur_nodep; 
    if(headp == NULL){ 
     cur_nodep = scan_course(); 
     headp = cur_nodep; 
    } else { 
     headp->restp = insert_studentSchedule(headp->restp,size); 
    } 
    return (headp); 
} 

而我的顯示功能;

void display_schedule(struct student **headp, int size){ 
    courseList_node_t *cur_nodep; 
    int i = 0; 
    while(i< size){ 
     cur_nodep = headp[i]->restp; 
     printf("Student id > %d\n", headp[i]->id); 
     while(cur_nodep != NULL){ 
      printf("Course name> %s\t", cur_nodep->course); 
      printf("Course credit> %d\t", cur_nodep->credit); 
      printf("Course section> %d\n", cur_nodep->section); 
      cur_nodep = cur_nodep->restp; 
     } 
     i++; 
    } 
} 

方式二,二叉搜索樹:

我改變了我的頭文件中的typedef的部分,因爲這:

typedef struct tree_node_s{ 
    int id; 
    struct courseList_node_s *restp; 
    struct tree_node_s *leftp, *rightp; 
}tree_node_t; 

而我的宏正式在動態分配的非標準模式節點:

#define TYPED_ALLOC(type) (type *)malloc(sizeof(type)) 

和m y執行創建二叉搜索樹:

/* 
* Insert a new id in a binary search tree. 
* Pre: rootp points to the root node of a binary search tree 
*/ 
tree_node_t * get_studentTree(tree_node_t *rootp, int newId) 
{ 
    if (rootp == NULL){ 
     rootp = TYPED_ALLOC(tree_node_t); 
     rootp->id = newId; 
     rootp->restp = NULL; 
     rootp->leftp = NULL; 
     rootp->rightp = NULL; 
    } else if (newId == rootp->id){ 
     /* */ 
    } else if (newId < rootp->id){ 
     rootp->leftp = get_studentTree(rootp->leftp, newId); 
    } else { 
     rootp->rightp = get_studentTree(rootp->rightp, newId); 
    } 
    return (rootp); 
} 

這部分內容與此問題無關。我給了他們,因爲我想分享真正問題的部分解決方案。

/* 
* Its aim to add courses to restp component of subtree 
* It may have some problems. And you can omit it. Because it not related with this question 
* Pre: elementp not empty 
*/ 
courseList_node_t * add_course(courseList_node_t *nextp, courseList_node_t *elementp){ 
     if(nextp->restp == NULL){ 
      nextp->restp = elementp; 
     } else { 
      nextp->restp = add_course(nextp->restp,elementp); 
     } 
     return (nextp); 
} 

/* 
* It is not neccessary to first call get_studentTree function. It simply creates a linked list which consist of student class/lecture schedule. 
* Pre: ele and id not empty 
* Post: Tree returned includes all schedule and retains binary search tree properties. 
*/ 
tree_node_t * insert_studentSchedule(tree_node_t *rootp,courseList_node_t *ele, int id){ 
    if (rootp == NULL){ 
     rootp = get_studentTree(rootp, id); 
     rootp->restp = TYPED_ALLOC(courseList_node_t); 
     strcpy(rootp->restp->course, ele->course); 
     rootp->restp->credit = ele->credit; 
     rootp->restp->section = ele->section; 
    } 
    else if(rootp->id == id){ 
     if (rootp->restp == NULL){ 
      rootp->restp = TYPED_ALLOC(courseList_node_t); 
      strcpy(rootp->restp->course, ele->course); 
      rootp->restp->credit = ele->credit; 
      rootp->restp->section = ele->section; 
     } else { 
      rootp->restp = add_course(rootp->restp, ele); 
     } 

    } else if (id < rootp->id){ 
     if (rootp->leftp != NULL) 
      rootp->leftp = insert_studentSchedule(rootp->leftp, ele, id); 
    } else if (id > rootp->id) { 
     if (rootp->rightp != NULL) 
      rootp->rightp = insert_studentSchedule(rootp->rightp, ele, id); 
    } 
    return (rootp); 
} 

/* 
* Course scanning function 
*/ 
courseList_node_t * scan_course(void){ 
    courseList_node_t *cur_coursep; 
    char courseName[6]; 
    cur_coursep = (courseList_node_t *)malloc(sizeof(courseList_node_t)); 

    printf("Welcome to course scanning part>\n"); 
    printf("Enter the name of course> "); 
    scanf("%s", courseName); 
    strcpy(cur_coursep->course, courseName); 
    printf("Enter the credit of course> "); 
    scanf("%d", &cur_coursep->credit); 
    printf("Enter the section of course> "); 
    scanf("%d", &cur_coursep->section); 
    cur_coursep->restp = NULL; 

    return (cur_coursep); 
} 

/* 
* My way to print binary search tree with all elements 
*/ 
void display_schedule(tree_node_t *rootp){ 
    courseList_node_t *cur_course; 
    if(rootp == NULL) 
     return; 
    display_schedule(rootp->leftp); 
    if (rootp->restp == NULL) 
     printf("Tree with id: %d element has no member!", rootp->id); 
    else { 
     cur_course = rootp->restp; 
     while (cur_course != NULL){ 
      printf("Student Id> %d\n", rootp->id); 
      printf("Course name> %s\t", rootp->restp->course); 
      printf("Course credit> %d\t", rootp->restp->credit); 
      printf("Course section> %d\n", rootp->restp->section); 
      cur_course = cur_course->restp; 
     } 
    } 
    display_schedule(rootp->rightp); 
} 

它可能並不完全解決書本問題,但與你的幫助,它是必不可少的部分的解決方案。如果你發現了一個錯誤。隨意添加評論。

1

要排列元素,您需要對它們進行排序。在C中,您可能想要使用qsort(在C++中有更簡單的方法)。您需要在struct student *上定義比較功能,並在您的陣列上使用它調用qsort

請參閱this example以獲取靈感。請注意,您的數組是一個結構數組,指針,該示例是一個直接結構數組(可能是您想要的呢?)。

+0

感謝您的建議。它幫助我解決了我的問題。我也實現了二叉搜索樹。但你的方式是我的問題的真正解決方案...謝謝, 我會盡快分享我的解決方案。 – mustafaSarialp

0

你能給我一個包含這些的算法(創建一個有序的結構數組)。

如果你想創建結構的orderd數組,你可能想建立一個

有這樣的庫,但要學習和理解,你可以谷歌的'二進制樹在C'或類似的東西,例如:

http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/tree.html

樹木將允許用戶插入非排序值並按照順序檢索它們(也更快速搜尋)。