0

この質問は、連結リストの内容を他の 2 つの連結リストにコピーする関数 split() を作成するように求めました。この関数は、偶数インデックス (0、2 など) を持つノードを EvenList にコピーし、奇数インデックスを持つノードをoddList にコピーします。元のリンク リストは変更しないでください。偶数リストと奇数リストが空のリスト (*ptrEvenList = *ptrOddList = NULL) として関数に渡されると仮定します。

私のプログラムでは、初期リストを表示できます。他の2つのリストには何か問題がありますが。そして、それはプログラムの終了を引き起こします。

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

#define SIZE 9

// ノードのリストの構造を定義する

typedef struct node{
    int item;
    struct node *next;
}ListNode;

// 関数を呼び出す

int search(ListNode *head,int value);
void printNode(ListNode *head);
void split(ListNode *head,ListNode **OddList,ListNode **EvenList);

//主な機能

int main(){
    ListNode *head=NULL;
    ListNode *temp;
    ListNode *OddList=NULL;
    ListNode *EvenList=NULL;

//質問では、関数「slipt」に2つの空のリストを渡すように求められました

    int ar[SIZE]={1,3,5,2,4,6,19,16,7};
    int value=0;
    int i;

    head=(struct node*)malloc(sizeof(ListNode));
    temp=head;
    for(i=0;i<SIZE;i++){
        temp->item=ar[i];
        if(i==(SIZE-1))  //last item
            break;
        temp->next=(struct node*)malloc(sizeof(ListNode));
        temp=temp->next;
    }
    temp->next=NULL;
    printf("Current list:");
    printNode(head);

    split(head,&OddList,&EvenList);


return 0;
}

**** !!!!!!!!! 問題はこの部分にあると思います。

void split(ListNode *head,ListNode **ptrOddList,ListNode **ptrEvenList){
    int remainder;
    ListNode *tempO,*tempE,*temp;



    if (head==NULL)
        return;
    else{
        temp=head;

        *ptrOddList=(struct node*)malloc(sizeof(ListNode));
        *ptrEvenList=(struct node*)malloc(sizeof(ListNode));

        tempO=*ptrOddList;
        tempE=*ptrEvenList;

        while(temp!=NULL){
            remainder=temp->item%2;

            if(remainder==0){
                tempE->next=(struct node*)malloc(sizeof(ListNode));
                tempE->item=temp->item;
                tempE=tempE->next;
            }
            else{
                tempO->next=(struct node*)malloc(sizeof(ListNode));
                tempO->item=temp->item;
                tempO=tempO->next;
            }
            temp=temp->next;
        }
        tempE=NULL;
        tempO=NULL;

// 私も試しtempE->next=NULL;てみましたが、tempO->next=NULL //上記のように変更すればプログラムは実行できますが、表示される最後の 2 つの数字は 2 つの乱数になります。

        printf("Even List:");
        printNode((*ptrEvenList));
        printf("Odd List:");
        printNode((*ptrOddList));
    }
}

// 結果を出力する関数

void printNode(ListNode *head){
    if (head==NULL)
        return;
    while(head!=NULL){
        printf("%d ",head->item);
        head=head->next;
    }
    printf("\n");
}
4

5 に答える 5

1
void split(ListNode *head, ListNode **ptrOddList, ListNode **ptrEvenList){

    for( ; head ;  head= head->next) {
        ListNode *temp;

        temp = malloc(sizeof *temp );
        memcpy (temp, head, sizeof *temp);

        if (temp->item %2) { *ptrOddList = temp; ptrOddList = &temp->next;}
        else  { *ptrEvenList = temp; ptrEvenList = &temp->next;}
        }

    *ptrOddList = NULL;
    *ptrEvenList = NULL;
}
于 2013-03-24T18:35:18.323 に答える
0

ノードの割り当てが常に 1 段階早すぎます。最初は常に両方のリストに 1 つのノードを割り当てていることに注意してください。しかし、リストに奇数がない場合はどうでしょうか? この時点でリストが長すぎます。新しいノードを割り当てるたびに、これを続けます。

あなたがする必要があるのは、各リストのノードへのポインターへのポインターを保持することです。これは、リストの最後のノードの「次の」ポインタへのポインタ、またはリストが空の場合はリストの先頭へのポインタになります。次のポインターとリスト ポインターは、すべて NULL として開始する必要があります。

新しいノードを割り当てるときは、pointer-to-pointer-to-node を使用して、最後の「次の」ポインタを新しいノードを指すように設定します。

于 2013-03-24T13:49:33.607 に答える
0
void split(ListNode *head,ListNode **ptrOddList,ListNode **ptrEvenList){
int remainder;
int countO=0;
int countE=0;
ListNode *tempO,*tempE;

if (head==NULL)
    return;
else{
    (*ptrOddList)=(struct node*)malloc(sizeof(ListNode));
    (*ptrEvenList)=(struct node*)malloc(sizeof(ListNode));

    while(head!=NULL){
        remainder=head->item%2;

        if(remainder==0){
            if(countE>0){
                tempE->next=head;
                tempE=tempE->next;
            }
                            else
                                tempE=*ptrOddList;
            tempE->item=head->item;
            countE++;

        }
        else{
            if(countO>0){
                tempO->next=head;
                tempO=tempO->next;
            }
                            else
                                tempO=*ptrOddList;
            tempO->item=head->item;
            countO++;

        }
        head=head->next;
    }
    tempE->next=NULL;
    tempO->next=NULL;
    printf("Even List:");
    printNode((*ptrEvenList));
    printf("Odd List:");
    printNode((*ptrOddList));
}
}
于 2013-03-25T02:20:40.303 に答える
0

ここでの問題は、インデックスに基づいてリストを半分に分割することだと思います。しかし、私は実装を見ることができますvalues(item%2).

したがって、リストでは、最初のノードのインデックスは 1 で、2 番目のノードのインデックスは 2 である必要があります。

最初に 0 に設定されるカウント変数を使用します。

int node_count = 0;
while(head != NULL)
{
  node_count ++;

  if(node_count%2)
  {
       //prepare odd_list;
  }
  else
  {
       //prepare even_list;
  }
  head = head->next;
}
于 2015-02-22T17:47:59.870 に答える