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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

线性表的链式存储

發布時間:2023/12/19 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表的链式存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? 線性表的鏈式存儲。主要是單鏈表的相關知識,介紹了正序建立單鏈表、逆序建立單鏈表、單鏈表的插入、刪除、查找、輸出以及單鏈表的合并方法。單鏈表的合并前提是兩個都有序。具體知識點詳見代碼注釋。

1 /*** 2 線性表的鏈式存儲結構不能隨機存儲,整個鏈表的存取都必須從頭結點開始。但是沒有順序存儲的缺點:插入或者刪除時需要移動大量元素 3 其特點是用一組任意的存儲空間存儲線性表的數據元素 4 5 結點:數據域和指針域 6 */ 7 #include<stdio.h> 8 #include<stdlib.h> 9 #define MAX 100000 10 //**********************線性表的單鏈表存儲結構*********************** 11 typedef struct LNode 12 { 13 int data; //數據域 14 struct LNode *next; //指針域 15 } LNode,*LinkList; //LinkList是LNode型結構的指針 16 17 18 //**************************頭插法逆序建立單鏈表**************************** 19 void CreateList_L1(LinkList &L,int n) 20 { 21 //逆位序輸入n個元素值,建立帶有頭結點的單鏈表,時間復雜度為O(n) 22 L->next = NULL;//先建立個帶有頭結點的單鏈表L,使頭結點指針域為空, 23 for (int i = n; i > 0; --i) 24 { 25 LinkList p = (LinkList)malloc(sizeof(LNode));//生成新結點 26 scanf("%d",&p->data); 27 //插入到表頭 28 p->next = L->next; 29 L->next = p; 30 } 31 32 } 33 34 //**************************尾插法正序建立單鏈表**************************** 35 void CreateList_L2(LinkList &L,int n) 36 { 37 //借助一個中間變量,正序建立n個元素的單鏈表,時間復雜度仍然為O(n) 38 //先建立個帶有頭結點的單鏈表L,頭結點指針域為空,默認使用Linklist建立L是即為空 39 LinkList r = L; 40 for (int i = 0; i < n; ++i) 41 { 42 LinkList p = (LinkList)malloc(sizeof(LNode));//生成新結點 43 scanf("%d",&p->data); 44 //插入到表尾 45 r->next = p; 46 r = p; 47 } 48 r->next = NULL; 49 } 50 51 //**************************按序輸出單鏈表的各個元素**************************** 52 void PrintList_L(LinkList L) 53 { 54 LinkList p = L->next;//p指向第一個元素 55 while(p) 56 { 57 printf("%d ", p->data); 58 p = p->next; 59 } 60 } 61 62 //***********************取出指定位序的單鏈表中的數據元素*********************** 63 int GetElem_L(LinkList L,int i) 64 { 65 //時間復雜度為O(n) 66 //L為帶頭結點的單鏈表的頭指針 67 //返回鏈表的第i個元素,若沒有,則錯誤提示 68 LNode *p = L->next; //初始化,p指向第一個結點 69 int j = 1;//計數器 70 int e;//返回值 71 while(p && j<i) 72 { 73 //順指針向后查找,知道p指向第i個元素或者p為空 74 p = p->next; 75 ++j; 76 } 77 if (!p || j>i) 78 { 79 printf("沒有找到該元素,請確認后重新輸入位序!\n"); 80 e = MAX; 81 return e; 82 } 83 e = p->data; 84 return e; 85 } 86 87 88 //*******************向單鏈表的指定位序插入一個元素******************** 89 void ListInsert_L(LinkList &L,int i,int e) 90 { 91 //在帶頭結點的單鏈表L的第i個位置之前插入元素e,1=<i<=length(L)+1,時間復雜度為O(n) 92 /* 93 LNode *p = L->next; //初始化,p指向第一個結點,下面一句話效果一樣,因為LinkList是指向LNode型的指針變量,無需再加*號 94 LinkList p = L->next; 95 int j = 1;//計數器 96 */ 97 //上面使p指向第一個結點的方法有問題,如果要將元素插在第一位會有bug,故要從頭結點開始 98 LinkList p = L; 99 int j = 0; 100 while(p && j<i-1) 101 { 102 p = p->next; //尋找第i-1個結點,使p指向它 103 ++j; 104 } 105 if (!p || j>i-1) 106 { 107 printf("要插入的位置沒有找到,可能是插入位序有誤!\n"); 108 getchar(); 109 exit(1); 110 } 111 LinkList s = (LinkList)malloc(sizeof(LNode));//生成一個結點s 112 s->data = e; 113 //插入結點 114 s->next = p->next; 115 p->next = s; 116 } 117 118 //********************刪除單鏈表的指定位序的一個元素******************** 119 void ListDelete_L(LinkList &L,int i) 120 { 121 //時間復雜度為O(n) 122 //在帶頭結點的單鏈表L中,刪除第i個位置的元素.i<=length(L) 123 LNode *p = L; //初始化,p指向頭結點 124 int j = 0;//計數器 125 while(p->next && j<i-1) 126 { 127 p = p->next; //使p指向被刪除結點的前一個結點,即p指向i-1 128 ++j; 129 } 130 if (!(p->next) || j>i-1) 131 { 132 //要保證p的后一個元素有值,即被刪除元素存在 133 printf("刪除位置不合理,請重新確認!\n"); 134 getchar(); 135 exit(1); 136 } 137 //刪除該元素 138 LNode *q = p->next; 139 p->next = q->next; 140 free(q);//釋放結點 141 } 142 143 //**************************有序鏈表的合并****************************** 144 void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) 145 { 146 //已知單鏈線性表La和Lb的元素按值非遞減排序 147 //歸并La和Lb得到新的單鏈表Lc,Lc的元素也按值非遞減排列 148 LinkList pa,pb,pc; 149 pa = La->next; 150 pb = Lb->next; 151 //用La的頭結點作為Lc的頭結點 152 pc = La; 153 Lc = pc; 154 while(pa && pb) 155 { 156 if (pa->data <= pb->data) 157 { 158 pc->next = pa; 159 pc = pa; 160 pa = pa->next; 161 } 162 else 163 { 164 pc->next = pb; 165 pc = pb; 166 pb = pb->next; 167 } 168 } 169 pc->next = pa?pa:pb; 170 free(Lb);//釋放Lb的頭結點 171 } 172 173 int main() 174 { 175 //定義3個鏈表,初始化3個頭結點 176 LinkList la = (LinkList)malloc(sizeof(LNode)); 177 LinkList lb = (LinkList)malloc(sizeof(LNode)); 178 LinkList lc;// 179 int count;//計數使用,鏈表初始化時記錄鏈表元素個數 180 int location,value;//插入時的位置和值 181 char c; 182 //使用頭插法逆序建立鏈表 183 printf("請輸入la鏈表元素個數:"); 184 scanf("%d",&count); 185 CreateList_L1(la,count); 186 printf("逆序建立的la鏈表元素為:"); 187 PrintList_L(la); 188 189 //使用尾插法正序建立鏈表 190 printf("\n\n請輸入鏈表lb元素個數:"); 191 scanf("%d",&count); 192 CreateList_L2(lb,count); 193 printf("正序建立的lb鏈表元素為:"); 194 PrintList_L(lb); 195 196 //向正序建立的單鏈表中插入數據 197 printf("\n\n請輸入lb插入位置和插入值:"); 198 scanf("%d%d",&location,&value); 199 ListInsert_L(lb,location,value); 200 printf("插入元素之后的鏈表元素為:"); 201 PrintList_L(lb); 202 203 //繼續測試該鏈表的刪除效果 204 printf("\n\n請輸入lb刪除位置:"); 205 scanf("%d",&location); 206 ListDelete_L(lb,location); 207 printf("刪除元素之后的鏈表元素為:"); 208 PrintList_L(lb); 209 210 //測試GetElem函數是否有效 211 printf("\n\n請輸入需要得到的元素位置:"); 212 scanf("%d",&location); 213 value = GetElem_L(lb,location); 214 if (value == MAX) 215 { 216 printf("輸入錯誤或者沒有該位置的元素!\n"); 217 }else 218 { 219 printf("該元素的值為:%d",value); 220 } 221 222 //測試兩個鏈表的歸并,前提是兩個鏈表都有序 223 MergeList_L(la,lb,lc); 224 printf("\n\n兩個鏈表合并后lc的元素是:"); 225 PrintList_L(lc); 226 227 return 0; 228 }

?

轉載于:https://www.cnblogs.com/wujiyang/p/4335237.html

總結

以上是生活随笔為你收集整理的线性表的链式存储的全部內容,希望文章能夠幫你解決所遇到的問題。

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