6-7 奇數值結點連結串列 (20 分)
6-7 奇數值結點連結串列 (20 分)
本題要求實現兩個函式,分別將讀入的資料儲存為單連結串列、將連結串列中奇數值的結點重新組成一個新的連結串列。連結串列結點定義如下:
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/* 頭結點 */, *p/* 指標 */, *q /* 臨時結點 */;
head = (struct ListNode*)malloc(sizeof(struct ListNode)); // 頭結點
head->next = NULL;//頭結點的指標初始化為NULL
head->data = 0; // 置空下一結點
q = head; // 賦值給臨時結點
while (1)
{
p = (struct ListNode*)malloc(sizeof(struct ListNode)); // 分配空間
scanf("%d", &p->data); // 賦值
if (p->data == -1) // 退出迴圈
break;
q->next = p; // Q的下一個結點指向P
q = p;
}
q->next = NULL;
return head;
}
struct ListNode *getodd(struct ListNode **L) // 頭結點地址的地址
{
struct ListNode *head = *L, *p; //與.原連結串列相關的指標
struct ListNode *oddh, *oddp, *oddq; //構建新連結串列的指標 頭結點 指標 臨時節點
p = (*L)->next; //指標指向頭結點的next
oddh = (struct ListNode*)malloc(sizeof(struct ListNode)); //頭結點分配單元
oddh->next = NULL; //頭結點的next指標初始化
oddq = oddh;//指標指向頭結點
for(;p!=NULL;p=p->next)//遍歷原連結串列
{
if ((p->data) % 2 != 0) //判斷是否為奇數
{
oddp = (struct ListNode*)malloc(sizeof(struct ListNode));//臨時結點分配單元
oddp->data = p->data;//賦值
head->next = p->next;//放棄值為奇數的點
free(p);//釋放結點,避免記憶體洩漏
p = head;//指標指向頭結點
oddq->next = oddp;//結點連線
oddq = oddp;//指標指向最後節點
continue;
}
head = head->next;//結點讀取
}
oddq->next = NULL;//末結點為空,結束連結串列
head->next = NULL;//末結點為空,結束連結串列
*L = (*L)->next;
oddh = oddh->next;
return oddh;//回撥新連結串列的頭結點地址
}
相關文章
- 6-8 單連結串列結點刪除 (20 分)
- 連結串列倒數第k個結點
- 單連結串列倒數第k結點輸出
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列 - 單向連結串列
- 結點插入到單連結串列中
- 連結串列中環的入口結點
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 劍指offer——連結串列中倒數第k個結點
- HBU DS 1-3 遞增的整數序列連結串列的插入 (20分)
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 連結串列-雙向通用連結串列
- 環形連結串列_相交連結串列_多數元素(java語言)Java
- 特定深度節點連結串列
- 2024/11/27 【連結串列】LeetCode 24 兩兩交換連結串列中的節點 & LeetCode 19 刪除連結串列的倒數第N個節點LeetCode
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 【連結串列問題】刪除單連結串列的中間節點
- 876. 連結串列的中間結點
- 尋找連結串列相交結點問題
- 55-將單連結串列原地逆置(有頭結點的單連結串列)
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 資料結構-單連結串列、雙連結串列資料結構
- 19. 刪除連結串列的倒數第 N 個結點
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- 7-2 兩個有序連結串列序列的合併 (20分)
- 7-24 兩個有序連結串列序列的合併 (20 分)
- 166. 連結串列倒數第n個節點
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 連結串列
- LeetCode-Python-86. 分隔連結串列(連結串列)LeetCodePython