c -将链表拆分为另外两个链表,一个是奇数索引,另一个是偶数索引



题目要求编写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;
                }
            }   
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新