本題要求實現兩個函數,分別將讀入的數據儲存爲單鏈表、將鏈表中奇數值的結點重新組成一個新的鏈表。鏈表結點定義如下:
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 *prev,*current;
struct ListNode *head;
head=NULL;
int num;
do {
scanf("%d",&num);
if(num!=-1) {
current=(struct ListNode*)malloc(sizeof(struct ListNode));
if(head==NULL) {
head=current;
} else {
prev->next=current;
}
current->next=NULL;
current->data=num;
prev=current;
}
} while(num!=-1);
return head;
}
struct ListNode *getodd( struct ListNode **L ) {
struct ListNode*p=*L;
struct ListNode*q=p;
struct ListNode *getodd=NULL;
struct ListNode *prev,*current;
while(p) {
if(p->data%2!=0) {
current=(struct ListNode*)malloc(sizeof(struct ListNode));
if(getodd==NULL) getodd=current;
else prev->next=current;
current->next=NULL;
current->data=p->data;
prev=current;
if(p==*L) {
*L=p->next;
} else {
q->next=p->next;
}
}else{
q=p;
}
p=p->next;
}
return getodd;
}