1. 程式人生 > 其它 >(題解)習題11-7 奇數值結點連結串列

(題解)習題11-7 奇數值結點連結串列

技術標籤:PTA易錯題連結串列c語言指標

原題描述:

本題要求實現兩個函式,分別將讀入的資料儲存為單鏈表、將連結串列中奇數值的結點重新組成一個新的連結串列。連結串列結點定義如下:

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

注:題目描述如上,版權歸屬:

作者:C課程組

單位:浙江大學

我的函式實現:

struct ListNode *readlist()
{
	int num;
	struct ListNode *p,*head,*tail;
	head=tail=NULL;
	for(p=head;;)
	{
		p=(struct ListNode*)malloc(sizeof(struct ListNode));  //必須在break前面,否則無限迴圈 
		scanf("%d",&num);
		if(num==-1)
		{
			break;
		}
		p->data=num;
		(head==NULL)?(head=p):(tail->next=p);
		tail=p;
	}
	if(head!=NULL) //頭指標非空時,將尾結點的下一結點置空
	{
		tail->next=NULL;
	}
	free(p);
	p=NULL;
	return head;
}

struct ListNode *getodd( struct ListNode **L )
{
    //定義奇數結點連結串列相關的指標和數
	struct ListNode *oddp,*head,*tail;
	head=tail=NULL;
	int flag=0;
	//定義偶數結點連結串列相關的指標
	struct ListNode *p,*temp;
	p=*L;
	while(p!=NULL)
	{
		if((p->data)%2==1)
		{
		    //給奇數結點連結串列賦值
			oddp=(struct ListNode*)malloc(sizeof(struct ListNode));
			oddp->data=p->data;
			flag++;
			(flag==1)?(head=oddp):(tail->next=oddp);
			tail=oddp;
			//刪除原連結串列中的奇數結點,使其成為偶數結點連結串列
			if(p==*L)
			{
				*L=p->next;
				p=*L;
			}
			else
			{
				temp->next=p->next;
				p=p->next;
			}
		}
		else
		{
			temp=p;
			p=p->next;
		}
	}
	
	oddp=(struct ListNode*)malloc(sizeof(struct ListNode)); //必須申請最後的記憶體以釋放 
	if(head!=NULL) //頭指標非空時,將尾結點的下一結點置空
	{
		tail->next=NULL;
	}
	free(oddp);
	oddp=NULL;
	return head;
}