2017-10-26 6 views
0

私はフロントやエンドに追加してフロントやエンドから削除するなどのことができるノードリストに取り組んでいますが、オーダーリストも作成できるようにしたいと考えています。だから、私はadd_inorder命名する方法/機能を.. 構造体の名前にstrcmpを使用してノードをリストに追加するにはどうすればよいですか?

はこれまでのところ、これは私が持っているものされてい

// the struct: 
typedef struct node 
{ 
    int id; 
    char* name; 
    struct node* next; 
} node; 

void add_inorder(node** head, node* new_node) { 
    node* previous = *head; 

    if (!*head) { 
    *head = new_node; 
    } 

    else if (strcmp((*head)->name, new_node->name) > 0) { 
    new_node->next = *head; 
    *head = new_node; 
    } 

    else { 
    node* it = (*head)->next; 
    while (it) { 
     if (strcmp(it->name, new_node->name) > 0) { 
     new_node->next = it; 
     previous->next = new_node; 
     break; 
     } 

     previous = it; 
     it = it->next; 
     if (previous->next == NULL) { 
     previous->next = new_node; 
     break; 
     } 
    } 
    } 
} 

スクリーンダンプ:

General stuff ... 
-------------------------------------------------- 
Memory used to date : 0 
node size : 24 
List length now is : 0 
Memory used to date : 0 
Print List : 

-------------------------------------------------- 

Add Inorder/Remove Inorder ... 
-------------------------------------------------- 
Adding node : {0, Jill} 
List length now is : 1 
Memory used to date : 29 
Print List : 
{0, Jill} 

Adding node : {1, Jane} 
List length now is : 2 
Memory used to date : 58 
Print List : 
{1, Jane} 
{0, Jill} 

Adding node : {2, Jeff} 
List length now is : 3 
Memory used to date : 87 
Print List : 
{1, Jane} 
{2, Jeff} 
{0, Jill} 

Adding node : {3, Jz} 
List length now is : 4 
Memory used to date : 114 
Print List : 
{1, Jane} 
{2, Jeff} 
{0, Jill} 
{3, Jz} 

編集:質問は今私が思う私コードは少し休憩を取ったときにうまく機能しませんでしたが、私はそれを修正することをどのように提案しますか?

+0

https://stackoverflow.com/help/mcveおよびhttps://stackoverflow.com/help/how-to-ask – jwdonahue

+0

を編集して元のコードブロックを編集するか、現在の状態を示すコードブロックを追加してください。 – jwdonahue

+0

ねえ、私はそれを修正したが、いくつかの休憩を入れなければならなかった。無限にループしていた前に、私はなぜそれがわからないのですか?しかし、私がした変更は非常に劇的です。 – jlyeffx

答えて

0

とブランチをリストの各ノードに再利用するように、add_inorder()を再帰的に呼び出すことを検討してください。次いで

これらのチェックが失敗した場合、次のノードで再試行:それはリストのサイズに応じてより多くのスタックメモリを使用しているマイナス面

else 
{ 
    add_inorder(&previous->next, new_node); 
} 

関連する問題