0

二重リンクリストの選択ソートの実装で問題に直面しています。

cで二重リンクリストの選択ソートを行うのを手伝ってください。

ノード構造は次のとおりです。

struct node {
         char name [15];
         node * nextnode;
         node * prevnode;
}node;

名前順に並べてます

コードは次のようになります。

の昇順でリストをソートする必要がありnamesます。

char names[5][15] = {"tom","jack","mike","bernard","leo"};

上記のノード構造と以下の機能を持つ二重リンクリストを作成しました。

int list_add(char *lname)
{
    int i, length;
    struct node *current = NULL;
    struct node *temp = NULL;
    current = head;
    while (current->nextnode != NULL)
    {
        current = current->nextnode;
    }
    temp = malloc(sizeof(struct node));
    current->nextnode = temp;
    strcpy(temp->name,lname);
    temp->prevnode = current;
    temp->nextnode = NULL;

    return 0;
}

int init_list(char names[][15])
{
    int length;
    struct node * current = NULL;
    head = malloc(sizeof(struct node));
    strcpy(head->name,"Head");
    head->nextnode = head->prevnode = NULL;
    for(length = 0; length < 5; length++)
    {
        //printf("names are %s \n", (char *)names[length]);
        list_add(names[length]);
    }

    return length;
}

上記のものは単純な二重連結リストの追加ロジックです。

選択ソート コード フローは次のとおりです。

start node= 最短ノードを検索する必要がある要素ノードを追跡します。

temp1開始ノードが割り当てられている - 開始ノードのトラバーサルがスワップによって妨げられないようにするための理由

tempnode は、そのトラバーサルの最短ノードを保持します。

prev and next node'sスワップロジックに使用されます。

以下のコードでは、ソートされたリストを取得できません。

int selsort(int length)
{
    int i = 0,j = 0;
    struct node *start = NULL;
    struct node *prev, *next, *temp, *temp1;
    struct node *current = NULL;
    struct node *traversal = NULL;
    prev = next = NULL;
    if (head == NULL)
        return 0;
    start = head;
    printf("selsort called \n");
    for(/*start = head->nextnode*/; start != NULL && i < 6; /*start = start->nextnode*/)
    {
        printf("Iteration number %d \n",i);
        start = head->nextnode;
        j = i;
        while(j)
        {
            start = start->nextnode;
            j--;
        }
        printf("start node %s \n",start->name);
        temp1 = start;
        current = start;
        temp = start;
        while(current != NULL)
        {
            if(strcmp(temp->name, current->name) > 0)
            {
                //ascending logic
                temp = current;
                current = current->nextnode;
            } 
            else 
                current = current->nextnode;
        }
        //printf("Before swap logic \n");
        //swap logic
        if(temp1->prevnode == NULL)
        {
            //swap current with temp
            next = temp1->nextnode;
            temp1->nextnode = temp->nextnode;
            temp1->prevnode = temp->prevnode;
            temp->nextnode->prevnode = temp1;
            temp->prevnode->nextnode = temp1;
            temp->nextnode = next;
            temp->prevnode = NULL;
            next->prevnode = temp;

        }else
        {
            //printf("second swap : %d \n",i);
            if(temp1->nextnode == NULL)
                continue;
            else 
            {
                next = temp1->nextnode;
                prev = temp1->prevnode;
                if (temp->nextnode == NULL)
                {
                    temp1->nextnode = NULL;
                    temp1->prevnode = temp->prevnode;
                    temp->prevnode->nextnode = temp1;
                }else{
                    temp1->nextnode = temp->nextnode;
                    temp1->prevnode = temp->prevnode;
                    temp->nextnode->prevnode = temp1;
                    temp->prevnode->nextnode = temp1;
                }
                temp->prevnode = prev;
                temp->nextnode = next;
                next->prevnode = temp;
                prev->nextnode = temp;
            }
        }
        i++;

        traversal = head;
        while(traversal != NULL)
        {
            printf("after iter %d Names are %s \n",i, traversal->name);
            traversal = traversal->nextnode;
        }
    }
}

上記の実装では、双方向リンク リストを並べ替えることができませんでした。

私は無限ループを出力しています:

iter 4 の後 名前はマイク

iter 4 の後 名前はマイク

iter 4 の後 名前はマイク

iter 4 の後 名前はマイク

誰かが私の実装の修正または新しい実装のアドバイスをしてください(参照リンク)。前もって感謝します。

4

0 に答える 0