2017-03-16 15 views
0

私は現在、かなり標準のマージソートファイルで作業していますが、いくつかの問題があります。私はデータ構造をかなり新しくしているので、何が起こっているのかを完全に理解していない。どんなヒントもいいだろう。ありがとう。標準のMergeSortアルゴリズム

typedef struct CELL *LIST; 
struct CELL { 
    int element; 
    LIST next; 
} 

代わりにこれを試してみてください:ここで

はコード

#include <stdio.h> 
#include <stdlib.h> 

typedef struct CELL *LIST; 
struct CELL { 
    int element; 
    LIST next; 
} 

LIST merge(LIST list1, LIST list2); 
LIST split(LIST list); 
LIST MergeSort(LIST list); 
LIST MakeList(); 
void PrintList(LIST list); 

int main() 
{ 
    LIST list; 

    list = MakeList(); 
    PrintList(MergeSort(list)); 
} 

LIST MakeList() 
{ 
    int x; 
    LIST pNewCell; 
    if(scanf("%d", &x) == EOF) return NULL; 
    else { 
     pNewCell = (LIST) malloc(sizeof(struct CELL)); 
     pNewCell->next = MakeList(); 
     pNewCell->element = x; 
     return pNewCell; 
    } 
} 

void PrintList(LIST list) 
{ 
    while(list != NULL) { 
     printf("%d\n", list->element); 
     list = list->next; 
    } 
} 

LIST MergeSort(LIST list) 
{ 
    LIST SecondList; 

    if (list == NULL) return NULL; 
    else if (list->next == NULL) return list; 
    else { 
     SecondList = split(list); 
     return merge(MergeSort(list), MergeSort(SecondList)); 
    } 
} 

LIST merge(LIST list1, LIST list2) 
{ 
    if (list1 == NULL) return list2; 
    else if(list2 == NULL) return list1; 
    else if(list1->element <= list2->element){ 
     list1->next = merge(list1->next, list2); 
     return list1; 
    } 
    else { 
     list2->next = merge(list1, list2->next); 
     return list2; 
    } 
} 

LIST split(LIST list) 
{ 
    LIST pSecondCell; 

    if (list == NULL) return NULL; 
    else if (list->next == NULL) return NULL; 
    else { 
     pSecondCell = list->next; 
     list->next = pSecondCell->next; 
     pSecondCell->next = split(pSecondCell->next); 
     return pSecondCell; 
    } 
} 

そして、私は(複数のプラットフォーム上)を取得

prog.c:10:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘merge’ 
LIST merge(LIST list1, LIST list2); 
     ^~~~~ 
prog.c: In function ‘MergeSort’: 
prog.c:53:16: warning: implicit declaration of function ‘merge’ [-Wimplicit-function-declaration] 
     return merge(MergeSort(list), MergeSort(SecondList)); 
       ^~~~~ 
prog.c:53:16: warning: return makes pointer from integer without a cast [-Wint-conversion] 
     return merge(MergeSort(list), MergeSort(SecondList)); 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
prog.c: At top level: 
prog.c:57:6: error: conflicting types for ‘merge’ 
LIST merge(LIST list1, LIST list2) 
     ^~~~~ 
prog.c:53:16: note: previous implicit declaration of ‘merge’ was here 
     return merge(MergeSort(list), MergeSort(SecondList)); 
       ^~~~~ 
+0

再帰的なマージは、学習上の問題ではなくO(n)のスタック領域を占有しますが、大きなリストでは問題になります。もし興味があれば、同じmerge()関数を使用しますが、リストを使用していますが、[リストのボトムアップマージソート - wikiの例](http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists)一時的なリストを分割する代わりに格納するノードへのポインタの配列。リストを分割するよりも高速ですが、リストを配列に移動し、配列をソートし、ソートされた配列から新しいリストを作成する方が速いです。 – rcgldr

答えて

0

これは間違っているがあるエラーです

typedef struct CELL { 
    int element; 
    struct CELL *next; 
} CELL, *LIST; 

nextはポインタでなければならず、別のCELL構造体ではないことに注意してください。

最初のエラーメッセージは、宣言の後にセミコロンを忘れたことを指摘しています。struct CELLmerge()の宣言が無視される理由もあります。

+0

ああ!私はセミコロンが欠けていた。右の音。助けてくれてありがとう! – Evan