習題11-7 奇數值結點鏈表
本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中奇數值的結點重新組成一個新的鏈表。鏈表結點定義如下:
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
大佬的答案參考:
// Odd = getodd(&L); // 取 址 才能傳輸數據嗎?? 是因爲getodd 中無L的定義 必須用*L才能從外部數據傳輸?
// printlist(Odd); //prinlist 是爲了輸出鏈表數值重新 定義的函數
struct ListNode *readlist()
{
int data;
struct ListNode *head=NULL; //頭節點爲空
struct ListNode *p;
while(scanf("%d",&data)&&data!=-1)
{
struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1); //exit(1)是異常退出,比如你的代碼在出現不應該出現的分枝,要求終止程序的時候就用exit(1)
//即 q不應當爲空
if(head!=NULL)
{
p->next=q; //增加鏈表
}
else head=q; //第一次運行while 時 這一步都會做
p=q; //把q的值交給p 使得下一次p->next=q; 起到q1 ->q2->q3->q4 的作用 //這是爲什麼呢?????
}
return head; //返回頭節點 有了頭 就可以輸出下面所有的數據
}
struct ListNode *getodd( struct ListNode **L ) //二級指針?
{
struct ListNode *head0=NULL,*head1=NULL,*p0,*p1;
while((*L)!=NULL)
{
int data=(*L)->data;
struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(data%2)
{
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1);
if(head1!=NULL)
{
p1->next=q;
}
else head1=q;
p1=q; // p1存奇數 head1
} //p0存偶數 head 0
else
{
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1);
if(head0!=NULL)
{
p0->next=q;
}
else head0=q;
p0=q;
}
*L=(*L)->next;
}
*L=head0; //分離結束以後 L 儲存偶數的值
return head1; //返回奇數的值
}
做完一波筆記,待我看看怎麼才能更好理解~~~