该问题要求编写一个函数 split() 将链表的内容复制到另外两个链表中。该函数将具有偶数索引(0,2 等)的节点复制到 EvenList,将具有奇数索引的节点复制到oddList。不应修改原始链表。假设 evenlist 和oddlist 将作为空列表传递给函数(*ptrEvenList = *ptrOddList = NULL)。
在我的程序中,它可以显示初始列表。虽然其他两个列表有问题。它会导致程序终止。
#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'
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
如果我像上面那样修改它,程序可以运行,但是显示的最后两个数字将是两个随机数。
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");
}