日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大话数据结构05: 双向链表

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话数据结构05: 双向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎要義

雙向鏈表的節點結構

雙向鏈表的插入

要先把插入位置的后繼節點重新綁定,否則容易丟失后繼節點

雙向鏈表的刪除

同樣是先綁定后繼節點

C++代碼

#include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#define MAXSIZE 20 /* 存儲空間初始分配量 */typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */ typedef int ElemType;/* ElemType類型根據實際情況而定,這里假設為int */Status visit(ElemType c) {printf("%d ", c);return OK; }typedef struct DulNode {ElemType data;struct DulNode* prior;//前驅struct DulNode* next; //后繼 }DulNode, *DuLinkList;Status InitList(DuLinkList* L) {*L = new DulNode();if (!(*L)) //存儲分配失敗return ERROR;//前驅 后繼都是自己(*L)->next = (*L);(*L)->prior = (*L); }//判斷鏈表是否為空 const Status ListEmpty(DuLinkList *L) {if ((*L)->next == (*L))return TRUE;return ERROR; }//將L重置為空表 Status ClearList(DuLinkList* L) {DuLinkList p;DuLinkList q;p = (*L)->next;while (p != (*L)){q = p->next;delete p;p = q;}(*L)->next = (*L);return OK; }//返回L中的元素個數 const int ListLength(DuLinkList* L) {int i = 0;DuLinkList p = (*L)->next;while (p != (*L)){i++;p = p->next;}return i; }// 用e返回L中第i個元素的值 Status GetElem(DuLinkList* L, int i, ElemType* e) {int j = 1;DuLinkList p;p = (*L)->next;while ((p != (*L)) && j < i){p = p->next;j++;}if ((p == (*L)) || j > i)return ERROR;*e = p->data;return OK;}// 尋找第 1個 與e滿足關系的數據元素的位置 int LocateElem(DuLinkList* L, ElemType e) {int i = 0;DuLinkList p = (*L)->next;while (p != (*L)){i++;if (p->data == e)return i;p = p->next;}return 0; //沒有這個元素 }//在第i個位置中插入新的數據元素 Status ListInsert(DuLinkList* L, int i, ElemType e) {DuLinkList N = new DulNode();N->data = e;int j = 1;DuLinkList p = *L;//要找到待插入節點的前驅while ((j < i) && (p->next != (*L))){p = p->next;j++;}//沒有這么長的鏈表if ((j < i) && (p == (*L)))return ERROR; // 沒有這么長的表//插入操作N->next = p->next;N->next->prior = N;N->prior = p;p->next = N; }//刪除L的第i個元素 并用e返回其值Status ListDelete(DuLinkList* L, int i, ElemType* e) {int j = 1;DuLinkList p = (*L);DuLinkList q;while ((p->next != (*L)) && (j < i)){p = p->next;j++;}if (p->next == (*L))return ERROR;*e = p->next->data; //取出將要刪除的元素的值//更新要刪除的元素的前驅元素的后繼,以及后繼元素的前驅q = p->next;p->next = p->next->next;p->next->prior = p;delete q;return OK; }//依次輸出L的每個數據元素const Status ListTraverse(DuLinkList* L) {DuLinkList p = (*L)->next;while (p != (*L)){visit(p->data);p = p->next;}printf("\n");return OK; }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(尾插法) void CreateListTail(DuLinkList* L, int n) {//生成1-10 數字并且存入到鏈表中DuLinkList p = *L;for (int i = 0; i < n; i++){DuLinkList N = new DulNode();N->data = i;p->next = N; //將新的數據加入到尾巴N->prior = p;p = p->next; //當前指針往后走一步p->next = *L; //表示當前鏈表結束} }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(頭插法) void CreateListHead(DuLinkList* L, int n) {//生成1-10 數字并且存入到鏈表中DuLinkList p = (*L)->next;for (int i = 0; i < n; i++){DulNode* N = new DulNode();N->data = i;N->next = p; //將第一個指針放到后面p->prior = N;(*L)->next = N; //新的第一個元素N->prior = (*L);p = N; //表頭指針} }//獲得元素e的前驅元素 const ElemType GetElemIPrior(DuLinkList* L, ElemType e) {int j = 1;DuLinkList p = (*L);while ((p->next != (*L))){if (p->next->data == e)return p->next->prior->data; //這一步操作只是驗證p = p->next;}return ERROR; }int main() {DuLinkList L = NULL;ElemType e;Status i;int j;int k;i = InitList(&L);printf("初始化后:ListLength(L) = %d \n", ListLength(&L));for (int j = 1; j <= 5; j++){int i = ListInsert(&L, 1, j);}printf("在L的表頭依次插入1~5后:ListLength(L) = %d \n", ListLength(&L));ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));i = ListEmpty(&L);printf("L是否空:i=%d(1:是 0:否)\n", i);i = ClearList(&L);printf("清空L后:ListLength(L)=%d\n", ListLength(&L));i = ListEmpty(&L);printf("L是否空:i=%d(1:是 0:否)\n", i);for (int j = 1; j <= 10; j++)ListInsert(&L, j, j);printf("在L的表尾依次插入1~10后:L.data=");ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));ListInsert(&L, 1, 0);printf("在L的表頭插入0后:L.data=");ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));GetElem(&L, 5, &e);printf("第5個元素的值為:%d\n", e);for (int j = 3; j <= 4; j++){k = LocateElem(&L, j);if (k)printf("第%d個元素的值為%d\n", k, j);elseprintf("沒有值為%d的元素\n", j);}for (int j = 3; j <= 4; j++){k = LocateElem(&L, j);if (k)printf("第%d個元素的值為%d\n", k, j);elseprintf("沒有值為%d的元素\n", j);}k = ListLength(&L); /* k為表長 */for (int j = k + 1; j >= k; j--){i = ListDelete(&L, j, &e); /* 刪除第j個數據 */if (i == ERROR)printf("刪除第%d個數據失敗\n", j);elseprintf("刪除第%d個的元素值為:%d\n", j, e);}printf("依次輸出L的元素:");ListTraverse(&L);j = 5;ListDelete(&L, j, &e); /* 刪除第5個數據 */printf("刪除第%d個的元素值為:%d\n", j, e);printf("依次輸出L的元素:");ListTraverse(&L);i = ClearList(&L);printf("\n清空L后:ListLength(L)=%d\n", ListLength(&L));CreateListHead(&L, 20);printf("整體創建L的元素(頭插法):");ListTraverse(&L);i = ClearList(&L);printf("\n刪除L后:ListLength(L)=%d\n", ListLength(&L));CreateListTail(&L, 20);printf("整體創建L的元素(尾插法):");ListTraverse(&L);ElemType ee = GetElemIPrior(&L, 5);printf("元素5的前驅是%d \n:", ee); }

總結

以上是生活随笔為你收集整理的大话数据结构05: 双向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。