この質問は、連結リストの内容を他の 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");
}