69,336
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printf("Odd list: ");
printlist(Odd);
printf("Even list: ");
printlist(L);
return 0;
}
/* 你的代码将被嵌在这里 */
struct ListNode *readlist()
{
struct ListNode *head,*tail;
struct ListNode *p;
int size = sizeof(struct ListNode);
head = (struct ListNode*)malloc(size);
head->next = NULL;
p = head;
while(1) {
tail = (struct ListNode*)malloc(size);
scanf("%d", &tail->data);
if (tail->data==-1) {
p->next = NULL;
break;
}
p->next=tail;
p = tail;
}
free(tail); /* 最后一个节点申请了,但是没有用要释放掉 */
return head; /*返回一个带哨兵的链表*/
}
struct ListNode *getodd( struct ListNode **L ) //将单链表L中奇数值的结点分离出来,重新组成一个新的链表
{
struct ListNode *odd_head, *prev, *pcur, *pnew;
int size = sizeof(struct ListNode);
odd_head = (struct ListNode *)malloc(size);
if (!odd_head)
exit(1);
prev = *L;
pcur = (*L)->next;
pnew = odd_head;
while (pcur) {
if (pcur->data % 2) {
pnew->next = pcur;
pnew = pcur;
prev->next = pcur->next;
pcur = pcur->next;
} else {
prev = prev->next;
pcur = pcur->next;
}
}
pnew->next = NULL;
return odd_head;
/*
struct ListNode *head,*oddhead,*evenhead,*oddtail,*eventail,*odd,*even,*first,*temp;
head = (struct ListNode*)malloc(size);
oddhead = (struct ListNode*)malloc(size); odd=oddhead;
evenhead = (struct ListNode*)malloc(size); even=evenhead;
oddhead->next=NULL;
evenhead->next=NULL;
head=*L;
first=*L;temp=first; //代表传入的指针的首地址
if(head!=NULL){
if(head->data%2!=0){oddhead=*L;odd=oddhead;}
if(head->data%2==0){evenhead=*L;even=evenhead;}
}
while(head->next!=NULL){
if(head->next->data%2!=0){ //从第二个节点开始判断 (奇数)
head=head->next;
oddtail=head;
oddhead->next=oddtail;
oddhead=oddtail;
}
else if(head->next->data%2==0){ //从第二个节点开始判断 (偶数)
head=head->next;
eventail=head;
evenhead->next=eventail;
evenhead=eventail;
}
}
if(first->data%2==0) //第一个为偶数
{
*L=first;
return odd->next;
}
else //第一个为奇数
{
*L=even->next;
return first;
}
*/
}
参考一下吧,对于要求,若定义一个带哨兵的单链表会比较容易解决。详见上面的代码;
分离函数可以简单一些,没必要定义那么多指针变量,因为变量多了会让程序看着不容易理解。