题目要求编写split()函数,将一个链表的内容复制到另外两个链表中。该函数将具有偶数索引的节点(0,2等)复制到EvenList,并将具有奇数索引的节点复制到oddList。原来的链表不应该被修改。假设eventlist和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;
//在问题中,它要求我将两个空列表传递给函数'slip '
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");
}
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;
}
您总是过早地分配节点。注意,一开始总是为两个列表分配一个节点——但是如果列表中没有奇数怎么办?那么此时你的清单已经太长了。每次分配新节点时,都要这样做。
您需要做的是为每个列表保留指向指针指向节点的指针。这将是指向列表中最后一个节点的"下一个"指针,或者如果列表为空,则指向列表头部的指针。下一个指针和列表指针都应该以NULL开始。
当你分配一个新节点时,设置最后一个"next"指针指向你的新节点,使用你的指针对指针对节点。
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));
}
}
我认为这里的问题是根据索引将列表分成两半。但我可以看到values(item%2)
上的实现。
那么在列表中,第一个节点的索引应该是1,第二个节点的索引应该是2,以此类推
使用count变量,初始值设置为0。
int node_count = 0;
while(head != NULL)
{
node_count ++;
if(node_count%2)
{
//prepare odd_list;
}
else
{
//prepare even_list;
}
head = head->next;
}
void split(ListNode *head, ListNode **pOddList, ListNode **pEvenList)
{
int remainder;
ListNode *tmpO = NULL, *tmpE= NULL, *tmp;
if (head == NULL)
{
*pEvenList = NULL;
*pOddList = NULL;
}
else
{
tmp = head;
while (tmp != NULL)
{
remainder = tmp->item % 2;
if (remainder == 0)
{
if (tmpE == NULL)
{
tmpE = tmp;
tmp = tmp->next;
*pEvenList = tmpE;
tmpE->next = NULL;
}
else
{
tmpE->next = tmp;
tmp = tmp->next;
tmpE = tmpE->next;
tmpE->next = NULL;
}
}
else
{
if (tmpO == NULL)
{
tmpO = tmp;
tmp = tmp->next;
*pOddList = tmpO;
tmpO->next = NULL;
}
else
{
tmpO->next = tmp;
tmp = tmp->next;
tmpO = tmpO->next;
tmpO->next = NULL;
}
}
}
}
}