1. 程式人生 > >4-1單鏈表逆轉

4-1單鏈表逆轉

學習完連結串列以後,在刷PTA的時候,遇見第一題就卡殼了,真是悲哀,是一道關於單鏈表逆轉的,其實還是很簡單的,不過因為搞錯了位置,再加上其他函式也是第一次用C寫,輸出的一直是NULL,就把這段程式碼敲出來方便大家以後看。

4-1 單鏈表逆轉   (20分)

本題要求實現一個函式,將給定的單鏈表逆轉。

函式介面定義:

List Reverse( List L );

其中List結構定義如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 儲存結點資料 */
    PtrToNode   Next; /* 指向下一個結點的指標 */
};
typedef PtrToNode List; /* 定義單鏈表型別 */

L是給定單鏈表,函式Reverse要返回被逆轉後的連結串列。

裁判測試程式樣例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的程式碼將被嵌在這裡 */

輸入樣例:

5
1 3 4 5 2

輸出樣例:

1
2 5 4 3 1

千萬記住這個只能提交reverse函式,不過為了方便,我還是把整段程式碼都寫了出來。

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}
List Read()
{
	PtrToNode head=NULL;
	PtrToNode list=NULL;
	int len;
	scanf("%d",&len);
	if(len==0)
	return NULL;
	int num;
	scanf("%d",&num);
	head=(PtrToNode)malloc(sizeof(struct Node));
	head->Data=num;
	head->Next=NULL;
	list=head;
	len--;
	while(len)
	{
     PtrToNode node=(PtrToNode)malloc(sizeof(struct Node));
		scanf("%d",&num);
	node->Data=num;
	node->Next=NULL;
	list->Next=node;
	list=node;
		len--;
	}
	return head;	
}
void Print( List L )
{
	if(L==NULL)
	return ;
	while(L!=NULL)
	{
		printf("%d ",L->Data);
	    L=L->Next;
	}
	putchar('\n');
}
List Reverse( List L )
{
	if(L==NULL)
	return NULL;
	PtrToNode l1=NULL;
//	PtrToNode l3=L;
	PtrToNode l2=NULL;
	while(L!=NULL)
	{
		l1=L->Next;
		L->Next=l2;
		l2=L;
		L=l1;
	}
	return l2;
}