国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言實現數據結構和雙向鏈表操作

2020-01-26 14:13:23
字體:
來源:轉載
供稿:網友

數據結構  雙向鏈表的實現

雙向鏈表中的每一個結點都含有兩個指針域,一個指針域存放其后繼結點的存儲地址,另一個指針域則存放其前驅結點的存儲地址。

雙向鏈表結點的類型描述:

//雙向鏈表的類型描述 typedef int ElemType; typedef struct node{  ElemType data;  struct node *prior,*next; }DuLNode,*DuLinkList; 
  

 其中,prior域存放的是其前驅結點的存儲地址,next域存放的是其后繼結點的存儲地址。

雙向鏈表有兩個特點:

一是可以從兩個方向搜索某個結點,這使得鏈表的某些操作(如插入和刪除)變得比較簡單; 二是無論利用前鏈還是后鏈都可以遍歷整個雙向鏈表。

        雙向鏈表的操作基本和單鏈表的操作相同;

        1. 頭插法創建帶頭結點的雙向鏈表Create_DLinkListF(int n)

//頭插法創建帶頭結點的雙向鏈表 DuLinkList Create_DLinkListF(int n){  DuLinkList L,p;  int i = n - 1;  ElemType x;  //新建頭結點  L = (DuLinkList)malloc(sizeof(DuLNode));  L->prior = NULL;  L->next = NULL;   //添加第一個結點  scanf("%d",&x);  p = (DuLinkList)malloc(sizeof(DuLNode));  p->data = x;  L->next = p;  p->prior = L;  p->next = NULL;   //加入其他結點  while(i > 0){  scanf("%d",&x);  p = (DuLinkList)malloc(sizeof(DuLNode));  p->data = x;   p->next = L->next;  L->next->prior = p;  p->prior = L;  L->next = p;   i--;  }  return L; } 

         2. 尾插法創建帶頭結點的雙向鏈表Create_DLinkListR(int n)

//尾插法創建帶頭結點的雙向鏈表 DuLinkList Create_DLinkListR(int n){  DuLinkList L,p,lastNode;  int i = n - 1;  ElemType x;  //新建頭結點  L = (DuLinkList)malloc(sizeof(DuLNode));  L->prior = NULL;  L->next = NULL;   //添加第一個結點  scanf("%d",&x);  p = (DuLinkList)malloc(sizeof(DuLNode));  p->data = x;  L->next = p;  p->prior = L;  p->next = NULL;   lastNode = p;  //加入其他結點  while(i > 0){  scanf("%d",&x);  p = (DuLinkList)malloc(sizeof(DuLNode));  p->data = x;   lastNode->next = p;  p->prior = lastNode;  p->next = NULL;   lastNode = p;  i--;   }  return L;  } 
    

3. 在指定結點之前插入新結點Insert_DLinkListBefore(DuLinkList p,ElemType x)

//在指定結點之前插入新結點 void Insert_DLinkListBefore(DuLinkList p,ElemType x){  DuLinkList newNode;  //判斷結點p之前的結點的合法性:  if(p->prior == NULL)  printf("結點不合法,不能在該結點之前插入結點/n");  else{  newNode = (DuLinkList)malloc(sizeof(DuLNode));  newNode->data = x;   newNode->next = p;  p->prior->next = newNode;  newNode->prior = p->prior;  p->prior = newNode;  } } 

4. 在指定結點之后插入新結點Insert_DLinkListAfter(DuLinkList p,ElemType x)

//在指定結點之后插入新結點 void Insert_DLinkListAfter(DuLinkList p,ElemType x){   DuLinkList newNode;  newNode = (DuLinkList)malloc(sizeof(DuLNode));  newNode->data = x;   //當插入位置是最后一個結點之后時  if(p->next == NULL){  p->next = newNode;  newNode->prior = p;  newNode->next = NULL;  }  else{  newNode->next = p->next;  p->next->prior = newNode;  p->next = newNode;  newNode->prior = p;  } } 

5. 刪除指定結點Delete_DLinkList(DuLinkList p)

//刪除指定結點 void Delete_DLinkList(DuLinkList p){  //如果刪除的是最后一個元素  if(p->next == NULL)  p->prior->next = NULL;   else{  p->prior->next = p->next;  p->next->prior = p->prior;   }  free(p); } 

6. 后鏈輸出雙向鏈表Print_DLinkListN(DuLinkList L)

//后鏈輸出雙向鏈表 void Print_DLinkListN(DuLinkList p){   while(p != NULL){  printf("%d/t",p->data);  p = p->next;  }  printf("/n");  } 

  7.前鏈輸出雙向鏈表Print_DLinkListP(DuLinkList p)

//前鏈輸出雙向鏈表 void Print_DLinkListP(DuLinkList p){   while(p != NULL){  printf("%d/t",p->data);  p = p-prior;  }  printf("/n"); }  

至于雙向鏈表的其他操作,如定位,和單鏈表的操作類同,不再贅述。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 祥云县| 博白县| 宁城县| 芮城县| 吉安市| 武夷山市| 嘉义县| 花垣县| 宁化县| 太康县| 当雄县| 永仁县| 铜山县| 泰安市| 禄丰县| 息烽县| 灌南县| 长兴县| 盐城市| 刚察县| 清原| 会泽县| 新野县| 和龙市| 昭通市| 喀喇沁旗| 南投市| 开江县| 定远县| 汪清县| 宜宾县| 剑阁县| 鄯善县| 乐都县| 蒲城县| 永和县| 黄陵县| 交城县| 将乐县| 益阳市| 栾城县|