6-7 奇數值結點連結串列 (20 分)

matthew_leung發表於2018-11-08

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;//回撥新連結串列的頭結點地址
}

 

 
 
 

相關文章