本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:
struct ListNode {
int data;
ListNode *next;
};
函数接口定义:
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
函数readlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数getodd
将单链表L
中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L
中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L
的指针)。
裁判测试程序样例:
#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;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
2 2 4 6
补充代码:
//不带头结点的单链表的创建
struct ListNode *readlist() {
struct ListNode *head = NULL, *p = NULL;
int i;
do {
scanf("%d", &i);
if (i != -1) {
struct ListNode *temp = ( struct ListNode *)malloc(sizeof( struct ListNode));
temp->data = i;
temp->next = NULL;
if (p == NULL)//创建首元结点
head = temp;
else
p->next = temp;//连接各个申请的结点空间
p = temp;
}
if (i == -1)
break;
} while (i != -1);
return head;
}
struct ListNode *getodd( struct ListNode **L ) {
struct ListNode *begin, *Next, *p, *result = NULL; //起始指针,后继指针,遍历指针
begin = *L;
Next = begin->next;
int flag1, flag2 = 0, flag3 = 0;
*L = NULL;
//采用遍历算法,从首元节点至倒数第二个结点,根据结点数据的奇偶分别进行连接
while (Next) {
flag1 = 0;
p = Next;
while (p) {
if ((begin->data) % 2 != 0) {
if (flag3 == 0) {
result = begin;//存储首个奇数结点的地址
flag3 = 1;
}
if ((p->data) % 2 != 0) {
begin->next = p;
flag1 = 1;
break;
}
} else if ((begin->data) % 2 == 0) {
if (flag2 == 0) {
*L = begin;//存储首个偶数结点的地址
flag2 = 1;
}
if ((p->data) % 2 == 0) {
begin->next = p;
flag1 = 1;
break;
}
}
p = p->next;
}
if (flag1 == 0)
begin->next = NULL;
begin = Next;
Next = Next->next;
}
//末尾结点单独成链(即只有末尾结点为奇\偶结点的特殊情况),返回末尾结点地址
if (flag2 == 0&&(begin->data )% 2 == 0 )
*L = begin;
else if(flag3 == 0&&(begin->data )% 2 != 0)
result = begin;
return result;
}