線性表之雙向鏈表 (建立和基本)

大家好,我是考研的球球。今天我完成了雙向鏈表的學習及程序編寫,如果有錯誤,歡迎評論區指出,謝謝您的閱讀!!!您的點贊和關注是我最大的動力,謝謝大家!!!


附上我的幾篇博文,有關順序表和鏈表的:

  1. 線性表之順序表(引用實現) Cpp數據結構
  2. 單鏈表(線性鏈表)的建立與基礎

 

 


總結一下雙向鏈表,就是鏈表的擴展,最大區別是每個節點加入了一個向前的指針prior,從而可以實現雙向訪問。   鏈表還可以進一步變成循環鏈表,這時判斷是否循環一圈的方法是首指針head是否等於當前節點指針。

 代碼的每個函數都包含講解,在程序中。

  1. 結構體:
    typedef struct DList
    {
    	int data;
    	struct DList *next;
    	struct DList *prior;
    }DList;

     

  2. 運行截圖

  3. 代碼:

    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    typedef struct DList
    {
    	int data;
    	struct DList *next;
    	struct DList *prior;
    }DList;
    
    void creatDlist(DList *&L);
    void findNode(DList *L);
    void insertNode(DList *&L);
    void deleteNode(DList *&L);
    void Print(DList *L);
    int Len(DList *L);
    
    void creatDlist(DList *&L)   //創建雙向鏈表 
    {
    	int x;
    	int a[100];
    	printf("請輸入初始數據數量:");
    	scanf("%d",&x);
    
    	DList *s,*r;
    	L->next=NULL;
    	L->prior=NULL;
    	r=L;
    	r->prior=NULL;
    	for(int i=0;i<x;i++)
    	{
    		s=(DList *)malloc(sizeof(DList));
    		scanf("%d",&s->data);
    		//將 s 插入 r 的尾部 
    		r->next=s;
    		s->next=NULL;
    		r=r->next; 
    	}
    	r->next=NULL;
    	
    }
    void findNode(DList *L)  //找到某個值的節點 
    {
    	DList *s=L->next;//首指針 L 裏面不存放data 
    	int  yy=0;
    	printf("輸入你想找的數:");
    	scanf("%d",&yy); 
    	while((s!=NULL)&&(s->data!=yy))//找不到就一直循環 
    	{
    		s=s->next;
    	}
    	if(s==NULL)
    	{
    		printf("雙鏈表裏面沒有該數據!!\n");
    	 } 
    	else
    	{
    		printf("鏈表裏有該數據!!\n");
    	}
    }
    //在第n個位置插入 
    void insertNode(DList *&L)
    {
    	int n=0;
    	int len=Len(L);
    	printf("請輸入插入數據位置(正整數):");
    	scanf("%d",&n);
    	while(n>len)
    	{
    		printf("數字過大!!!\n重新輸入位置:");
    		scanf("%d",&n); 
    	}
    	DList *s=L;
    	if(s->next==NULL)
    	{
    		printf("鏈表爲空!\n");
    		return;
    	}
    	for(int i=1;i<n;i++)
    	{
    		s=s->next;
    	}
    	DList *r=(DList *)malloc(sizeof(DList));
    	printf("請輸入插入的數:");
    	scanf("%d",&r->data);
    	//一下4行插入 數據節點 
    	r->next=s->next;
    	r->next->prior=r;
    	r->prior=s;
    	s->next=r;
    	
    }
    // 刪除第 n 個位置的節點 
    void deleteNode(DList *&L)
    {
    	int n,len;
    	DList *r,*s=L; 
    	len=Len(L);
    	printf("請輸入刪除的位置(正整數):");
    	scanf("%d",&n);
    	 
    	while(n>len)
    	{
    		printf("數字過大!!!\n重新輸入位置:");
    		scanf("%d",&n); 
    	}
    	for(int i=1;i<n;i++)
    	{
    		s=s->next;
    	}
    	//一下爲刪除語句 
    	r=s->next->next;
    	free(s->next);
    	s->next=r;
    	if(r!=NULL)//當刪除位置是最後一個  if就不執行了 
    	{
    		
    		r->prior=s;
    	}
    }
    void Print(DList *L)//輸出鏈表所有內容 
    {
    	DList *r=L->next;
    	while(r!=NULL)
    	{
    		printf("%d ",r->data);
    		r=r->next;
    	}
    	printf("\n");
    }
    int Len(DList *L)  //確定鏈表長度 
    {
    	int sum=0;
    	DList *r;
    	r=L->next;
    	while(r!=NULL)
    	{
    		sum++;
    		r=r->next;
    	}
    	return sum;
    	
    }
    int main()
    {
    	DList *L=(DList*)malloc(sizeof(DList));
    	creatDlist(L);
    	printf("輸出所有節點:");
    	Print(L);
    	insertNode(L);
    	printf("輸出插入後的鏈表:");
    	Print(L);
    	deleteNode(L);
    	printf("輸出刪除後的鏈表:");
    	Print(L);
    	findNode(L); 
    	int sum=Len(L);
    	printf("鏈表長度爲:%d",sum);
    	return 0;
    }

     

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