下载麻将游戏免费|手机麻将游戏

c語言雙向鏈表的基本操作_c語言用遞歸圖書管理順序系統_約瑟夫環 c語言 鏈表

飛來科技  發布時間:2019-08-22 15:05:34

本文關鍵詞:c語言雙向鏈表的基本操作

約瑟夫環 c語言 鏈表_c語言雙向鏈表的基本操作_c語言用鏈表圖書管理排序系統

筆者作為一名C語言的初學者,在剛接觸鏈表時,幾乎找不到教程能用很通俗易懂的語言去講解鏈表。大多數時候找到的關于鏈表的教程,或許是生硬的塞給讀者一大段代碼,或許是使用了一些過分的語法,對于萌新比較地不友好。這就是我寫這篇教程的理由。

好吧,即使這篇教程會相對簡潔,但是在閱讀之前,讀者還是應該首先簡單認識結構體部分和指針部分的內容。

c語言雙向鏈表的基本操作,那我們就開始吧。

首先通俗地解釋一下:鏈表是一種特殊的結構體,創建數組只應該上面很多代碼:

struct node
{
	int num;
	struct node *next;
};

到此為止,你就成功建立了一個鏈表。

我們來具體預測一下:首先我們使用了建立結構體的標準格式,創建了一個struct node,

struct node有兩個成員(int, struct node),在這個結構中,int類型比較的平淡無奇,而struct node本來是我們定義的結構體,但是在結構體里面的成員里再次出現(這時好多教程都會告訴你這是C語言里先使用后定義的特例云云,但我們不管),并且定義了一個指針變量,根據我們對指針的了解,某一類型的指針指向相同類別的數據(void是空指針,int型指針指向整型變量,char型指針指向字符型變量),那么struct node型指針就指向struct node型結構,我們先看一個圖了解一下:

約瑟夫環 c語言 鏈表_c語言雙向鏈表的基本操作_c語言用鏈表圖書管理排序系統

那么這個特殊的指針是怎么運作呢?

這個特殊的指針,指向另一個結構,而這個結構相同擁有一個指向其他構架的指針,就組成了這樣一個關系:

循環下去,就會造成一條“鏈”,鏈表分為單向鏈表,雙向鏈表以及循環鏈表,大家可以自行去了解不同種類的泛型,這里我們以單向遞歸為實例,分析一下對數組的操作。(請先行了解malloc函數的作用,它是必不可少的)

#include <stdio.h>
#include <stdlib.h>
struct node
{
	int num;
	struct node *next;
};
int main()
{
	struct node *head;    //聲明表頭head(鏈表開始的位置)
	head=NULL; 		//建一個空表
	struct node *p1,*p2;
	int i=1;
	//利用malloc()申請分配節點(也就是一個地址)
	p1=p2=(struct node*)malloc(sizeof(struct node));		//新節點
	printf("請輸入值,值小于等于0結束,值存放地址為:p1_ADDR= %d\n",p1); 
    scanf("%d",&p1->num);
    p1->no=i;
    p1->next=NULL;
    while(p1->num>0)  		//輸入的節點數值大于0
	{
		if(head==NULL)
			head=p1;  		//空表,接入表頭
		else
			p2->next=p1;  	//非空表,接到表尾
		p2=p1;
		
		p1=(struct node*)malloc(sizeof(struct node));		//下一個新節點
		i=i+1; 
   		printf("請輸入值,值小于等于0結束,值存放地址為:p%d_ADDR= %d\n",i,p2); 
   		scanf("%d",&p1->num);//輸入節點的值
   		p1->no=i;
   		//判斷一下是否有后續節點要接入鏈表,若無則結束;  
	}
	free(p1);		 //申請到的沒錄入,所以釋放掉  
 	p1=NULL;  	//使指向空  
  	p2->next = NULL; 	//到表尾了,指向空  
  	printf("鏈表輸入結束(END)\n");
	getchar();
    return 0;
}

這段程序執行完畢后,我們得到了數組表頭head,但是其余空間都是系統分配的,我們并不能直接找到對應的數組。但是這就是單向遞歸的神奇之處,只要明白表頭,就可以一步一步摸到表尾。不過在此之前,我們要先理清思路。

首先,head->next代表什么?

它既是首個結構的一個成員,也是第二個結構的地址。

那么,head->next->next又是什么呢?

約瑟夫環 c語言 鏈表_c語言用鏈表圖書管理排序系統_c語言雙向鏈表的基本操作

它既是第二個結構的一個成員,也是第三個結構的地址。

所以,我們可以在代表結束的getchar();語句之前插入printf(“%d”,head->next->next->num);試一試,你會看到,如果你的節點達到了三個或更多的話,這條詞語能否準確地輸出第三個結構里num的值。

現在想一想,怎么將剛剛構建的雙向鏈表所有的結點反向?

反向也就是將所有結構中的指針成員從指向下一個結構改為指向上一個結構。

想好了嗎?我們起初了哦。

我們首先從表頭開始操作,創建三個struct node型指針x1,x2,temp作為暫存器(為什么是三個呢?想想我們在學習交換a,b兩個變量的值時,是c=a;a=b;b=c;這個樣子的)。

2、刪除后head指向第2個節點,就是讓head=head->next,ok這樣就行了。p1->next->next->next就指向q的后繼節點,我們用p2保存。//設置兩個快慢指針,slow指向head,fast指向head.next。

然后把x1放一邊兒涼快去。

再保存第二個結構的地址 x2=head->next;

c語言雙向鏈表的基本操作_約瑟夫環 c語言 鏈表_c語言用鏈表圖書管理排序系統

之后讓第二個結構里的成員next指向首個結構 head->next=head;

再之后令表頭指向空 head=NULL;

第一步反向就完成了,那么接下來再完成第二步。

還記得我們之前使用的x1和x2嗎?馬上能夠派上用場了。

因為head指向了NULL,故head已經不復存在,但我們還有temp。

先把x1的值留住 temp=x1;

而x1再往后移動一次x1=x1->next; //這里將x1->next看作下一結構

此時x1就又可以放在一邊兒涼快了。(x1:”嚶嚶嚶”)

我們的目的是讓第三個結構里的指針成員指向第二個結構,找找我們在第一步里做了什么。

c語言雙向鏈表的基本操作_c語言用鏈表圖書管理排序系統_約瑟夫環 c語言 鏈表

第二個結構的地址被保存在x2中,第三個結構的地址被保存在了temp中

temp->next=x2; //這里將temp->next看作成員

這樣就又完成了一次逆向,不過還沒結束這一步,因為這是循環操作,要維持語句一致性。

所以我們需要將x2向后移動一次x2=temp;

后面每一步的操作,都和第二步類似,但是,循環結束是什么之后呢?

由于x1每次也是單純后移,幾乎沒有操作,那么c語言雙向鏈表的基本操作,后移以后的x1里的next是不是空指針(NULL)就成了關鍵。

if(x1->next==NULL)
{
	temp->next=x2;
	x1->next=temp;
	head=x1;
	break;
}

此時,表頭地址再次存入了head,不過單向遞歸已經反向(這個教程是有陷阱的,如果鏈表比較短,在x1=head->next->next;時還會崩潰,想想怎么解決吧)。

現在,您已經可以去閱讀其他的教程,更加具體地探究鏈表。

2、托福詞匯精品課程平臺:托福詞匯頂級創意名師講解托福詞匯,從背單詞的方法講起,涉及托福詞匯考試規定,根據托福考試的特征,從不同的層面學習把握托福考試詞匯。閱讀文檔 免費 - 上傳時間:2010年7月11日《重生之艷帝修真》作品相關讀者請看觀眾給我提了看法我很感激在這里做一下說明。在講解語法的之后,請學生寫出某些熟語的同義詞或近義詞,或讓學生造句,學生所寫出的詞組或造的語句教師隨時在黑板上歸類小結,及時加以講解、表揚和糾錯。

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

    相關閱讀
    下载麻将游戏免费 欢乐炸金花官方下载 大乐透胆拖兑奖表 天下彩票 室内游玩 118开奖记录历史 中国竟彩网 360老时时彩走势图 开元棋牌怎样赢 六码中特什么意思 体彩排列三万能四码