大家好,我是考研的球球。今天我完成了雙向鏈表的學習及程序編寫,如果有錯誤,歡迎評論區指出,謝謝您的閱讀!!!您的點贊和關注是我最大的動力,謝謝大家!!!
附上我的幾篇博文,有關順序表和鏈表的:
總結一下雙向鏈表,就是鏈表的擴展,最大區別是每個節點加入了一個向前的指針prior,從而可以實現雙向訪問。 鏈表還可以進一步變成循環鏈表,這時判斷是否循環一圈的方法是首指針head是否等於當前節點指針。
代碼的每個函數都包含講解,在程序中。
- 結構體:
typedef struct DList { int data; struct DList *next; struct DList *prior; }DList;
-
運行截圖
-
代碼:
#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; }