C語言單鏈表的逆轉

       單鏈表的逆轉是一個基礎的數據結構題,做起來不難。和解決這個問題一起寫的還有做題的規矩,不能因一個問題簡單就直接開始寫代碼,對於初學者來說,寫代碼前先寫一個程序的大致框架是很有用的。

解題思路:
       創建一個單鏈表,遍歷這個鏈表並且以頭插法將這個鏈表賦值給另一個鏈表。
       另外,我也得寫下我這個菜鳥遇到的問題和解決辦法,不管遇到的問題有多基礎,有問題就得解決並且記錄,這是一個菜鳥的尊嚴。
問題:
       首先,我所理解的鏈表就是,有頭指針,鏈表的最後一個元素的後繼是空(NULL),這才能稱之爲鏈表。
       我遇到的算法上的問題就是,如何將一個鏈表上的值賦給另一個鏈表(傻瓜問題,但是有問題就得記錄),剛開始我是直接將鏈表賦值的(傻瓜操作,得改),知道錯了就改變方法。
       鏈表上的每一個元素都有數據域和指針域,每次賦值的時候得開闢一個鏈表元素類型(即結構體指針類型)的內存空間,然後將數據賦值給開闢好的內存空間的數據域,再將這個內存空間(即一個在磁盤上擁有自己的空間的結構體指針)以頭插法連到新的鏈表上,新的鏈表剛開始當然是一個空鏈表,但是作爲一個鏈表,必須要有一個鏈表該有的東西,即頭指針,而且其後繼要爲NULL,這是原則問題。

代碼如下:

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

//定義結構體
typedef struct Node
{
	int data;
	struct Node *next;
}Node;
typedef struct Node *LinkList;

//頭插法創建鏈表
void CreateListHead(LinkList *L,int n)
{
	LinkList p;
	int i;
	srand(time(0));
	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;
	for(i=0; i<n; i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand()%100+1;
		p->next = (*L)->next;
		(*L)->next=p;
	}
}

//單鏈表的逆轉
LinkList reverse(LinkList L)
{
	LinkList S=NULL;                       //定義頭指針
	S = (LinkList)malloc(sizeof(Node));    //這步必須有,這是尊嚴
	S->next=NULL;                          //一個空鏈表的尊嚴
	while(L->next)
	{
		LinkList p = (LinkList)malloc(sizeof(Node));
		p->data = L->next->data;
		p->next = S->next;
		S->next = p;
		L = L->next;
	}
	return S;
}

void main()
{
	LinkList L=NULL;          //定義頭指針
	LinkList S=NULL;          //定義頭指針
	CreateListHead(&L,5);     //創建鏈表
	//打印創建好的鏈表
	LinkList p=L->next;
	while(p)
	{
		printf("%d\t",p->data);
		p=p->next;
	}
	printf("\n");
	//逆轉單鏈表並且打印
	S = reverse(L);
	LinkList q=S->next;
	while(q)
	{
		printf("%d\t",q->data);
		q=q->next;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章