本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:
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()
//创建链表读到-1,结束创建;
{
int i = 0, j = 0, num = 0;
struct ListNode* p1, * p2, * head = NULL;
scanf("%d", &num); if (num == -1) return NULL;
p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
p1->data = num;
p1->next = NULL;
p2 = p1;
head = p1;
while (1)
{
scanf("%d", &num); if (num == -1)break;
p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
p1->data = num;
p1->next = NULL;
p2->next = p1;
p2 = p1;
}
return head;
}
struct ListNode* getodd(struct ListNode** L)
//函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表
{
struct ListNode* p1, * p2, * head1 = NULL,*L2=*L;
struct ListNode* head2 = NULL, * p1x, * p2x;
int a[1000] = { 0 }, i = 0, j = 0, count1 = 0;
int b[1000] = { 0 }, count2 = 0;
while (L2)
{
if (L2->data % 2 == 0)//偶数
{
a[i] = L2->data;
i++, count1++;
}
if (L2->data % 2 != 0)//奇数
{
b[j] = L2->data;
j++, count2++;
}
L2 = L2->next;
}
for (i = 0; i<count1; i++)//偶数链表
{
p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
p1->data = a[i];
p1->next = NULL;
if (head1 == NULL)
{
head1 = p1;
p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
}
*L = head1;
for (i = 0; i < count2; i++)
{
p1x = (struct ListNode*)malloc(sizeof(struct ListNode));
p1x->data = b[i];
p1x->next = NULL;
if (head2 == NULL)
{
head2 = p1x;
p2x = p1x;
}
else
{
p2x->next = p1x;
p2x = p1x;
}
}
return head2;
}